Variables & inheritance
{{var.name}} resolves through the scope chain — highest priority first:
site_page → site → global. The variable scope_demo is seeded at all
three levels with visibly different values, and this page carries the site_page
override, so you can watch the chain pick per level. All layers resolve at
Tier 1 (publish).
The scope chain, live
<p><strong>{{var.scope_demo}}</strong></p>PAGE value (site_page scope, /variables only)
On this page the site_page row wins over both the site and global rows. Everywhere else on the site — check the home page's sanity strip — the same tag renders the SITE value, which in turn beats the global one.
<p><strong>{{global.scope_demo}}</strong></p>GLOBAL value (created in Globals)
{{global.name}} pins the lookup to global scope, ignoring the site and page rows entirely.
<p>Support line: <strong>{{var.phone_number}}</strong></p>Support line:
Fall-through: phone_number has no site or page row, so {{var.…}} walks the chain down to the global value. Globals must be created manually in the admin; site rows are auto-seeded on push.
Inline value= seeds
<p><strong>{{var.seeded_demo value="Seeded from source" type="text"}}</strong></p>Seeded from source
The attributes are a build-time seeding hint: on first push they create the SITE row (seed-on-create only — an AM-edited row is never overwritten, first value= wins on conflict). The engine strips them, so the tag renders the resolved value exactly like a bare tag and delivered HTML never contains value=. Verify: view this page's source — no value= anywhere.
Component precedence — inline arg → panel row → schema default
{{self.name}} (a component's own variable, valid only inside its body)
resolves through its own chain. Watch the kicker line change across three renders of
the same component:
{{component.demo-cta}}No instance, no args → kicker falls through to the schema default: "Limited time".
{{component.demo-cta instance="top"}}The "top" instance has a panel row for kicker — it beats the schema default.
{{component.demo-cta instance="top" kicker="Inline arg wins"}}An inline arg is the top of the chain — it beats the "top" panel row and the default.
Variables inside variables
A variable's value may itself contain {{var.*}} /
{{global.*}} references — they resolve recursively at Tier 1 (cycle-guarded,
depth-capped at ~10). That is also why an SCV row or a component schema default may carry a
page-context expression like {{form name="demo-lead"}} — see the form card
on the tags page.