Playbook — Operations
Your job: keep the data flowing, the worker shipping, and the numbers reconciled. The platform is one Worker + BigQuery + n8n ETL — here's how to run it.
The moving parts
| Concern | Where |
|---|---|
| What runs where (Worker, Pages, bindings, secrets, crons) | ../../fcr-dashboard-architecture-overview.md §9 |
| The data warehouse + the daily sync sequence | ../../bigquery-and-sync.md |
| The ETL jobs (and their Worker twins) | ../../n8n-workflows.md |
| Shipping code (gated deploys, rollback) | ../../commit-and-deploy.md, ../../branching-workflow.md |
| The full API surface | ../../worker-endpoints.md |
Daily / recurring operations
- Data syncs are n8n cron jobs (HubSpot deals twice-daily ~05:45, engagements delta 07:30, iovox/Teamwork/Ahrefs/SERP/SitePro/Yext) + BQ scheduled queries (
active_clients~06:00). Worker crons run after (07:30/07:45 prewarm, 08:00–20:00 deal-brief refresh, every-minute drains). - Deploys go through
scripts/deploy-worker.shonly — clean-tree + no-undef lint gates, tags every deploy for rollback, both CF accounts. Pages + HubSpot card deploy separately. - Reconciliation / freshness —
dashboard-reconciliation,dashboard-data-freshness, suspensions, ads-spend reconciliation.
Observability & gotchas (hard-won)
- Workers Logs are now ON — debug crons/queues in the CF Observability tab (was blind before).
- CF Queues auto-pause on a large one-shot backlog (1,000+ slow messages) — drip in small chunks; clear a stuck consumer by deleting + redeploying it (learned the hard way on the deal-brief refresh queue).
- Deploy gate refuses a dirty
worker/tree — commit or stash unrelated WIP; never--forcecasually. - Two CF accounts — production (FCR) + dev (personal); deploy script handles both.
What's new since the v1 deck
- The deal-brief precompute pipeline (KV + BQ audit + Queue + chunked cron).
- Observability enabled; the chunked self-pacing refresh cron; rollback tags.
FCR Dashboard documentation · generated from docs/ · keep counts verified, not guessed.