Billing tier
tt-blocks has only Free + Pro tiers (no enterprise tier). Pro-only fields are classified by FEATURE_TIERS; Free shops auto-strip Pro fields (tier-strip) to prevent bypass.
Free vs Pro high-level differences
Section titled “Free vs Pro high-level differences”| Aspect | Free | Pro |
|---|---|---|
| Unlimited widgets · 11 component types · 7 placements · 4 color schemes | ✅ | ✅ |
| Theme-derived bundles · multi-language translation | ✅ | ✅ |
8 visibility dimensions, on / off toggle (pages / products / variants / customers / geo / device / schedule / traffic) | ✅ | ✅ |
customers.authState (logged-in / guest binary) | ✅ | ✅ |
products.byProduct — specific products | demo: max 5 | unlimited |
products / variants / customers advanced filters | ❌ | ✅ |
geo / schedule / traffic (UTM) / device.uaRegex | ❌ | ✅ |
| Hide theme elements + per-widget Advanced CSS | ❌ | ✅ |
Full comparison: Plans.
Tier-strip mechanism
Section titled “Tier-strip mechanism”Each visibility field is classified into Free or Pro tier in FEATURE_TIERS. When BILLING_ENFORCE=true:
- Save path: Free shop writes auto-strip Pro fields
- Load path: When a merchant downgrades from Pro to Free, existing Pro fields remain visible in the editor but don’t take effect on storefront; saving strips them
Enforced by tier-strip-audit.mjs + feature-tier-coverage-audit.mjs.
Demo quota
Section titled “Demo quota”Only two free fields offer demo behavior:
visibility.products.byProduct.include— pick up to 5 specific products (MAX_FREE_PRODUCTSinapp/components/display-tab/sections/ProductsModule.jsx).visibility.customers.authState— toggle logged-in / guest (binary, no count quota).
When byProduct exceeds 5, the editor displays “Free quota used up (5 max). Upgrade to Pro for unlimited” + Pro upgrade CTA.
Note: byCollection and variants.* do not have demo quotas — both are entirely Pro-gated.
Save-then-upgrade flow
Section titled “Save-then-upgrade flow”Merchants can configure Pro fields in Free mode (the editor allows it). On save:
- If config doesn’t exceed demo quota → normal save, Pro fields persist
- If exceeds quota → upgrade prompt: “Save then upgrade — widget takes effect immediately”
- Choose “Upgrade” → Shopify billing → upgrade complete → widget renders with full Pro fields
- Choose “Skip” → demoted to Free quota, excess fields stripped
Tier switch behavior
Section titled “Tier switch behavior”| Switch | Field behavior |
|---|---|
| Free → Pro | Takes effect immediately; previously-stripped fields in editor_state_json may be recovered |
| Pro → Free | Downgrade at end of current billing cycle; Pro fields no longer take effect on storefront, but D1 retains them |
Related concepts
Section titled “Related concepts”- Visibility fields affected by tier-strip: see Display tab
- Plan pricing and billing: Plans and Refund and Subscription Policy