Skip to content

Troubleshooting

Diagnosis and recovery guide organized by subsystem. Start with the failing area, check the common causes, and apply the fix.

Event resolution

SymptomCauseFix
Event not loading on subdomainMissing domain entryAdd hostname to platform_event_domains table
Wrong event loadingDuplicate hostnameCheck platform_event_domains for conflicts
Event works locally but not in productionDNS not propagatedWait for DNS propagation; verify CNAME/A records
503 "Event is temporarily unavailable"Event is suspendedChange event status in platform UI
503 "Event is in read-only mode"Post-event or archived modeChange event mode in admin settings or platform UI

Key files: hooks.server.ts, resolve-event.ts

Authentication

SymptomCauseFix
No OTP email receivedMailgun misconfiguredVerify MAILGUN_API_KEY and MAILGUN_DOMAIN
No OTP email receivedEmail not in allowed listAdd email to allowed list or approve access request
No OTP email receivedSpam filterCheck spam/junk folder
OTP code invalidCode expired (10 min TTL)Request a new code
OTP code invalidToo many attempts (max 3)Request a new code
OTP rate limitedToo many generations (5 per 10 min)Wait 10 minutes
Session lost after server restartIn-memory KV (Node runtime)Expected behavior locally; re-authenticate
Logged out unexpectedlySession generation incrementedRe-authenticate; someone called invalidateUserSessions

Key files: auth.ts, hooks.server.ts

Admin access

SymptomCauseFix
Redirected from /adminNot signed inSign in at /auth
Redirected from /adminEmail not in admin listAdd email to adminEmails in settings
Admin sees empty dataWrong event resolvedVerify hostname matches correct event
Platform /platform access deniedNot an operatorAdd email to PLATFORM_OPERATOR_EMAILS or platform_users

Key files: hooks.server.ts, settings.ts, platform/auth.ts

Payments

SymptomCauseFix
Checkout doesn't openStripe key missing or invalidVerify STRIPE_SECRET_KEY
Payment shows pending after completionWebhook not deliveredCheck Stripe webhook delivery dashboard
Webhook returns 400Wrong signing secretVerify STRIPE_WEBHOOK_SECRET matches endpoint
Wrong payment totalTier multiplier incorrectCheck pricing tier multipliers and explicit tier prices
Wrong payment totalAdd-on amount wrongCheck add-on amountCents value
Refund failsPayment intent in wrong stateCheck Stripe dashboard for payment intent status
PayPal not workingMissing PayPal credentialsSet paypalClientId, paypalClientSecret in settings

Key files: api/stripe/checkout, api/stripe/webhook, stripe.ts

Email

SymptomCauseFix
No emails sendingMailgun credentials wrongVerify MAILGUN_API_KEY and MAILGUN_DOMAIN
Emails going to spamSPF/DKIM not configuredSet up SPF and DKIM records for the sending domain
Announcement send failedCheck error messageReview the error in the announcement record
Wrong sender addressEmail settings not setConfigure emailFrom in event settings

Photos and documents

SymptomCauseFix
Upload failsFile too large (max 10 MB)Reduce file size
Upload failsR2 binding misconfiguredVerify R2 bucket exists and is bound
Photo not displayingAuth proxy issueCheck session and API route
Document access deniedPermission mismatchVerify email/group permissions on the document
Files lost after restart (Docker)No volume mountMount data volume: -v $(pwd)/data:/app/data

Key files: api/photos/, api/documents/, runtime/types.ts

Database

SymptomCauseFix
Migration fails locallySchema syntax errorCheck schema.ts for issues; run npm run db:generate
Migration fails remotelyD1 constraintsVerify new columns have defaults or are nullable
Data leaking across eventsMissing event_id filterAdd eq(table.eventId, eventId) to all queries
Stale data showingSettings cacheWait 5 seconds (cache TTL) or restart server

Deployment

SymptomCauseFix
CI deploy failsInvalid API tokenVerify CF_DEPLOY_API_TOKEN permissions
CI deploy failsWrong account IDCheck CF_ACCOUNT_ID matches target account
Missing bindings after deployResource IDs wrongVerify D1_DATABASE_ID, KV_NAMESPACE_ID, R2_BUCKET_NAME
Docs not updatingWrong docs worker nameCheck DOCS_WORKER_NAME in environment

Key files: .github/workflows/apps-ci.yml, wrangler.toml

Diagnostic steps

When none of the above match:

  1. Identify the subsystem: Platform UI, event resolution, auth, payment, or storage
  2. Reproduce: Note the exact route, action, and error message
  3. Check environment: Verify env vars and secrets are set correctly
  4. Check logs: Cloudflare Workers dashboard or local console output
  5. Check database: Inspect records directly (local SQLite or D1 console)
  6. Re-run the flow: After applying fix, test the full end-to-end path

Released under the MIT License.