Limits and things to know
Size limits, what the preview cannot show, what scripts can do, and other details worth knowing before you publish.
Size limits
| What | Limit |
|---|---|
| HTML, Template and Custom HTML bodies | 100,000 characters each |
| Script | 50,000 characters |
| Each CSS body, block and external | 50,000 characters each |
| Name | 200 characters |
| Description | 2,000 characters |
| Exclusive group | 120 characters |
| Fixed template variables | 50, each value up to 2,048 characters |
| Preset settings | 50 |
| Anchor selector | 500 characters |
| Wrapper classes and wrapper style | 200 and 500 characters |
| Priority | Between -1,000,000 and 1,000,000 |
| Widget or server-rendered content | About 48 KB once packed up for delivery. Larger content is refused by the sync. The block-stack editor warns before you reach it. |
| Blocks in one stack | 20, hidden copies included |
The anchor may not exist
On the loader route the form checks that the anchor selector is valid CSS. It cannot check that your page has such an element. If it does not, the content has nowhere to attach and nothing shows. Replace removes the anchor element itself. See Delivery.
Regions must exist too
A widget placed in a region your theme scan does not list renders nowhere. A server-rendered injectable in an unlisted region falls back to the theme's header region. See Delivery.
The preview is not your page
The preview holds only the injectable. The wrapper element, external CSS and the exact spot on the page show only on the live storefront.
Scripts
Script content and custom-script rules run on the storefront with full access to the page and are not timed out. A sitewide theme region can run them on checkout and order pages too, which StoreSpan cannot prevent. Only publish script you have reviewed, and expect the typed publish check every time.
Frequency caps are best effort
Caps live in the visitor's browser and can be reset by the visitor, and the dismissal snooze needs a marked element in your content. See Targeting, schedule and frequency cap.
Who really sees it
Only a static page promises the same content to every visitor at all times. A server-rendered injectable is close: it shows on every page that has its region, or only on the page it is pinned to. Loader and widget content is gated by rules, schedule and cap, so not every visitor sees it. See Delivery.
A server-rendered injectable that falls back to the loader shows on every page, because its rules were replaced by "every page" when it moved to that route. Its schedule and cap still apply.
Other details
- Only one injectable per exclusive group renders on a page view. See Creating an injectable.
- The loader never runs on the checkout page.
- The number in the list header counts injectables, not the ones currently showing.
- Countdown label forms that need quotes inside the placeholder can look fine in the preview and break on the storefront. Keep prefix and suffix text simple.