[{"data":1,"prerenderedAt":615},["ShallowReactive",2],{"navigation_docs":3,"-bundles-reference-performance-notes":256,"-bundles-reference-performance-notes-surround":610},[4,102],{"title":5,"path":6,"stem":7,"children":8},"TreStack Timer","\u002Ftimer","1.timer",[9,12,30,51,68,89],{"title":10,"path":6,"stem":11},"TreStack Timer docs","1.timer\u002Findex",{"title":13,"path":14,"stem":15,"children":16,"page":29},"Getting started","\u002Ftimer\u002Fstart","1.timer\u002F1.start",[17,21,25],{"title":18,"path":19,"stem":20},"Installing TreStack Timer","\u002Ftimer\u002Fstart\u002Finstalling-a-trestack-app","1.timer\u002F1.start\u002F1.installing-a-trestack-app",{"title":22,"path":23,"stem":24},"Turning on the app embed and placing the app block","\u002Ftimer\u002Fstart\u002Fplacing-your-first-app-block","1.timer\u002F1.start\u002F2.placing-your-first-app-block",{"title":26,"path":27,"stem":28},"Development stores and theme previews","\u002Ftimer\u002Fstart\u002Fdevelopment-stores-and-theme-previews","1.timer\u002F1.start\u002F3.development-stores-and-theme-previews",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Timer types","\u002Ftimer\u002Ftimer-types","1.timer\u002F2.timer-types",[35,39,43,47],{"title":36,"path":37,"stem":38},"TreStack Timer, setup and settings","\u002Ftimer\u002Ftimer-types\u002Ftrestack-timer","1.timer\u002F2.timer-types\u002F1.trestack-timer",{"title":40,"path":41,"stem":42},"Placement, countries, and translations","\u002Ftimer\u002Ftimer-types\u002Fplacement-and-targeting","1.timer\u002F2.timer-types\u002F2.placement-and-targeting",{"title":44,"path":45,"stem":46},"Cart page and cart drawer timers","\u002Ftimer\u002Ftimer-types\u002Fcart-timers","1.timer\u002F2.timer-types\u002F3.cart-timers",{"title":48,"path":49,"stem":50},"Email timers","\u002Ftimer\u002Ftimer-types\u002Femail-timers","1.timer\u002F2.timer-types\u002F4.email-timers",{"title":52,"path":53,"stem":54,"children":55,"page":29},"Performance and themes","\u002Ftimer\u002Freference","1.timer\u002F3.reference",[56,60,64],{"title":57,"path":58,"stem":59},"Performance notes","\u002Ftimer\u002Freference\u002Fperformance-notes","1.timer\u002F3.reference\u002F1.performance-notes",{"title":61,"path":62,"stem":63},"Theme compatibility","\u002Ftimer\u002Freference\u002Ftheme-compatibility","1.timer\u002F3.reference\u002F2.theme-compatibility",{"title":65,"path":66,"stem":67},"Running several timers at once","\u002Ftimer\u002Freference\u002Frunning-several-timers","1.timer\u002F3.reference\u002F3.running-several-timers",{"title":69,"path":70,"stem":71,"children":72,"page":29},"Billing, privacy, and data","\u002Ftimer\u002Faccount","1.timer\u002F4.account",[73,77,81,85],{"title":74,"path":75,"stem":76},"Billing, trials, and plan changes","\u002Ftimer\u002Faccount\u002Fbilling","1.timer\u002F4.account\u002F1.billing",{"title":78,"path":79,"stem":80},"Privacy and data, what the app stores","\u002Ftimer\u002Faccount\u002Fprivacy-and-data","1.timer\u002F4.account\u002F2.privacy-and-data",{"title":82,"path":83,"stem":84},"Data processing and subprocessors","\u002Ftimer\u002Faccount\u002Fdata-processing-and-subprocessors","1.timer\u002F4.account\u002F3.data-processing-and-subprocessors",{"title":86,"path":87,"stem":88},"Uninstalling TreStack Timer","\u002Ftimer\u002Faccount\u002Funinstalling-trestack-timer","1.timer\u002F4.account\u002F4.uninstalling-trestack-timer",{"title":90,"path":91,"stem":92,"children":93,"page":29},"When something is wrong","\u002Ftimer\u002Ftroubleshooting","1.timer\u002F5.troubleshooting",[94,98],{"title":95,"path":96,"stem":97},"When the timer does not appear","\u002Ftimer\u002Ftroubleshooting\u002Ftroubleshooting-app-blocks","1.timer\u002F5.troubleshooting\u002F1.troubleshooting-app-blocks",{"title":99,"path":100,"stem":101},"When the timer shows in the wrong place or looks wrong","\u002Ftimer\u002Ftroubleshooting\u002Ftroubleshooting-storefront-display","1.timer\u002F5.troubleshooting\u002F2.troubleshooting-storefront-display",{"title":103,"path":104,"stem":105,"children":106},"TreStack Bundles","\u002Fbundles","2.bundles",[107,110,131,160,185,198,219,244],{"title":108,"path":104,"stem":109},"TreStack Bundles docs","2.bundles\u002Findex",{"title":111,"path":112,"stem":113,"children":114,"page":29},"Getting a deal live","\u002Fbundles\u002Fstart","2.bundles\u002F1.start",[115,119,123,127],{"title":116,"path":117,"stem":118},"Getting started with TreStack Bundles","\u002Fbundles\u002Fstart\u002Fgetting-started","2.bundles\u002F1.start\u002F1.getting-started",{"title":120,"path":121,"stem":122},"Deal types and deal bars","\u002Fbundles\u002Fstart\u002Fdeal-types","2.bundles\u002F1.start\u002F2.deal-types",{"title":124,"path":125,"stem":126},"Creating, publishing and managing deals","\u002Fbundles\u002Fstart\u002Fcreating-and-publishing-deals","2.bundles\u002F1.start\u002F3.creating-and-publishing-deals",{"title":128,"path":129,"stem":130},"Development stores and testing safely","\u002Fbundles\u002Fstart\u002Fdevelopment-stores-and-testing","2.bundles\u002F1.start\u002F4.development-stores-and-testing",{"title":132,"path":133,"stem":134,"children":135,"page":29},"Building offers","\u002Fbundles\u002Fdeals","2.bundles\u002F2.deals",[136,140,144,148,152,156],{"title":137,"path":138,"stem":139},"Quantity breaks and Buy X, get Y","\u002Fbundles\u002Fdeals\u002Fquantity-breaks-and-buy-x-get-y","2.bundles\u002F2.deals\u002F1.quantity-breaks-and-buy-x-get-y",{"title":141,"path":142,"stem":143},"Bundles and mix and match","\u002Fbundles\u002Fdeals\u002Fbundles-and-mix-and-match","2.bundles\u002F2.deals\u002F2.bundles-and-mix-and-match",{"title":145,"path":146,"stem":147},"Free gifts and progressive gifts","\u002Fbundles\u002Fdeals\u002Fgifts-and-progressive-gifts","2.bundles\u002F2.deals\u002F3.gifts-and-progressive-gifts",{"title":149,"path":150,"stem":151},"Upsells, add-ons and personalisation","\u002Fbundles\u002Fdeals\u002Fupsells-add-ons-and-personalisation","2.bundles\u002F2.deals\u002F4.upsells-add-ons-and-personalisation",{"title":153,"path":154,"stem":155},"Subscriptions in a deal","\u002Fbundles\u002Fdeals\u002Fsubscriptions","2.bundles\u002F2.deals\u002F5.subscriptions",{"title":157,"path":158,"stem":159},"Products, dates and visibility","\u002Fbundles\u002Fdeals\u002Fproducts-dates-and-visibility","2.bundles\u002F2.deals\u002F6.products-dates-and-visibility",{"title":161,"path":162,"stem":163,"children":164,"page":29},"How a deal looks, and where","\u002Fbundles\u002Fdesign","2.bundles\u002F3.design",[165,169,173,177,181],{"title":166,"path":167,"stem":168},"Designing a deal","\u002Fbundles\u002Fdesign\u002Fdesign","2.bundles\u002F3.design\u002F1.design",{"title":170,"path":171,"stem":172},"Badges, timers and scratch-off","\u002Fbundles\u002Fdesign\u002Fbadges-timers-and-scratch-off","2.bundles\u002F3.design\u002F2.badges-timers-and-scratch-off",{"title":174,"path":175,"stem":176},"Variants, swatches and images","\u002Fbundles\u002Fdesign\u002Fvariants-swatches-and-images","2.bundles\u002F3.design\u002F3.variants-swatches-and-images",{"title":178,"path":179,"stem":180},"Prices, the sticky bar and the savings summary","\u002Fbundles\u002Fdesign\u002Fprices-sticky-bar-and-savings","2.bundles\u002F3.design\u002F4.prices-sticky-bar-and-savings",{"title":182,"path":183,"stem":184},"Translations, currencies and markets","\u002Fbundles\u002Fdesign\u002Ftranslations-and-markets","2.bundles\u002F3.design\u002F5.translations-and-markets",{"title":186,"path":187,"stem":188,"children":189,"page":29},"Prices at checkout","\u002Fbundles\u002Fcheckout","2.bundles\u002F4.checkout",[190,194],{"title":191,"path":192,"stem":193},"How the discount is applied at checkout","\u002Fbundles\u002Fcheckout\u002Fhow-the-discount-is-applied","2.bundles\u002F4.checkout\u002F1.how-the-discount-is-applied",{"title":195,"path":196,"stem":197},"Combining discounts, and store limits","\u002Fbundles\u002Fcheckout\u002Fcombinations-and-limits","2.bundles\u002F4.checkout\u002F2.combinations-and-limits",{"title":199,"path":200,"stem":201,"children":202,"page":29},"Tests and numbers","\u002Fbundles\u002Fmeasure","2.bundles\u002F5.measure",[203,207,211,215],{"title":204,"path":205,"stem":206},"Deal analytics","\u002Fbundles\u002Fmeasure\u002Fanalytics","2.bundles\u002F5.measure\u002F1.analytics",{"title":208,"path":209,"stem":210},"Added revenue","\u002Fbundles\u002Fmeasure\u002Fadded-revenue","2.bundles\u002F5.measure\u002F2.added-revenue",{"title":212,"path":213,"stem":214},"A\u002FB testing a deal","\u002Fbundles\u002Fmeasure\u002Fab-tests","2.bundles\u002F5.measure\u002F3.ab-tests",{"title":216,"path":217,"stem":218},"Smart A\u002FB tests","\u002Fbundles\u002Fmeasure\u002Fsmart-ab-tests","2.bundles\u002F5.measure\u002F4.smart-ab-tests",{"title":220,"path":221,"stem":222,"children":223,"page":29},"Billing, privacy, and when something is wrong","\u002Fbundles\u002Faccount","2.bundles\u002F6.account",[224,228,232,236,240],{"title":225,"path":226,"stem":227},"TreStack Bundles plans and billing","\u002Fbundles\u002Faccount\u002Fplans-and-billing","2.bundles\u002F6.account\u002F1.plans-and-billing",{"title":229,"path":230,"stem":231},"Going over your plan","\u002Fbundles\u002Faccount\u002Fgoing-over-your-plan","2.bundles\u002F6.account\u002F2.going-over-your-plan",{"title":233,"path":234,"stem":235},"Pausing, cancelling and uninstalling","\u002Fbundles\u002Faccount\u002Fpausing-cancelling-and-uninstalling","2.bundles\u002F6.account\u002F3.pausing-cancelling-and-uninstalling",{"title":237,"path":238,"stem":239},"Privacy, data and sub-processors","\u002Fbundles\u002Faccount\u002Fprivacy-and-data","2.bundles\u002F6.account\u002F4.privacy-and-data",{"title":241,"path":242,"stem":243},"When a deal does not show or prices look wrong","\u002Fbundles\u002Faccount\u002Ftroubleshooting","2.bundles\u002F6.account\u002F5.troubleshooting",{"title":245,"path":246,"stem":247,"children":248,"page":29},"Reference","\u002Fbundles\u002Freference","2.bundles\u002F7.reference",[249,252],{"title":57,"path":250,"stem":251},"\u002Fbundles\u002Freference\u002Fperformance-notes","2.bundles\u002F7.reference\u002F1.performance-notes",{"title":253,"path":254,"stem":255},"Theme compatibility and placement","\u002Fbundles\u002Freference\u002Ftheme-compatibility","2.bundles\u002F7.reference\u002F2.theme-compatibility",{"id":257,"title":57,"body":258,"description":603,"extension":604,"links":605,"meta":606,"navigation":607,"path":250,"seo":608,"stem":251,"__hash__":609},"docs\u002F2.bundles\u002F7.reference\u002F1.performance-notes.md",{"type":259,"value":260,"toc":586},"minimark",[261,276,306,311,314,317,337,345,348,351,355,358,424,427,430,433,436,440,443,454,463,467,502,506,550,554,557],[262,263,264,268,269,272,275],"p",{},[265,266,267],"strong",{},"Applies to:"," TreStack Bundles, every plan",[270,271],"br",{},[265,273,274],{},"Updated:"," 11 October 2026",[277,278,279,284],"callout",{},[262,280,281],{},[265,282,283],{},"At a glance",[285,286,287,294,300],"ul",{},[288,289,290,293],"li",{},[265,291,292],{},"Page with a deal:"," About 54 KB gzipped",[288,295,296,299],{},[265,297,298],{},"Other pages, embed on:"," About 10.5 KB gzipped",[288,301,302,305],{},[265,303,304],{},"Measured:"," 10 October 2026, Horizon, one page",[307,308,310],"h2",{"id":309},"what-loads-and-when","What loads, and when",[262,312,313],{},"The app embed Bundle deals adds one small script to every page of your store while it is on. It loads as a module script, which the browser runs only after the page's HTML is parsed, so it does not hold up the first render. That script, the loader, then starts the controller. Together they are about 1 KB plus about 10 KB, and they load on every page with the embed on, including pages without a deal and while no deal is published.",[262,315,316],{},"The controller looks for a deal for the product on the page. Only when there is one does it load deal-core, the widget itself, at about 44 KB. A few small parts load only when the page needs them:",[285,318,319,322,325,328,331,334],{},[288,320,321],{},"Sticky add to cart bar: about 0.8 KB",[288,323,324],{},"Gallery switching for featured images: about 0.6 KB",[288,326,327],{},"A\u002FB test variant choice: about 0.5 KB",[288,329,330],{},"Cart extras, such as Skip cart and go to checkout directly: about 1.2 KB",[288,332,333],{},"Translated widget texts: about 1.0 KB",[288,335,336],{},"Subscription choice kept in step with the theme: about 0.5 KB",[262,338,339,340,344],{},"On a product page, the embed writes the deal's settings and the product into the page's HTML, so the widget needs no request to our server to appear. The widget asks our server, through your store's own address (",[341,342,343],"code",{},"\u002Fapps\u002Fbndl","), only when it shows a product the page did not print, such as an app block set to another product on the home page, or when a deal targets a collection hidden from the online store. Details of other products in a bundle or a picker come from Shopify.",[262,346,347],{},"The widget loads no web fonts, no third-party scripts and no chat. Images you upload are served from your store's own Shopify Files.",[262,349,350],{},"The analytics pixel is separate. Shopify loads it in its own sandbox, only for shoppers who allowed analytics, and it sends deal views, add to carts and checkout starts to bndl-px.trestack.app. It is not part of the sizes on this page.",[307,352,354],{"id":353},"the-numbers","The numbers",[262,356,357],{},"Sizes of today's build, measured on 11 October 2026, gzipped:",[359,360,361,377],"table",{},[362,363,364],"thead",{},[365,366,367,371,374],"tr",{},[368,369,370],"th",{},"Part",[368,372,373],{},"Size",[368,375,376],{},"Loads on",[378,379,380,392,402,413],"tbody",{},[365,381,382,386,389],{},[383,384,385],"td",{},"Loader and its helper",[383,387,388],{},"1,030 bytes",[383,390,391],{},"Every page with the embed on",[365,393,394,397,400],{},[383,395,396],{},"Controller",[383,398,399],{},"9,477 bytes",[383,401,391],{},[365,403,404,407,410],{},[383,405,406],{},"deal-core",[383,408,409],{},"43,651 bytes",[383,411,412],{},"Pages that show a deal",[365,414,415,418,421],{},[383,416,417],{},"Total",[383,419,420],{},"About 54 KB",[383,422,423],{},"A product page with a deal",[262,425,426],{},"Each part has a size budget: 1.5 KB for the loader, 10.5 KB for the controller and 46 KB for deal-core. A test in the app's code fails when a part grows past its budget, so a heavier widget cannot ship by accident.",[262,428,429],{},"On 10 October 2026 we measured the build of that day, which was about 51 KB on a page with a deal, because deal-core was then about 41 KB. The test ran in a real Chrome with a mobile profile (CPU slowed 4 times, slow 4G network, empty cache) on a product page of a test store on Shopify's Horizon theme. With the widget, Largest Contentful Paint and Total Blocking Time showed no measurable change. Taps were handled in 16 ms or less. Layout shift was 0.038, caused by the widget appearing after the first paint.",[262,431,432],{},"That is one measurement on one theme. It is not a guarantee for every store, which is why the next section exists.",[262,434,435],{},"Two changes came out of that test. The moving text ring of a Border badge now pauses when it is off screen or the tab is hidden, which brought its cost down from 85 to 96 ms of main thread work per second to 12 to 13 ms, and it stops for shoppers who ask for reduced motion. A preload of the script in the page head was tried and removed, because it made Largest Contentful Paint slower.",[307,437,439],{"id":438},"measuring-your-own-store","Measuring your own store",[262,441,442],{},"Measure the page the deal is on, logged out, in a private window with no browser extensions. Lighthouse on a live store is noisy: two runs on an unchanged page often differ by several points. Run each version at least three times and compare medians, with the same device setting each time.",[262,444,445,446,449,450,453],{},"You do not need to change your theme to get a page without the widget. Add ",[341,447,448],{},"?bndl=off"," to the product URL (or ",[341,451,452],{},"&bndl=off"," when the URL already has a question mark) and the loader stops there: the controller, deal-core and the widget do not load. The page still carries the loader, about 1 KB, and the deal data in its HTML, so the comparison shows the widget's cost, not the embed's. Compare that page with the normal URL.",[262,455,456,457,462],{},"Compare Largest Contentful Paint, Total Blocking Time and Cumulative Layout Shift, not only the headline score. If the medians move by more than a couple of points, send us both sets of reports and the page URL through the live chat in the app or at ",[458,459,461],"a",{"href":460},"mailto:support@trestack.app","support@trestack.app",".",[307,464,466],{"id":465},"measuring-the-cost-in-four-steps","Measuring the cost, in four steps.",[468,469,471,476,479,485,488,492,495,499],"steps",{"level":470},"3",[472,473,475],"h3",{"id":474},"pick-one-product-page-with-a-deal","Pick one product page with a deal",[262,477,478],{},"Log out, open a private window and turn off browser extensions.",[472,480,482,483],{"id":481},"run-three-reports-with-bndloff","Run three reports with ",[341,484,448],{},[262,486,487],{},"Same device and throttling each time. Note the medians.",[472,489,491],{"id":490},"run-three-reports-on-the-normal-url","Run three reports on the normal URL",[262,493,494],{},"Change nothing else on the theme in the same session, or the comparison means little.",[472,496,498],{"id":497},"compare-the-medians","Compare the medians",[262,500,501],{},"Largest Contentful Paint, Total Blocking Time and layout shift, side by side.",[307,503,505],{"id":504},"settings-reference","Settings reference",[507,508,509,513,517,521,525,532,536,540,544],"field-group",{},[510,511,512],"field",{"name":391},"Loader and controller, about 10.5 KB gzipped, as a module script that runs after the HTML is parsed.",[510,514,516],{"name":515},"Page with a deal","Plus deal-core, about 44 KB. About 54 KB in total in the build of 11 October 2026.",[510,518,520],{"name":519},"Parts loaded when used","Sticky bar, gallery, A\u002FB, cart extras, translations, subscriptions: 0.5 to 1.2 KB each.",[510,522,524],{"name":523},"Budget","Loader 1.5 KB, controller 10.5 KB, deal-core 46 KB, gzipped. Checked by a test in the app's code.",[510,526,528,529,531],{"name":527},"Deal data","Written into the product page by the app embed. The ",[341,530,343],{}," address is asked only for products the page did not print.",[510,533,535],{"name":534},"Measured LCP and TBT","No measurable change, 10 October 2026, Horizon, mobile profile, one product page.",[510,537,539],{"name":538},"Layout shift","0.038 in the same measurement, from the widget appearing after first paint.",[510,541,543],{"name":542},"Badge ring","Pauses off screen and in a hidden tab; stops for reduced motion.",[510,545,547,549],{"name":546},"Opt-out for testing",[341,548,448],{}," on a storefront URL turns the widget off for that page view.",[307,551,553],{"id":552},"if-this-does-not-work","If this does not work",[262,555,556],{},"The failures most likely on this procedure, with the check that resolves each one.",[558,559,560,568,572,579],"accordion",{},[561,562,564,565,567],"accordion-item",{"label":563},"The page shifts when the widget appears","The widget is added after the first paint, so it pushes what is below it down. On Horizon that measured 0.038; Google counts a layout shift up to 0.1 as good. Measure your own page with and without ",[341,566,448],{},", and send us both reports if the difference is larger.",[561,569,571],{"label":570},"The embed is on but no deal is published yet","Every page still loads the loader and controller, about 10.5 KB. If you will not publish a deal for a while, turn the Bundle deals embed off in the theme editor and turn it on again before you publish. No deal shows while it is off.",[561,573,575,576,578],{"label":574},"Your Lighthouse score dropped after publishing a deal","Check it dropped on the median of three runs rather than one, against ",[341,577,448],{}," on the same page, with nothing else changed on the theme. If the median really moved, send both sets of reports and the URL.",[561,580,582,583,585],{"label":581},"The network panel shows a request you do not recognise","The scripts come from Shopify's CDN under the theme extension's assets. Requests to ",[341,584,343],{}," on your own domain and to bndl-px.trestack.app are the app's. Anything else belongs to your theme or another app.",{"title":587,"searchDepth":588,"depth":588,"links":589},"",2,[590,591,592,593,601,602],{"id":309,"depth":588,"text":310},{"id":353,"depth":588,"text":354},{"id":438,"depth":588,"text":439},{"id":465,"depth":588,"text":466,"children":594},[595,597,599,600],{"id":474,"depth":596,"text":475},3,{"id":481,"depth":596,"text":598},"Run three reports with ?bndl=off",{"id":490,"depth":596,"text":491},{"id":497,"depth":596,"text":498},{"id":504,"depth":588,"text":505},{"id":552,"depth":588,"text":553},"What the TreStack Bundles storefront code weighs, what loads on which page and when, one dated measurement on one theme, and how to measure your own store so the numbers compare.","md",null,{},true,{"title":57,"description":603},"MOcxxRkwMWbPKxoU8v9VFKx6V8B28tfABeHr8a_1mxU",[611,613],{"title":241,"path":242,"stem":243,"description":612,"children":-1},"The store widget is off, deals are paused, a deal is not reaching one product, or the cart and checkout price surprise you. What to check, in order, and how to reach us.",{"title":253,"path":254,"stem":255,"description":614,"children":-1},"Where the widget places itself, the app block for a custom position, which themes the widget knows and which are verified, page builders, quick view, cart drawers, other bundle apps, and what to redo when you switch themes.",1791656486581]