Programmatic content in GTM30
How to design a programmatic content system where your website becomes the primary narrative and data layer for GTM30.
GTM30 stack
Programmatic content is the canonical layer: it renders the entity model, emits traits, and gives community + ambassadors stable pages to link to.
Quick start
Read this page as an implementation sequence. Programmatic content becomes powerful when the model, templates, and signals are designed together.
- Model: define a small set of entities and fields (section 3) and keep the entity model stable.
- Templates: decide page types and consistent spines (sections 4–5).
- Signals: emit machine-readable metadata + events/traits (sections 6–7) so they become reusable traits.
- Scale: add LLM, multilingual, tools, and UGC once the basics work (sections 8–10).
1. What programmatic content means in GTM30
In GTM30, programmatic content is not a pile of long-tail pages or AI slop. It is a structured system that turns your website into:
- A discoverability layer for problems, use cases, and solutions.
- A single source of truth for your narrative.
- A structured data layer for automation, CRM, and LLMs.
The goal is that every page should be easy for humans to scan, easy for search engines to index, and easy for LLMs and internal tools to query and summarize.
Practically, you design a data model (entities + fields), render it through templates, and emit consistent signals (structured data + events) that other GTM systems can reuse.
Programmatic content works best when it is connected to ambassadors and community, so your narratives and signals stay consistent across every surface.
2. Role in the GTM30 stack
Programmatic content supports all four GTM30 pillars:
- Ambassadors: canonical links for every problem or use case, in the right language and level of depth. See the ambassador system.
- Community: every recurring topic gets a canonical home page; answers and threads link back to structured pages instead of scattered posts. See the community engine.
- Programmatic content: each page emits stable, machine-readable signals that feed marketing automation, lead scoring, CRM, and LLM tools.
- Cross-functionality: programmatic content provides the shared, entity-based schema and traits that Product, Growth, Sales, and Support use to stay aligned. Learn how the schema powers cross-functionality.
What it provides (inputs → outputs)
Programmatic content is the shared layer other GTM surfaces read from: canonical pages, consistent internal links, and machine-readable traits.
| Pillar | Programmatic input | Output you get |
|---|---|---|
| Ambassadors | Canonical entity pages + consistent messaging + shareable URLs | Easier linking and distribution without narrative drift “link to the canonical page” |
| Community | Topic hubs + glossary + how-to pages tied to entities | Faster answers + fewer repeated threads + better internal linking back to canon |
| Programmatic content | Templates + URL structure + structured data + event schema | Scalable page generation with stable signals for SEO, LLMs, and automation |
| Cross-functionality | Shared entity ids + traits (ICP, pain, intent, lifecycle) across all pages | One language for Product, Growth, Sales, Support + consistent routing and reporting |
Your website becomes the master narrative and data backbone for GTM30 – the layer every other channel (ads, sales, support, AI, ambassadors, community) reads from.
3. Start from the entity model, not keywords
GTM30 programmatic content starts from a data model, not from a list of keywords. Define a small, stable set of entities that power both content and automation.
Core entity types
- Problems and pains.
- Use cases and workflows.
- Industries and verticals.
- Roles and personas.
- Integrations, tools, and alternatives.
- Features and modules.
Typical fields
Each entity has fields usable in content, analytics, and automation:
- Stable entity id, name, and short label.
- Problem type and primary pain tag.
- ICP segment (industry, company size, market).
- Persona (role).
- Lifecycle stage focus.
- Intent level (low, medium, high).
- Region relevance (global, EU, US, etc.).
Entity ids and relationships (what makes it stable)
Your entity model stays stable when ids are durable and relationships are explicit. That way, you can change copy, templates, and keywords without breaking the underlying structure.
- Stable ids: use predictable ids like problem.ticket_backlog or usecase.churn_reduction_b2b_saas.
- Localized slugs: slugs can change per locale; ids should not.
- Relationships: connect entities with arrays like “problems”, “personas”, “integrations”, “features”, “alternatives” so templates can generate consistent internal links.
Example: keyword → entity → page (and automation tags)
Imagine you sell a helpdesk / shared inbox SaaS. The keyword is not the "thing" you model - it maps to a stable entity that many pages and systems can reference.
| Query (keyword) | Maps to entity | So you show / tag |
|---|---|---|
| reduce ticket backlog fast | problem.ticket_backlog type: problem | Problem page: "Ticket backlog" intent=high · pain=overload |
| ticket backlog meaning | problem.ticket_backlog type: problem | Definition/education section for the same entity intent=low |
| Zendesk alternative | alternative.zendesk type: alternative | Alternatives / comparison page intent=comparison |
| helpdesk for Shopify | integration.shopify type: integration | Integration page (templates, setup, use cases) platform=shopify |
| shared inbox for support teams | feature.shared_inbox type: feature | Feature page (benefits, constraints, proof) feature=shared_inbox |
Test for a good entity model: if someone views three or more pages tied to the same entity set, you can reliably tag them with ICP segment, primary pains, and relevant workflows.
Don't treat every keyword as its own entity. You want a small, stable schema that many pages reference, not thousands of fragile records.
4. Page types that sit on top of the model
Once you have an entity model, you don't publish “a page per keyword”. You publish a small set of page types (templates) that each present the same entities from a different angle: explain a concept, guide an implementation, compare alternatives, or quantify impact. The model stays stable; the pages are the different views.
Example: one entity, many page views
Take one entity (e.g. usecase.churn_reduction_b2b_saas) and ship a small “pack” of pages that all reference it. Different templates, same underlying concept.
| Page view | Example title | What it should link to / produce |
|---|---|---|
| Use case landing | Churn reduction for B2B SaaS | Links to pains, personas, features, integrations tags: icp=b2b_saas · intent=high |
| Blog article | 5 churn reduction patterns that compound retention | Links back to the canonical use case + glossary terms tags: intent=medium |
| Glossary entry | Net revenue retention (NRR) | Links to churn reduction use case + “how to calculate” tags: intent=low |
| How-to / KB | How to instrument churn risk scoring (step-by-step) | Enables implementation + links to tooling/integrations tags: lifecycle=adoption |
| Tool / calculator | Churn impact calculator | Captures inputs + routes to the use case landing page tags: value-estimate |
| UGC / examples | How Acme reduced churn from 3.2% → 2.1% | Proof + links back to canonical entities (use case, pains, metrics) tags: proof |
The key is that all of these pages reference the same underlying entity ids, so your internal links, analytics, and automation stay coherent.
Reference: page type → fields → outputs
Use this as a checklist when you design templates and decide which fields belong in your entity model.
| Page type | Primary question it answers | Entity fields it should pull from | What it produces (for linking + automation) |
|---|---|---|---|
| Use case landing | “How do I solve this workflow in my context?” | ICP segment, persona, workflow steps, expected impact, prerequisites, related problems | Strong CTA + internal links to problems, features, integrations tags: icp, persona, intent=high |
| Blog article | “What should I know before I act?” | Narrative angle, examples, proof points, linked entities (use case, pains, metrics) | Discovery + distribution surface that links back to canonical pages tags: intent=medium |
| Glossary entry | “What does this term mean and why does it matter?” | Definition, examples, related metrics, common mistakes, linked use cases | Long-tail capture + clean internal linking node tags: intent=low |
| How-to / KB | “How do I implement this step-by-step?” | Steps, checklists, constraints, screenshots, role ownership, integrations, failure modes | Activation help + reduces support load tags: lifecycle=onboarding/adoption |
| Alternative / comparison | “Should I choose A or B for my situation?” | Alternatives, differentiators, constraints, segment fit, migration notes, proof points | Decision support + high-intent routing tags: intent=comparison |
| Tool / calculator | “What is the impact for me (numbers)?” | Inputs, assumptions, formulas, segment defaults, interpretation guidance, next steps | Lead capture + personalization hooks tags: segment, value-estimate |
| UGC / examples | “How are real teams doing this?” | Real setups, quotes, screenshots, industry, tooling stack, outcomes, links to canonical entities | Proof + trust + internal links back to canonical pages tags: proof, industry |
5. URL and template structure
URL patterns
Treat URLs as a public API for your schema. A good URL tells you: locale, page type, segment, and the entity being viewed.
| Segment | Meaning | Example |
|---|---|---|
| /en | Locale (language) | /en/… |
| /use-cases | Page type (template) | /en/use-cases/… |
| /b2b-saas | ICP segment / vertical (optional but powerful) | /en/use-cases/b2b-saas/… |
| /churn-reduction | Entity slug (maps to a stable entity id) | /en/use-cases/b2b-saas/churn-reduction |
Template spines
Each page type follows a consistent "spine":
| Page type | Spine + fields (what the template needs) |
|---|---|
| Use case | Who it's for → problem (ICP language) → why now → quantitative impact → solution pattern → steps → examples/UGC → related entities → next step fields: persona, icpSegment, pains, workflowSteps, impact, proof, relatedEntities, intentLevel |
| Glossary | Short definition → why it matters → how to calculate/apply → examples → common mistakes → product interaction → links to use cases and deeper articles fields: definition, examples, formulas, mistakes, relatedUseCases, relatedMetrics |
| Comparison | Who this is for → decision criteria → differences → constraints → migration notes → proof → recommended next step fields: alternatives, differentiators, constraints, segmentFit, migrationNotes, proof |
- Slug maps to entity id: slugs can change; ids should not.
- Canonical + redirects: if a slug changes, 301 redirect the old URL to the new canonical URL.
- No query params: avoid opaque parameters for core pages.
- Hreflang: locale variants cross-link via alternates.languages.
- Internal linking: every entity page links up to its hub and to 3–5 related entities.
Internal linking: each entity page links up to its hub, surfaces 3–5 related entities, and never leaves the user at a dead end.
6. Make pages machine readable
Think of machine-readability as three layers: visible structure (what humans scan), metadata (what crawlers/LLMs can trust), and behavior signals (events/traits that turn reading into GTM actions).
On-page structure
- Use logical heading hierarchy (H1 → H2 → H3).
- Repeat section labels across pages for consistency.
- Use short paragraphs and bullet lists for steps and checklists.
- Use tables for comparisons and structured data.
Structured data & LLM practices
- Use appropriate schema.org types (Article, FAQPage, HowTo, Product, Event).
- Include entity id, type, problem description, intended audience, and region in JSON-LD, mapped directly from the entity model.
- Expose supporting metadata like publish date, last updated date, breadcrumbs, and author.
- Publish an llms.txt file that tells LLMs to prefer canonical URLs and JSON-LD (this site already has one).
- Avoid vague headings and buried answers.
- Put problem, audience, and solution pattern in the first screen.
- Use consistent wording for core concepts across all page types.
- Add an AI summary button on key pages that summarizes from the same entity-based content, not from ad hoc scraping, and makes it easy to copy or send that summary into tools like ChatGPT or Perplexity for deeper exploration.
Must-have metadata (minimum viable)
If these are consistent, everything else becomes easier: SEO indexing, internal linking, analytics, and LLM retrieval.
| Field | Example | Where it lives |
|---|---|---|
| entityId | usecase.churn_reduction_b2b_saas | JSON-LD + analytics events |
| entityKind | usecase | JSON-LD + analytics events |
| pageType | use-case | glossary | comparison | tool | analytics events + DOM (data attribute) |
| locale | en | URL + JSON-LD + analytics events |
| intentLevel | low | medium | high | entity model + analytics events |
| updatedAt | 2025-12-10 | page UI + JSON-LD |
DOM hooks (recommended)
Add stable data-* attributes to the main content wrapper so tools don't have to guess by scraping.
| Attribute | Example | Used for |
|---|---|---|
| data-entity-id | usecase.churn_reduction_b2b_saas | analytics, internal tools, LLM retrieval |
| data-entity-kind | usecase | routing and filtering by entity type |
| data-page-type | use-case | template-specific tracking and QA |
| data-locale | en | multilingual analytics + retrieval filtering |
Validation checklist
- JSON-LD exists and matches the visible content.
- Canonical URL is correct (and old slugs redirect).
- Hreflang is correct for locale variants.
- Template spine is consistent (same H2 order across pages of the same type).
- Summarize button pulls from the main content (not nav/footer noise).
7. Events and traits: from page views to GTM signals
Track at minimum
- Page views with entity id, page type, language, and intent category.
- Scroll depth (25%, 50%, 75%, 90%).
- Key CTAs: demo, trial, signup, download, tool usage.
- Outbound clicks to integrations and external docs.
Transform events into traits
For each event or pattern of events, define traits that map into analytics, MA, and CRM:
| Event pattern | Trait you set | Downstream use |
|---|---|---|
| Viewed 3+ pages tied to entities where primaryPain=churn | pain_churn=true | Route to churn playbook, personalize CTA, trigger relevant emails |
| Viewed multiple pages tagged icpSegment=b2b_saas | segment_b2b_saas=true | Show B2B SaaS proof and case studies; adjust onboarding defaults |
| Viewed alternatives/comparison pages + clicked pricing/CTA | intent_switch=high | Sales routing, competitor battlecard email, higher urgency follow-up |
| Used a calculator/tool with meaningful inputs | value_estimate=true | Capture lead + store context; personalize the next page/CTA |
Traits must come from the same schema as pSEO entities so that automation and sales plays align with what people actually read.
8. LLM integration: website as single source of truth
- Make pages scannable + structured (sections 5–7).
- Ensure a stable entity id on every page (JSON-LD + events).
- Use the summarize button to pull context directly from the page.
- Chunk pages/sections and index them by entity id.
- Use retrieval for emails, sales snippets, support macros.
- Log which entities power each generated asset.
LLMs should sit on top of your website content, not invent narratives from scratch. Your website becomes the content mesh that LLMs pull from.
Core pattern
- Store entity-level content in a structured format.
- Index pages and sections in a vector store, keyed by entity id and section id.
- Use retrieval on this index for social posts, emails, sales snippets, and support macros.
Summarization workflows
- Website → social: retrieve relevant sections for an entity, summarize into posts, always link back to canonical pages.
- Website → email: retrieve sections for one pain and ICP segment, summarize into a focused email sequence, target based on traits.
- Website → onboarding: for a new account with traits (e.g. B2B SaaS, churn pain, product analytics owner), retrieve matching content and generate a personalized onboarding plan.
Guardrails
- Only generate from entity-based content and KB, not scattered drafts.
- Avoid open-ended generation with no retrieval.
- Log which entities power each generated asset.
9. Multilingual pSEO and LLM readiness
- One global entity id; localized title/slug/body.
- Same template spine across languages.
- Correct canonical + hreflang.
- Chunk metadata includes locale + entity id.
- Language-aware retrieval + fallback logic.
- Programmatic localization workflows tied to entity fields.
Multilinguality is a structural question, not just a translation task. Keep one global entity id per problem or use case and let language vary at the content level.
Global entity, local language
- Single global entity id; language-specific fields (title, slug, body, meta).
- Same sections in same order across languages.
- Locale prefixes or domains with proper hreflang and cross-links.
- Events carry both entity id and language code; automation logic runs on entity id, not language.
LLMs with multilingual content
- Store language in chunk metadata and filter by preferred language first.
- Allow fallbacks to English if no local content exists.
- Let LLMs summarize into the user's language even if the source is mixed.
10. Dynamic tools and UGC
- Ship 1–2 simple tools (calculator/checklist) tied to an entity.
- Log usage events with entity id + inputs/outputs.
- Link tools back to canonical pages.
- UGC galleries from product data (anonymized + normalized).
- Filter UGC by traits/segments and surface it as proof on canonical pages.
- Let LLM workflows retrieve both canon + UGC examples.
Mini tools
- Calculators, checklists, simple planners, scenario builders.
- Design them so they emit structured data: inputs, outputs, context.
- Log these as events tied to entities – they are strong intent signals.
UGC from the app
- Public templates, workspaces, playbooks, or galleries.
- Anonymize sensitive data and normalize fields.
- Tag each item with the same entity model as your pages.
- Link from UGC to canonical pages and back for context.
LLMs can use UGC as high-context examples ("show three anonymized setups for a B2B SaaS with churn pain"), while pSEO pages surface filtered UGC as proof and inspiration.
11. Operating and evolving the system
Ownership
- Growth/marketing owns entity model and templates.
- Product owns terminology and use case accuracy.
- Sales and CS bring real-world feedback and gaps.
- RevOps/data own event and trait mappings.
Monthly review
- Top entity groups by traffic, leads, and revenue influence.
- Traits actually used by automation and sales.
- Pages with high traffic but low engagement.
- Pages with high engagement but poor discoverability.
- Language variants that underperform.
Monthly dashboard: metric → action
| Metric | Usually means | Action |
|---|---|---|
| High traffic, low scroll / low CTA | Mismatch in intent, weak above-the-fold, unclear next step | Rewrite first screen; tighten spine; add better internal links/CTA |
| High engagement, low discoverability | Good content but weak indexing / missing entry pages | Add glossary/supporting pages; improve internal linking; add schema |
| Many visits across same entity cluster | Clear pain/ICP signal forming | Set traits; trigger targeted sequences; route to relevant demo flow |
| Traits rarely used downstream | Tracking exists but not connected to plays | Delete/merge traits; define 2–3 core plays that actually run |
| One locale underperforms | Translation drift or missing local proof/terms | Align spine; localize examples; verify hreflang + canonicals |
Decisions
- Add or adjust entities based on real usage.
- Merge or remove redundant content and pages.
- Create missing glossary or KB entries for high-traffic queries.
- Improve or expand dynamic tools and UGC where engagement is strong.
Keep the schema stable; iterate content and templates around it.
12. Technical notes for implementation
This section is about principles (what to centralize, what to keep stable). Section 13 shows a concrete Next.js + Cursor implementation path.
Content storage
- Store entities in a typed and version-controlled schema.
- Store page content as structured blocks keyed by entity and section.
- Avoid unstructured HTML blobs that are hard to re-use.
Rendering and routing
- Use dynamic routes based on entity ids and slugs.
- Build templates around the spines with components per section.
- Inject structured data from the same entity source used for rendering.
Analytics and traits
- Centralize event sending in a single client or edge utility.
- Always include entity id, page type, language, and intent category.
- Keep mappings from entity → traits in code or config, not scattered across SaaS tools.
LLM integration
- Use the same entity store for site rendering and retrieval context.
- Avoid maintaining separate knowledge representations if possible.
- Treat the website as the canonical narrative that everything else reads from.
13. Implementation with Cursor and Next.js
The goal is a single TypeScript schema that powers page generation, structured data, analytics events, and LLM retrieval. Cursor is the environment where you iterate on that schema safely.
If you only take one thing from this section: keep schema, rendering, structured data, analytics, and retrieval built from the same typed entity objects.
13.1 Repository structure
Keep the layout boring and explicit so it is easy to reason about and refactor. In this repo, the main patterns look like this:
- app/ – routes implemented as pages, for example app/frameworks/gtm30/programmatic/page.tsx and app/blog/[slug]/page.tsx.
- lib/ – shared data + helpers. Examples in this repo: lib/structured-data.ts (JSON-LD), lib/gtm30-glossary.ts (typed glossary data), lib/frameworks.ts (framework listing).
- components/ – reusable UI like TableOfContents, Breadcrumbs, and SummarizeAIButton.
- public/ – static artifacts, including public/llms.txt to guide LLMs.
13.2 Entity schemas in TypeScript
If you want to move toward true programmatic generation, the best “starting point” in this repo is the existing pattern used for the GTM30 glossary: a typed array in lib/ plus routes that read it. From there, you can expand into a broader entity model (problems, use cases, integrations, alternatives) with the same approach.
- Keep a stable entityId and a human-readable slug.
- Put your “GTM traits” (ICP, pains, intent, lifecycle) in the entity record so templates and analytics can reuse them.
- If you add locales, keep the global entityId stable and localize the display fields (title/description/slug) per language.
- Model relationships as arrays (e.g. related problems, related glossary terms) to drive internal linking automatically.
Cursor then auto-completes and validates every field as you edit, and refactors safely when you rename traits or relationships.
13.3 Page generation in Next.js
This repo mixes static pages (hand-written framework pages) and dynamic routes for data-driven content (e.g. glossary terms and blog posts). Programmatic content fits naturally into the “data-driven route” pattern:
- generateStaticParams – enumerate your entity records and output route params (for example, glossary uses { slug }).
- generateMetadata – build title, description, and alternates.canonical from the same record.
- Page component – resolve the record by slug and render a consistent “spine” (H2 sections in a stable order).
Keep display logic in these template components, not scattered across many route files.
13.4 Structured data generation
Centralize JSON-LD builders so they always read from the same entity objects as your page templates:
- In this repo, JSON-LD helpers live in lib/structured-data.ts (for example createArticleSchema, createWebPageSchema, createDefinedTermSchema).
- Pick the closest schema.org types you already use (Article, WebPage, DefinedTerm, BreadcrumbList), and extend only when you have a strong reason.
- In the page component, render a <script type="application/ld+json"> tag with JSON.stringify of this object.
That way, crawlers and LLMs read the same structure your UI uses – no drift between UI and structured data.
13.5 Analytics wiring
This repo doesn't currently have a dedicated lib/analytics/ layer. If/when you add tracking, keep it centralized and always attach entity metadata.
- Centralize tracking calls in one place (one client component or helper), so the event schema stays consistent across pages.
- Send page_view with: entityId, entityKind, pageType, locale, and intentLevel.
- Reuse the same schema for CTAs, tool usage, and outbound clicks.
All downstream tools then see consistent traits and intent signals because they originate from the same entity model.
13.6 Mapping table from entity to traits
Keep mappings from entities to traits in code, close to the schema, so Cursor can refactor them with you:
- Implement helpers like useCaseToTraits(entity) that return trait objects such as icp_segment, company_size, primary_pain, lifecycle_stage_focus.
- Add boolean traits for high-intent behaviours (for example high_intent_use_case_viewer: true).
- Feed these traits into your analytics and automation stack so they stay aligned with what people actually read.
13.7 Multilingual implementation in Next.js
In this repo, multilingual content is currently implemented as explicit routes (for example /sgh/fi) rather than a global [locale] segment. The principle still holds: keep logic tied to stable ids, not to the language.
- Use per-language pages where it makes sense, but keep slugs and internal links consistent and canonicalized.
- If you later move to a shared entity store, localize display fields (title/description/slug) and keep the global entity id stable.
- Use generateMetadata to set canonical URLs (and optionally alternates.languages when you connect locales).
- Always send both locale and entityId in analytics. Automation runs on entityId, not language.
13.8 LLM integration from the same codebase
In this repo, the practical baseline for LLM integration is: (1) structured pages + JSON-LD, (2) public/llms.txt, and (3) the SummarizeAIButton that builds prompts from the page content.
- Keep canonical URLs and JSON-LD consistent, so LLMs have a stable source of truth.
- Use llms.txt to tell assistants to prefer canonical pages and glossary definitions when summarizing.
- If you later add retrieval, index content by entityId + section headings (matching the template spine) so it stays aligned with the page structure.
The key is consistency: the same entity ids and sections should power pages, structured data, analytics, and any retrieval you add later.
13.9 Working with this in Cursor
Cursor fits best when it operates on the structured system, not on random text blobs. Use it to:
- Generate new entity records from ICP descriptions, while keeping fields typed and consistent.
- Refactor schemas when you adjust GTM30 fields, with type errors surfacing drift.
- Generate boilerplate templates for new page types that still follow your spines and structured data patterns.
- Maintain mapping functions, analytics helpers, and retrieval utilities next to the entity types.
The stricter your entity model, the more safely you can let Cursor automate content, mappings, and retrieval around it.
14. Automate content production and distribution
The website is the source of truth. Automation is how you turn each canonical entity into a consistent bundle of assets and push them into distribution surfaces, without drifting from your narrative.
Entity → asset bundle (production)
Generate downstream assets from the same entity fields + template sections (H2 spine). Never generate from “random context”.
| Asset | Generated from | Output |
|---|---|---|
| Social post set | entityId + pain + ICP + “why now” + proof sections | 3–5 angles (definition, checklist, contrarian take, example, metric) + canonical link |
| pain + ICP segment + steps + next step sections | 1 focused email per entity (or per entity cluster) + CTA back to canonical page | |
| Sales snippet | comparison/proof/constraints sections + objections | talk track + “when not a fit” + links to comparison and proof pages |
| Support macro | how-to steps + pitfalls + prerequisites | short answer + step list + canonical links (KB/glossary/use case) |
| Community seed | problem framing + “common mistakes” + examples | question-first post + 2–3 replies + link to the canonical hub page |
Keep an asset log (asset type, entityId, source sections, publish date, canonical URL) so you can trace every output back to the source of truth.
Canon → channels → canon (distribution loops)
| Loop | Trigger | Automation |
|---|---|---|
| Ambassadors | new canonical page / entity update | generate 2–3 share angles + prewritten snippet, always linking to the canonical URL |
| Community | recurring thread detected for an entity | generate reply templates + update canonical hub with missing sections/links |
| traits set (section 7) | pick the matching entity bundle and send an ICP+pain specific sequence with canonical links | |
| Sales/CS | comparison intent, tool usage, or high intent views | generate battlecards/onboarding snippets from the same entities and log provenance |
Guardrails (keep it on-brand)
- Generate from source: only from canonical pages + entity fields (never “open web” as truth).
- Human-in-the-loop: auto-draft, manual approve for claims, comparisons, and numbers.
- Provenance: every asset stores entityId + source sections and links back to canon.
- Don’t A/B test truth: test packaging and distribution, not canonical definitions.
Related GTM30 pages
How product, sales, growth, and support stay aligned to canon.
Where repeated questions become pages, docs, and templates.
How ambassadors distribute canonical links and stay accurate.
How templates + entities create scalable canonical content.