[{"data":1,"prerenderedAt":75},["ShallowReactive",2],{"help-article-injection-tokens":3},{"data":4},{"title":5,"excerpt":6,"content":7,"help_category":8,"seo":11},"Injection Tokens","How do injection tokens work in m18t prompts? Learn the scope:token syntax and namespaces, the green and amber readiness badges, and conditional blocks.","\u003Cp>Injection tokens are the placeholders that let a single prompt template work for any brand and any piece of content. They look like \u003Ccode>{{brand:name}}\u003C\u002Fcode> or \u003Ccode>{{content:body}}\u003C\u002Fcode>, and at run time m18t fills them with the real values. This article explains the syntax, the namespaces, the green\u002Famber readiness badges, and how optional sections drop out when a value is missing.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>What you&#39;ll learn\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The \u003Ccode>{{scope:token}}\u003C\u002Fcode> syntax and the namespaces available.\u003C\u002Fli>\n\u003Cli>What the green and amber token badges mean in the prompt editor.\u003C\u002Fli>\n\u003Cli>How optional \u003Ccode>{{#if}}\u003C\u002Fcode> sections drop out cleanly when a value is empty.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2>The concept: one template, real data\u003C\u002Fh2>\n\u003Cp>A \u003Ca href=\"\u002Fhelp\u002Fhow-ai-prompts-work\">prompt template\u003C\u002Fa> is generic on purpose. The news rewrite prompt doesn&#39;t hard-code one article — it says &quot;rewrite the following: \u003Ccode>{{content:body}}\u003C\u002Fcode>&quot;. When you run it, m18t replaces \u003Ccode>{{content:body}}\u003C\u002Fcode> with the actual article body. That substitution is what an injection token does.\u003C\u002Fp>\n\u003Cp>Tokens are \u003Cstrong>namespaced\u003C\u002Fstrong>: the part before the colon says where the value comes from, and the part after names the specific field. Verified against m18t&#39;s prompt engine, the namespaces are:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>brand:\u003C\u002Fcode>\u003C\u002Fstrong> — \u003Ccode>{{brand:name}}\u003C\u002Fcode>, \u003Ccode>{{brand:primary_locale}}\u003C\u002Fcode>, \u003Ccode>{{brand:domain}}\u003C\u002Fcode>, \u003Ccode>{{brand:slug}}\u003C\u002Fcode>, plus the \u003Ca href=\"\u002Fhelp\u002Fthe-brand-ai-profile\">Brand AI Profile\u003C\u002Fa> fields: \u003Ccode>{{brand:positioning}}\u003C\u002Fcode>, \u003Ccode>{{brand:voice}}\u003C\u002Fcode>, \u003Ccode>{{brand:rules}}\u003C\u002Fcode>, \u003Ccode>{{brand:glossary}}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>content:\u003C\u002Fcode>\u003C\u002Fstrong> — \u003Ccode>{{content:title}}\u003C\u002Fcode>, \u003Ccode>{{content:body}}\u003C\u002Fcode>, \u003Ccode>{{content:excerpt}}\u003C\u002Fcode>, \u003Ccode>{{content:type}}\u003C\u002Fcode>, \u003Ccode>{{content:locale}}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>seo:\u003C\u002Fcode>\u003C\u002Fstrong> — \u003Ccode>{{seo:canonical_url}}\u003C\u002Fcode>, \u003Ccode>{{seo:schema_type}}\u003C\u002Fcode>, \u003Ccode>{{seo:default_keywords}}\u003C\u002Fcode> (resolved for \u003Ca href=\"\u002Fhelp\u002Fthe-seo-ai-prompt\">SEO prompts\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>tags:\u003C\u002Fcode>\u003C\u002Fstrong> — \u003Ccode>{{tags:topics}}\u003C\u002Fcode>, \u003Ccode>{{tags:audiences}}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>news-source:\u003C\u002Fcode>\u003C\u002Fstrong> — \u003Ccode>{{news-source:name}}\u003C\u002Fcode>, \u003Ccode>{{news-source:url}}\u003C\u002Fcode>, \u003Ccode>{{news-source:description}}\u003C\u002Fcode>, \u003Ccode>{{news-source:published_at}}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The set of tokens that&#39;s relevant depends on the prompt&#39;s category. A content or social prompt offers the brand, content, and tags tokens; a news prompt also offers the news-source tokens; an SEO prompt offers the canonical-URL token. The prompt editor shows you the applicable set as clickable badges.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>A note on syntax: the engine resolves namespaced \u003Ccode>{{scope:token}}\u003C\u002Fcode> placeholders. An unknown token resolves to an empty string rather than printing the literal \u003Ccode>{{...}}\u003C\u002Fcode> — so a typo fails quietly to blank, not to garbage in the output.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2>Green and amber: token readiness\u003C\u002Fh2>\n\u003Cp>When you open a prompt for a brand, each available token shows as a badge with a colour. The colours tell you whether the token will actually produce a value for \u003Cem>this\u003C\u002Fem> brand:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Green\u003C\u002Fstrong> — the active brand has a value for that field. The token will be filled.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Amber\u003C\u002Fstrong> — the field is empty for this brand. The token will be \u003Cstrong>ignored\u003C\u002Fstrong> (it resolves to blank) until you fill it in.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Amber is most common on the \u003Ca href=\"\u002Fhelp\u002Fthe-brand-ai-profile\">Brand AI Profile\u003C\u002Fa> tokens — \u003Ccode>{{brand:voice}}\u003C\u002Fcode>, \u003Ccode>{{brand:rules}}\u003C\u002Fcode>, \u003Ccode>{{brand:glossary}}\u003C\u002Fcode> — for a brand that hasn&#39;t filled those fields yet. The fix isn&#39;t to change the prompt; it&#39;s to fill the field in the brand&#39;s AI Profile. The editor says as much: amber tokens have no value in the brand&#39;s AI profile yet and will be ignored, so fill them in the brand&#39;s settings.\u003C\u002Fp>\n\u003Cp>Clicking a token badge inserts it at your cursor in whichever prompt area you last focused — a quick way to build a template without typing the braces by hand.\u003C\u002Fp>\n\u003Ch2>Optional sections that drop out cleanly\u003C\u002Fh2>\n\u003Cp>Sometimes you want a whole sentence to appear only when a value exists — not just the value itself. For that, m18t supports a conditional block:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>{{#if brand:voice}}Write in this brand&#39;s voice: {{brand:voice}}.{{\u002Fif}}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>If \u003Ccode>brand:voice\u003C\u002Fcode> has a value, the block stays and the token fills in. If it&#39;s empty, the \u003Cstrong>entire block\u003C\u002Fstrong> is removed — the label, the token, and the surrounding prose all go together. You never end up with a dangling &quot;Write in this brand&#39;s voice: .&quot; with nothing after it.\u003C\u002Fp>\n\u003Cp>This keeps templates clean across brands with different amounts of profile data. A brand that hasn&#39;t written a Glossary doesn&#39;t get the Glossary sentence; a brand that has, does. Blank-handling is consistent with how the \u003Ca href=\"\u002Fhelp\u002Fthe-brand-ai-profile\">Brand AI Profile\u003C\u002Fa> preamble already skips empty fields.\u003C\u002Fp>\n\u003Cp>Conditional blocks are a flat list of independent optional sections — they aren&#39;t designed to nest inside one another. Keep each \u003Ccode>{{#if}}...{{\u002Fif}}\u003C\u002Fcode> self-contained.\u003C\u002Fp>\n\u003Ch2>How to use tokens in a prompt\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Open a prompt at \u003Cstrong>Configuration ▸ AI Prompts\u003C\u002Fstrong> (\u003Ccode>\u002Fstudio\u002Fconfig\u002Fprompts\u003C\u002Fcode>). For a Locked platform prompt you&#39;ll need to \u003Ca href=\"\u002Fhelp\u002Fcustomizing-a-prompt\">customize it\u003C\u002Fa> first; new prompts are editable from the start.\u003C\u002Fli>\n\u003Cli>Look at the \u003Cstrong>Available Injection Tokens\u003C\u002Fstrong> badges. Green = filled for this brand, amber = empty\u002Fignored, with a tooltip explaining each.\u003C\u002Fli>\n\u003Cli>Click a badge to insert that token at your cursor, or type it as \u003Ccode>{{scope:token}}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>For a sentence that should only appear when a value exists, wrap it in \u003Ccode>{{#if scope:token}}...{{\u002Fif}}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Save. On the next run, m18t fills the tokens from the active brand and the content you&#39;re working on.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2>Variations\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Untrusted content is fenced.\u003C\u002Fstrong> Tokens that carry external text — a scraped \u003Ccode>{{content:body}}\u003C\u002Fcode>, a \u003Ccode>{{news-source:description}}\u003C\u002Fcode> — have their \u003Cem>values\u003C\u002Fem> wrapped and labelled as data so the model treats them as material to process, not as instructions. This is a defense-in-depth measure for \u003Ca href=\"\u002Fhelp\u002Fthe-news-manager-concept\">the news pipeline\u003C\u002Fa>, handled for you.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SEO canonical injection.\u003C\u002Fstrong> For SEO-category prompts, \u003Ccode>{{seo:canonical_url}}\u003C\u002Fcode> is resolved from the brand&#39;s domain and content-type settings and injected with an explicit &quot;don&#39;t invent URLs&quot; instruction. See \u003Ca href=\"\u002Fhelp\u002Fthe-seo-ai-prompt\">The SEO AI Prompt\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Tags resolve to names.\u003C\u002Fstrong> \u003Ccode>{{tags:topics}}\u003C\u002Fcode> and \u003Ccode>{{tags:audiences}}\u003C\u002Fcode> resolve your selected tag IDs into a readable, comma-separated list of names.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>FAQ\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Why is a token badge amber?\u003C\u002Fstrong>\nThe active brand has no value for that field yet, so the token will be ignored on this run. Fill the field — usually in the \u003Ca href=\"\u002Fhelp\u002Fthe-brand-ai-profile\">Brand AI Profile\u003C\u002Fa> — and the badge turns green.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>What happens if I use a token that has no value?\u003C\u002Fstrong>\nIt resolves to an empty string. If you wrapped it in a \u003Ccode>{{#if}}\u003C\u002Fcode> block, the whole block drops out instead, so you don&#39;t get a stray label with nothing after it.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>What&#39;s the difference between \u003Ccode>{{token}}\u003C\u002Fcode> and \u003Ccode>{{#if token}}...{{\u002Fif}}\u003C\u002Fcode>?\u003C\u002Fstrong>\nThe first inserts a value (or blank). The second keeps or removes an entire section depending on whether the token has a value. Use \u003Ccode>{{#if}}\u003C\u002Fcode> for sentences that should only appear when there&#39;s something to say.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Can I make up my own token?\u003C\u002Fstrong>\nTokens map to known namespaced fields. An unrecognized token resolves to blank rather than appearing literally — so a typo won&#39;t break the output, but it also won&#39;t inject anything. Stick to the namespaces above.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Where do brand-profile tokens get their values?\u003C\u002Fstrong>\nFrom the brand&#39;s \u003Ca href=\"\u002Fhelp\u002Fthe-brand-ai-profile\">AI Profile\u003C\u002Fa>: \u003Ccode>{{brand:voice}}\u003C\u002Fcode>, \u003Ccode>{{brand:rules}}\u003C\u002Fcode>, \u003Ccode>{{brand:glossary}}\u003C\u002Fcode>, \u003Ccode>{{brand:positioning}}\u003C\u002Fcode>. Fill those fields in the brand&#39;s settings.\u003C\u002Fp>\n\u003Ch2>What&#39;s next\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fhow-ai-prompts-work\">How AI Prompts Work\u003C\u002Fa> — the templates these tokens fill.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fthe-brand-ai-profile\">The Brand AI Profile\u003C\u002Fa> — where the \u003Ccode>brand:\u003C\u002Fcode> profile tokens get their values.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fcustomizing-a-prompt\">Customizing a Prompt\u003C\u002Fa> — editing a template to add tokens.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fthe-seo-ai-prompt\">The SEO AI Prompt\u003C\u002Fa> — canonical-URL token injection in action.\u003C\u002Fli>\n\u003C\u002Ful>\n",{"slug":9,"title":10},"ai-prompts-and-voice","AI Prompts & Brand Voice",{"meta_title":12,"meta_description":6,"keywords":13,"canonical_url":14,"og_title":5,"og_description":15,"og_image":16,"robots":17,"json_ld":18},"Injection Tokens | m18t Help","injection tokens, prompt placeholders, scope token syntax, green amber badges, conditional blocks, brand tokens, m18t","https:\u002F\u002Fm18t.com\u002Fhelp\u002Finjection-tokens","The placeholders that let one prompt template work for any brand: the syntax, the namespaces, the green\u002Famber readiness badges, and conditional sections.","https:\u002F\u002Fm18t.com\u002Fog-default.png","index, follow",{"@context":19,"@graph":20},"https:\u002F\u002Fschema.org",[21,34,59],{"@type":22,"headline":5,"description":6,"articleSection":10,"inLanguage":23,"datePublished":24,"dateModified":24,"image":16,"author":25,"publisher":29,"mainEntityOfPage":32},"Article","en","2026-06-25",{"@type":26,"name":27,"url":28},"Organization","m18t","https:\u002F\u002Fm18t.com",{"@type":26,"name":27,"url":28,"logo":30},{"@type":31,"url":16},"ImageObject",{"@type":33,"@id":14},"WebPage",{"@type":35,"mainEntity":36},"FAQPage",[37,43,47,51,55],{"@type":38,"name":39,"acceptedAnswer":40},"Question","Why is a token badge amber?",{"@type":41,"text":42},"Answer","The active brand has no value for that field yet, so the token will be ignored on this run. Fill the field — usually in the Brand AI Profile — and the badge turns green.",{"@type":38,"name":44,"acceptedAnswer":45},"What happens if I use a token that has no value?",{"@type":41,"text":46},"It resolves to an empty string. If you wrapped it in a conditional block, the whole block drops out instead, so you don't get a stray label with nothing after it.",{"@type":38,"name":48,"acceptedAnswer":49},"What's the difference between a plain token and a conditional block?",{"@type":41,"text":50},"A plain token inserts a value (or blank). A conditional block keeps or removes an entire section depending on whether the token has a value. Use a conditional for sentences that should only appear when there's something to say.",{"@type":38,"name":52,"acceptedAnswer":53},"Can I make up my own token?",{"@type":41,"text":54},"Tokens map to known namespaced fields. An unrecognized token resolves to blank rather than appearing literally — so a typo won't break the output, but it also won't inject anything. Stick to the documented namespaces.",{"@type":38,"name":56,"acceptedAnswer":57},"Where do brand-profile tokens get their values?",{"@type":41,"text":58},"From the brand's AI Profile: the voice, rules, glossary, and positioning tokens. Fill those fields in the brand's settings.",{"@type":60,"itemListElement":61},"BreadcrumbList",[62,66,70,73],{"@type":63,"position":64,"name":65,"item":28},"ListItem",1,"Home",{"@type":63,"position":67,"name":68,"item":69},2,"Help","https:\u002F\u002Fm18t.com\u002Fhelp",{"@type":63,"position":71,"name":10,"item":72},3,"https:\u002F\u002Fm18t.com\u002Fhelp\u002Fcategories\u002Fai-prompts-and-voice",{"@type":63,"position":74,"name":5,"item":14},4,1786312170913]