Platform Overview
Multi-tenant backend API serving all Reformer client websites
System Architecture
┌─────────────────────────────────────────────┐
│ Client Websites (Webflow + Memberstack) │
│ - Member signups │
│ - Form submissions │
│ - Payment processing │
└─────────────────┬───────────────────────────┘
│ Webhooks
↓
┌─────────────────────────────────────────────┐
│ Reformer Platform API (Render) │
│ https://reformer-platform.onrender.com │
│ │
│ ├─ Webhook receivers │
│ ├─ Service integrations │
│ ├─ Activity logging │
│ └─ API endpoints │
└─────────────────┬───────────────────────────┘
│ Reads/Writes
↓
┌─────────────────────────────────────────────┐
│ Database (PostgreSQL) │
│ - accounts, members, integrations │
│ - activity_log, support_tickets │
└─────────────────┬───────────────────────────┘
│ Syncs to
↓
┌─────────────────────────────────────────────┐
│ Third-Party Services │
│ ├─ Close CRM (sales pipeline) │
│ ├─ Dropbox (file storage) │
│ ├─ ClickUp (task management) │
│ ├─ Slack (team notifications) │
│ └─ Pirsch (analytics) │
└─────────────────────────────────────────────┘
Key Components
1. Backend API
- Framework: Express.js
- Hosting: Render.com
- URL: reformer-platform.onrender.com
- Features:
- Webhook receivers for all integrations
- REST API endpoints
- Activity logging
- Multi-tenant data isolation
2. Database
⚠️ Current Issue: Using two databases (Render PostgreSQL + Supabase). Should consolidate to Supabase only.
- Type: PostgreSQL
- Current: Render PostgreSQL (dpg-d3hi5lbuibrs73aul0cg-a)
- Should be: Supabase
- Schema:
accounts- Client businessesmembers- End usersintegrations- API keys per accountactivity_log- Audit trailsupport_tickets- Customer support
3. Service Integrations
| Service | Purpose | Status |
|---|---|---|
| Memberstack | Authentication & billing | Working |
| Close CRM | Sales pipeline & customer data | Working |
| Dropbox | File storage per member | Working |
| ClickUp | Task & project management | Working |
| Slack | Team notifications | Working |
| PageSpeed | Performance monitoring | Working |
| Pirsch | Analytics tracking | Tracking only |
| Webflow | Form submissions | Working |
Data Flow Example
Member Signup Flow
1. User submits signup form on client website
↓
2. Memberstack creates member
↓
3. Memberstack sends webhook to Reformer Platform
POST https://reformer-platform.onrender.com/webhooks/memberstack/{secret}
↓
4. Reformer Platform:
- Finds account by webhook secret
- Creates member record in database
- Logs to activity_log
↓
5. Triggers integrations (parallel):
- Sync to Close CRM
- Create Dropbox folder
- Send Slack notification
- Create ClickUp onboarding task
- Track signup event in Pirsch
↓
6. Returns success to Memberstack
Multi-Tenant Design
Each client gets:
- Isolated data - Can only see their own members
- Unique webhook secrets - Identifies which account the webhook belongs to
- Per-account integrations - Each client can have different services enabled
- Activity logging - Complete audit trail per account
How It Works
Webhook URL format:
https://reformer-platform.onrender.com/webhooks/{service}/{secret}
Example:
Client A: /webhooks/memberstack/client_a_secret_123
Client B: /webhooks/memberstack/client_b_secret_456
Server looks up account by secret:
SELECT * FROM integrations
WHERE webhook_secret = 'client_a_secret_123'
AND service = 'memberstack'
Returns account_id → all operations scoped to that account
Tech Stack
| Layer | Technology |
|---|---|
| Backend | Node.js + Express.js |
| Database | PostgreSQL (should be Supabase) |
| Hosting | Render.com |
| Frontend | React + Vite + Tailwind |
| Client Sites | Webflow + Memberstack |
Deployment
Automatic deployment via GitHub:
git push origin main
↓
Render detects push
↓
Runs: npm install
Runs: npm start
↓
Live in ~2 minutes