Fly.io Review Server - COMPLETE
Date Completed: Feb 3, 2026
Branch: feature/fly-review-server
Status: DEPLOYED AND LIVE
The Fly.io review server is fully operational and integrated with Zapier/Lawmatics.
Architecture
Lawmatics Form Submission
↓
Zapier Trigger: "Filled Out a Form"
- Form: form-generate-a-request-for-a-review
- Captures: matterId, firstName, lastName, email, phone, requestType
↓
Zapier Action: Webhooks POST to Fly.io
- URL: https://sempers-review-server.fly.dev/trigger
- Payload: JSON with secret + form fields
↓
Fly Server handles everything:
1. Generate feedback token (HMAC-SHA256, 7-day expiry)
2. Shorten URL via is.gd
3. Update Lawmatics Matter with feedback URL
4. Log to Google Sheets (feedback-links-log)
5. Create Gmail draft immediately (user can review/edit)
6. Schedule draft send (10-minute delay)
7. Schedule follow-up check (5-day delay)
Email Flow
- Trigger fires → Gmail draft created immediately (visible in Drafts folder)
- 10-minute window → User can review/edit/delete the draft
- After 10 minutes → Draft auto-sends (skips if deleted by user)
- After 5 days → Follow-up email sent if no review received
Infrastructure
| Component | Details |
|---|---|
| Server | Fly.io app: sempers-review-server |
| URL | https://sempers-review-server.fly.dev |
| Region | LAX (Los Angeles) |
| Database | SQLite on Fly volume (/data/review-server.db) |
| Cost | ~$3-6/month |
Secrets (set via fly secrets)
WEBHOOK_SECRET- Validates incoming Zapier requestsGOOGLE_SERVICE_ACCOUNT- JSON credentials for Gmail/Sheets APIGOOGLE_IMPERSONATE_EMAIL- z@sempers.netGOOGLE_SHEETS_ID- Spreadsheet ID for loggingLAWMATICS_API_KEY- For Matter updatesFEEDBACK_SECRET- For token signing
Key Files
| File | Purpose |
|---|---|
review-server/src/routes/trigger.js |
Main webhook endpoint |
review-server/src/services/gmail.js |
Draft creation and sending |
review-server/src/services/sheets.js |
Google Sheets logging |
review-server/src/jobs/sendDraft.js |
Scheduled draft sending |
review-server/src/jobs/followUp.js |
5-day follow-up logic |
Google Workspace Setup
- Service Account: review-server@sempers-review-server.iam.gserviceaccount.com
- Client ID: 114372108998798383304
- Domain-wide Delegation Scopes:
https://www.googleapis.com/auth/gmail.sendhttps://www.googleapis.com/auth/gmail.composehttps://www.googleapis.com/auth/spreadsheets
Zapier Zap
- Name: Lawmatics → Generate Review Link → Lawmatics
- Trigger: Lawmatics “Filled Out a Form” (form-generate-a-request-for-a-review)
- Action: Webhooks by Zapier POST to https://sempers-review-server.fly.dev/trigger
- Status: Published
Maintenance
View logs:
fly logs --app sempers-review-server
Deploy updates:
cd review-server && fly deploy
Check health:
curl https://sempers-review-server.fly.dev/health
Previous Approaches (Deprecated)
update-reviewsbranch - Pure Zapier approach (abandoned due to complexity)feature/review-request-automation- Earlier iteration (superseded)