Community-Solar Member Portal
A full-stack member portal I built on my own, from a custom ERP backend to a modern React front end.
- Client
- Community-solar cooperative · US
- Role
- Sole developer & owner
- Year
- 2025
- Stack
- Next.js 15, React 19, TypeScript
Context
A community-solar cooperative needed a portal where members could sign up, connect their utility accounts, manage billing and payments, pick a discount tier, and download invoices.
I owned all of it: the architecture, the front end, the backend, the integrations, and the deployment, from the first commit to production.
The problem
The portal had to sit on top of a real ERP for accounting and member records, pull live billing data from external utility providers, and take payments, all behind a member experience that stays simple and approachable.
Sensitive keys and sessions could never touch the browser, and the payment and onboarding flows had to be reliable enough to run unattended.
Approach
The front end is Next.js 15 and React 19 (TypeScript, React Query, Tailwind, Storybook) on AWS Amplify. The backend is a custom Odoo 18 and Python module that exposes a REST API.
Next.js API routes sit between the browser and the backend as a proxy, so provider keys and session cookies never leave the server.
I integrated a utility-data provider through a webhook pipeline that keeps members' bills and meter readings in sync, and built Google sign-in, email and OTP two-factor auth, and a multi-step onboarding flow.
Key decisions
Route every backend call through server-side API routes instead of calling the ERP from the browser. That keeps secrets safe and puts session handling in one place.
Handle Stripe properly: card and ACH tokenization with SetupIntents, saved-card payments, and an auto-pay cron for recurring invoices.
Let provider webhooks drive bill and meter data, so the portal reflects real utility data without anyone syncing by hand.
Outcome
A production member portal covering signup, utility connection, billing, payments, and onboarding, built and shipped by one engineer, with full handoff documentation so anyone can pick it up later.
Built with