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? Yesvector-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_clients live (prospect-intel does this; never trust the vector's total_mrr/product flags directly — see hubspot-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.jsCOMPANY_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:

  1. A new site/section: add an entry to COMPANY_SITES in company-sites.js (and tune EXCLUDE_PATH_PATTERNS to keep out legal/tag/archive noise), commit + deploy, then call dashboard-company-knowledge-reindex repeatedly (paginated: offsetnext_offset until remaining=0).
  2. A new case study: add it to case-studies.js (preserve the Commercial Director's wording verbatim — never copy-edit), deploy, run dashboard-case-studies-reindex.

Keep COMPANY_SITES short 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 → exported FCR_PRODUCTS array. Each entry: id, name, setup_eur, monthly_eur, term_months, description, includes[].
  • Used by: ai-advisor.js renders 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.js is 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-templates with roam_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.