Skip to content

Troubleshooting

The Display tab’s “Runtime diagnostics” + Simulator are the fastest debugging tools. This page covers reading them and standard checks for common issues.

Subtitle: “Based on Simulator preview, not actual storefront data.”

8 diagnostic reasons (from i18n diagnostics.reason.*)

Section titled “8 diagnostic reasons (from i18n diagnostics.reason.*)”
ReasonMeaningFix direction
VisibleAll good
Page type mismatch: this widget targets {expected} pages, visitor is on {got}.Widget mount page ≠ visitor pageCheck Placement and Pages dimensions, or adjust Simulator URL
Blocked by display ruleA visibility dimension didn’t matchSwitch through 9 dimensions or check Simulator verdict per dimension
No available placement on this pageTheme has no available anchor on this pageSwitch theme, switch placement, or use Custom Position
Page rule no matchPages dimension filtered outAdd current page type to Include list
Visitor login state doesn’t matchCustomers dimension filtered outCheck Login state setting
Placement not setPlacement required field missingPick a mount location
Invalid CSS selectorHide theme elements dimension (Pro) has invalid selectorFix CSS selector syntax

Image: diagnostic modal (8 reasons, 1 screenshot each)

The new version lists all failing dimensions at once — fix in one pass:

  • Single failure → shows that reason (e.g. “Page rule no match”)
  • Multiple failures → list view with each fail’s detail (dimension name + reason code)
  • All pass → “Visible”

Display tab right sidebar — fill virtual customer profile to see hits:

  • URL — auto-parses page type + UTM
  • Device / Login state / Country (segmented control)
  • Customer tags / Total spent / Order count (input)

Switch persona to see verdict change in real time without affecting saving.

Standard checklist: “Widget published but not showing on storefront”

Section titled “Standard checklist: “Widget published but not showing on storefront””

In order:

Go to Widget list → StatsRow → “App status” card:

  • “Enabled”
  • “Disabled” — “App embed not enabled; widget won’t render on storefront.” Click “Enable” to jump to theme editor
  • ⚠️ “Switching themes resets this toggle — re-enable after changing themes.”

Open widget editor → Display tab → top StickyBar or diagnostic button → see which reasons fail.

In the right Simulator sidebar paste a real link (with utm params, etc.) to check verdict.

widget.js outputs error prefix [tt-blocks], common messages:

  • [tt-blocks] mount failed: {widgetId} reason: ... — mount failed
  • [tt-blocks] visibility eval blocked: {dimension} — dimension short-circuited
  • Theme JS conflicts may show as jQuery / Theme JS errors

Read window.__TTB_DIAGNOSTICS__[widgetId] directly in browser console for full diagnostic state.

If using Custom Position:

  • Confirm theme editor’s manual block is added with correct widget ID pasted
  • Confirm theme is saved
  • Confirm manual block is on a published template (not draft)

Email with:

  • Widget ID (Copy ID button on widget list card)
  • Storefront URL
  • Browser and OS version
  • Console screenshot
  • Expected vs actual behavior
LimitValueTrigger behavior
Single widget config size96 KiBSave fails, editor shows friendly toast (D1 metafield raw stack 128 KiB)
customAnchorSelectors per widget24 entriesExcess ignored
Shopify checkout block≤ 1 per shopShopify platform limit
Free demo quota (products / variants etc.)See PlansExceeding shows upgrade prompt
Stats data retentionLast 90 daysAuto-cleared after

”Save failed” / “Widget too large”

Section titled “”Save failed” / “Widget too large””
  • widget config exceeds 96 KiB
  • Check for overly long CSS or many duplicate components
  • Split into multiple widgets (visibility config can achieve same effect)

products / variants etc. dimension exceeds demo quota.

  • Reduce config items → or upgrade Pro for unlimited
  • See Billing tier

label widget anchor can’t change to non-label, vice versa (see Widget types).

  • To change type → rebuild a new widget

Useful for troubleshooting:

Shopify theme loads widget.liquid
↓ Inject window.__TTB_BLOCKS__ = { widgetId: config }
↓ Load widget.js (async)
widget.js scans after DOMContentLoaded:
├─ Manual: find .ttb-block-wrapper[data-widget-id] in DOM
└─ Auto: iterate __TTB_BLOCKS__ for placement.mode === "auto"
↓ Cascade through theme DOM anchors
↓ Found → create wrapper → mount
↓ Not found → no mount, diagnostic written to __TTB_DIAGNOSTICS__
Pre-mount evaluator runs visibility 9 dimensions
↓ All pass → mount and render
↓ Any fail → no mount, diagnostic written to __TTB_DIAGNOSTICS__

See Storefront behavior.