Data Feeds & Knowledge Sources — and how to update them
The "where does X come from and how do I change it" reference: the customer site index, the company knowledge base, the product portfolio, and the outreach email templates. Verified 2026-05-20.
1. The customer site index (fcr-site-portfolio)
This is the Vectorize index behind "similar FCR-built sites / similar clients" in prospect intel and the deal brief.
Feed chain:
MegaDoc (Google Sheet, maintained by the build team)
│ weekly Tue 04:00 — n8n "Dashboard - SitePro MegaDoc" (CkAXUJQhwdT07aGr)
▼
fcr_operations.sitepro_megadoc_cache (one row per built site; is_live flag)
│ manual — handlers/vector-reindex.js (route dashboard-vector-reindex),
│ driven by n8n "Dashboard - Vector Reindex (Manual)" (gwg0ZtoHjlRlQNf1)
│ JOINs active_clients (latest snapshot) to attach product/MRR metadata
▼
Vectorize fcr-site-portfolio
Does active_clients touch it? Yes — vector-reindex.js pulls Live
sites from sitepro_megadoc_cache (WHERE is_live = "Live") and joins
active_clients (latest snapshot_date) to embed each site's active product
lines + MRR into the vector metadata. So the index carries billing/product
flags — but as a frozen snapshot from reindex time. Reindex is manual
(no cron), so:
- those metadata flags drift as clients churn/upsell, and
- consumers must re-hydrate money/product state from
active_clientslive (prospect-intel does this; never trust the vector'stotal_mrr/product flags directly — seehubspot-data-architecture.md). - The index is GP-listing-wide, so it also contains free listings / churned — consumers must split paying vs not, not just hydrate.
To refresh after MegaDoc/site changes: run the n8n "Vector Reindex (Manual)"
workflow (loops POST /dashboard-vector-reindex in batches of 50 until
remaining=0). It's inactive by design — run on demand.
2. The company knowledge base (fcr-company-knowledge)
The Vectorize index behind the advisor's search_company_knowledge ("what is
SayMore", "FCR's heritage", product descriptions, case studies).
Two sources, both in code:
| Source | File | Reindex route |
|---|---|---|
| Crawled public sites | worker/src/data/company-sites.js → COMPANY_SITES (fcrmedia.ie, saymore.ie) |
dashboard-company-knowledge-reindex (crawls sitemaps → chunks ~600 tokens → embeds) |
| Case studies (CCO-authored, verbatim) | worker/src/data/case-studies.js |
dashboard-case-studies-reindex |
To add to the knowledge base:
- A new site/section: add an entry to
COMPANY_SITESincompany-sites.js(and tuneEXCLUDE_PATH_PATTERNSto keep out legal/tag/archive noise), commit + deploy, then calldashboard-company-knowledge-reindexrepeatedly (paginated:offset→next_offsetuntilremaining=0). - A new case study: add it to
case-studies.js(preserve the Commercial Director's wording verbatim — never copy-edit), deploy, rundashboard-case-studies-reindex.
Keep
COMPANY_SITESshort and curated — the index is for authoritative about-us / product content, not every blog post.
3. The FCR product portfolio
The canonical price list / product catalogue.
- File:
worker/src/data/fcr-products.js→ exportedFCR_PRODUCTSarray. Each entry:id,name,setup_eur,monthly_eur,term_months,description,includes[]. - Used by:
ai-advisor.jsrenders it into the advisor's system prompt, so the model quotes authoritative prices instead of training-data recall. It's the single source of truth for "what does FCR charge".
To update: edit fcr-products.js, get sales-ops review (these numbers
land in client-facing proposals), commit + deploy (scripts/deploy-worker.sh).
Update cadence is rare (1–2×/year).
Marketing is building a canonical price+slug+approved-description source that will eventually replace this hard-coded file and seed the company-knowledge index — until then,
fcr-products.jsis the source of truth.
4. Outreach email templates
Where the AM outreach templates the advisor drafts from are stored.
| Tier | Storage (BQ, fcr_operations) |
Managed via |
|---|---|---|
| Personal (per AM) | am_email_templates (key: roam_user_id + label) |
dashboard-am-email-templates (GET / POST upsert / DELETE soft-delete) |
| Team / peer | am_team_email_templates |
dashboard-am-team-email-templates |
| CCO house (universal fallback) | same tables, the CCO's templates | the firm-wide standing wording every rep falls back to |
Each row carries template_body (verbatim), label (slug like
audit_followup_website), and when_to_use (the context hint the advisor's
template picker matches against — semantically, not by label string).
To add/edit a template:
- Easiest: ask the advisor to "save this as my
- Or
POST /dashboard-am-email-templateswithroam_user_id,label,template_body,when_to_use.
The template-first policy (why this matters): when asked for outreach, the
advisor MUST match an existing template by when_to_use and use its body
verbatim (only substituting {{tokens}}) before ever drafting fresh —
personal → own-team → peer-team → CCO house → only then Claude's own voice.
Templates carry the brand voice the CCO approved.
Summary: how to change each thing
| Want to change… | Do this |
|---|---|
| A built site shown as a "similar client" | update the MegaDoc → it flows to sitepro_megadoc_cache weekly → run the manual Vector Reindex |
| FCR's about-us / product knowledge | edit company-sites.js (or case-studies.js) → deploy → run the matching reindex route |
| A product price | edit fcr-products.js → sales-ops review → deploy |
| An outreach email template | save via the advisor, or POST /dashboard-am-email-templates |
FCR Dashboard documentation · generated from docs/ · keep counts verified, not guessed.