New homepage banner, and a calmer add to cart
B lost. The new add-to-cart behaviour costs orders on phones. The banner, for the second time, does nothing.
- Money. $24,698.57 on A against $22,474.23 on B, $2,224.34 less over five and a half days. Per visitor, $1.31 against $1.20, B 10% behind. Orders 481 against 451, basket $51.15 against $49.42.
- Where it went wrong, exactly. Both versions fill baskets at the same rate (9.0% and 8.9% of visits). Both finish checkout at the same rate once there (57% and 58%). The one step that moved is the one right after add to cart: 48.4% of A's baskets carry on to checkout against 43.6% of B's, and at z -2.8 that is not chance.
- It is a phone problem. On phones, 46.3% against 40.4% of baskets carry on, z -3.2. On desktop, 63.9% against 62.1%, level. The drawer that B stops opening covers the whole screen on a phone and is a side panel on desktop, which is exactly the pattern you would draw if the drawer were the cause.
- The banner is cleared, twice. NB09 ran the same banner without the add-to-cart change and this step was level (45.6% against 44.1%). Across both tests and 64,045 visits, the banner moves add-to-cart by nothing: 8.93% against 8.96%. The section The same banner, twice lays it out.
- Smaller baskets too. B orders hold 3.91 items against 4.12, 5% fewer. The drawer is where the cart recommendation lives; when it never opens, nobody sees it. Not proven, but it is the obvious mechanism and it fits the basket-size gap.
- This was called on day two. The day-2 readout flagged the phone cart-to-checkout step as "the one number that moves in the direction the change could plausibly cause", at z -1.6 on 724 baskets. It grew to z -3.2 on 2,790. Noise shrinks with more data; this grew.
Decision: do not ship B's add-to-cart behaviour on phones. See What to do next. The end-to-end conversion gap on its own (2.46% against 2.24%, z -1.4) sits just inside chance; the step that causes it does not, and the money agrees with the step.
The numbers that decide it: visits that buy, and money per visitor
The scoreboard
Where B lost people
The four steps every shopper walks: visit, add to cart, reach checkout, pay. If the new version changed anything, it shows up as a band between two steps where B keeps fewer people than A. Three of the four bands are level. One is not.
By device, and the US on its own
| Visitors | A visits | A to cart | A cart → checkout | A bought | B visits | B to cart | B cart → checkout | B bought | z cart→chk | z bought |
|---|---|---|---|---|---|---|---|---|---|---|
| Phones, all markets | 14,774 | 9.5% | 46.3% | 2.49% | 14,704 | 9.4% | 40.4% | 2.14% | -3.2 | -2.0 |
| US phones | 6,464 | 9.1% | 48.4% | 2.82% | 6,531 | 8.6% | 40.4% | 2.13% | -2.7 | -2.5 |
| Desktop, all markets | 3,179 | 6.5% | 63.9% | 2.49% | 3,180 | 6.5% | 62.1% | 2.52% | -0.4 | +0.1 |
| Tablet, all markets | 856 | 8.6% | 44.6% | 1.99% | 882 | 9.6% | 50.6% | 3.06% | +0.8 | +1.4 |
The same banner, twice: NB09 against NB10
NB09 tested this banner with the product-page tip text, and no change to add to cart. NB10 tested the same banner with the add-to-cart change, and the tip text in both versions. Put side by side, the two runs separate the banner from the drawer without a third test.
| NB09 A | NB09 B | z | NB10 A | NB10 B | z | |
|---|---|---|---|---|---|---|
| Visits | 13,150 | 13,248 | — | 18,843 | 18,804 | — |
| Added to cart | 8.86% | 9.06% | +0.6 | 8.98% | 8.89% | -0.3 |
| Cart → checkout | 45.6% | 44.1% | -0.7 | 48.4% | 43.6% | -2.8 |
| Visits that bought | 2.22% | 2.14% | -0.5 | 2.46% | 2.24% | -1.4 |
| Basket | $47.35 | $49.87 | — | $51.15 | $49.42 | — |
Day by day
| Day | A orders | A basket | B orders | B basket |
|---|---|---|---|---|
| 17 Sep | 73 | $49.10 | 73 | $49.45 |
| 18 Sep | 88 | $48.50 | 78 | $49.49 |
| 19 Sep | 117 | $53.46 | 98 | $47.82 |
| 20 Sep | 100 | $53.34 | 92 | $52.19 |
| 21 Sep | 66 | $53.02 | 71 | $50.92 |
| 22 Sep | 37 | $44.94 | 39 | $43.96 |
What each shopper saw
Shoppers in the US, UK, Canada, Australia, Singapore, Hong Kong and the International market were split 50/50 and stayed in their version for every visit. EU was not in the test. The sticky "Choose your Nanobag" pill on phones and the tip text under the buy button are standard and were in both versions.
- Homepage: the hero video with its SHOP NANOBAG button on desktop.
- Add to cart: the cart drawer slides open on every add, with the checkout button in it.
- Homepage: Ashit's banner from NB09 with a Get Nanobag button on desktop.
- Add to cart: the product image flies to the cart icon and the badge bumps; the drawer stays closed.
Where the visitors came from
What people did on the page
/products/, segments Arm A and Arm B, 17 to 21 Sep. It should exist before NB11 starts, not after.nb_arm_view twice because the tab nests the button-location field under an event that does not carry it; one row is GA4's "(not set)" and the second value is unexplained but feeds nothing here. The bare-id column (5,716 visits, 29%) is shoppers who landed straight on a product page and never saw a homepage; it belongs to neither version and is left out, which is why GA4's version visits run under Shopify's.Four systems count this test. Here is how they compare.
| Where it comes from | A | B | How much it sees | What it actually counts |
|---|---|---|---|---|
| Shopify Analytics sales report | 481 | 451 | Every order, version read from the rollout cookie at checkout, counted on Shopify's servers. This is the count that decides the test. | |
| Shopify order tags via Flow, six markets, to the pause | 350 | 328 | A tag our own workflow writes as each order is placed, independent of the reports. Six-country gate, the same on both sides. Ratio 1.067 against the sales report's 1.067. A further 25 and 24 orders were tagged after the pause, because shoppers' browsers still held a version; those are left out, as NB09 taught us to. | |
| Shopify Analytics sessions report | 464 | 422 | Tracked visits that ended in an order. Lower by design. Carries every rate on this page. | |
| GA4 purchases, 17 to 22 Sep | 333 | 310 | Only the orders the shopper's browser reported back, and only from visits that saw the homepage. A includes some post-pause traffic. Always the lowest. |
What they agree on
What to do next
- Do not ship the drawer change on phones. Roll the rollout back rather than apply it. The fly-to-cart code stays on the theme behind its switch, off, exactly as it was before the test.
- If the animation is still wanted, it needs a route to checkout on phones. The drawer was doing two jobs: confirming the add, and putting a Checkout button under the thumb. The badge bump replaces the first and not the second. Options, cheapest first: keep the drawer on phones and fly-to-cart on desktop only, where it is level; or fly-to-cart everywhere with a persistent "View cart · Checkout" bar that appears after the add. Either is a new test, not a tweak.
- Run the homepage-to-product-page funnel before deciding the banner. Two runs, sixty-four thousand visits, no movement at add to cart or beyond. The one step the banner exists to move was never measured directly, and the rough derivation above leans, if anywhere, against it. Five minutes in GA4 settles it: if B sends fewer homepage visitors to product pages, drop the banner; if level, ship it on taste. Either way, no third test.
- Look at what the drawer's recommendation band is worth. B's baskets held 5% fewer items and were $1.73 smaller. If that is the missing upsell, the drawer earns more than its confirmation job. Worth a look before anyone proposes hiding it again.
- Housekeeping before NB11. Switch off the NB09 workflow, which is still tagging live orders. Put the country exclusion on all three branches of the NB10 workflow, or its successor, so the unattributed bucket stops collecting Europe. And build the page-to-page funnel exploration for whatever NB11 changes before it starts, so the step the test exists to move is measured from hour one.
Markets and devices
By country
| Country | A visits | A bought | A rate | B visits | B bought | B rate |
|---|---|---|---|---|---|---|
| United States | 9,097 | 230 | 2.53% | 9,246 | 197 | 2.13% |
| Australia | 4,134 | 109 | 2.64% | 4,132 | 105 | 2.54% |
| Canada | 1,132 | 22 | 1.94% | 1,180 | 20 | 1.69% |
| United Kingdom | 1,111 | 51 | 4.59% | 1,100 | 51 | 4.64% |
| Singapore | 552 | 9 | 1.63% | 470 | 10 | 2.13% |
| Indonesia | 394 | 0 | 0.00% | 392 | 0 | 0.00% |
| New Zealand | 362 | 4 | 1.10% | 319 | 10 | 3.13% |
| Hong Kong | 227 | 6 | 2.64% | 240 | 5 | 2.08% |
By device
| Device | A visits | A bought | B visits | B bought |
|---|---|---|---|---|
| Mobile | 14,774 | 368 | 14,704 | 315 |
| Desktop | 3,179 | 79 | 3,180 | 80 |
| Tablet | 856 | 17 | 882 | 27 |
Basket by shipping country
| Shipping to | A orders | A net | per order | B orders | B net | per order |
|---|---|---|---|---|---|---|
| United States | 242 | $13,167.66 | $54.41 | 214 | $10,831.66 | $50.62 |
| Australia | 113 | $5,396.06 | $47.75 | 112 | $5,667.09 | $50.60 |
| United Kingdom | 54 | $2,002.43 | $37.08 | 52 | $1,950.16 | $37.50 |
| Canada | 23 | $1,130.44 | $49.15 | 23 | $1,279.21 | $55.62 |
The same from GA4
| Country | A visits | A orders | B visits | B orders |
|---|---|---|---|---|
| United States | 5,876 | 149 | 5,820 | 137 |
| Australia | 3,483 | 102 | 3,429 | 81 |
| United Kingdom | 1,239 | 41 | 1,242 | 42 |
| Canada | 807 | 14 | 855 | 20 |
| Singapore | 462 | 6 | 376 | 8 |
| Indonesia | 351 | 0 | 327 | 0 |
| New Zealand | 302 | 4 | 273 | 7 |
| Hong Kong | 183 | 5 | 200 | 5 |
| Thailand | 208 | 7 | 154 | 2 |
| Philippines | 170 | 0 | 172 | 0 |
| Device | A visits | A orders | B visits | B orders |
|---|---|---|---|---|
| Mobile | 11,888 | 262 | 11,670 | 229 |
| Desktop | 1,325 | 56 | 1,207 | 52 |
| Tablet | 896 | 15 | 880 | 29 |
Which numbers to trust, and where they live
Shopify Analytics · sales report
Orders, sales and basket size per version. Every order, counted by Shopify. Self-cleaning at a pause: the version label simply stops.
Shopify Analytics · sessions report
Visits, carts and checkouts per version, country, device and traffic source. Every band on this page.
The Rollouts dashboard
Shopify's own test screen. No money, no export; it is a screenshot each time. Last captured 18 Sep: 2.53% against 2.55%, bounce 56.01% against 53.66%.
GA4 exploration
"NB10 – banner + ATC", four tabs. Explains, never decides; contaminated after a pause, so read to the pause only.
Order tags
Our own Flow. Independent of the reports, bounded to the pause, six markets. Used only to confirm the other three.
Launch checks and open items
| Check | Result |
|---|---|
| Code on main is the code on live | verified |
| Only the homepage decides the version | verified |
| The version matches what the shopper sees | verified |
| Version A is untouched | verified |
| The tip text cannot skew the result | verified |
| Order tags exclude non-test markets | open |
| NB09's workflow is switched off | open |
Where the test actually ran
In the test · 21 confirmed
Not in the test · 28
Order tags, in full
350 tagged control, 328 treatment, 309 unattributed, before the pause. The unattributed count is not a test figure: that branch has no country rule and collects European direct-to-product-page shoppers as well. After the pause the workflow kept tagging (25 and 24) because shoppers' browsers still held a version; the same fault NB09 had, and the reason every count here is bounded to the pause.
How this test was read
- Visits that buy and money per visitor decide.
- The funnel bands say where. A two-sample z past ±2 on a band is a real difference, past ±2.6 a solid one.
- Device and market cuts say whether the "where" matches a mechanism. Here they do.
- Clicks and traffic sources explain, they never decide.
- A finding flagged early that grows with more data is trusted more than one that appears at the end.
Appendix: queries, IDs and events
-- 1. Funnel by version FROM sessions SHOW sessions, sessions_with_cart_additions, sessions_that_reached_checkout, sessions_that_completed_checkout WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id SINCE 2026-09-17 UNTIL today ORDER BY sessions DESC LIMIT 2
-- 2. Orders and basket by version FROM sales SHOW orders, net_sales, average_order_value WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id SINCE 2026-09-17 UNTIL today ORDER BY orders DESC
-- 3. The same, by day FROM sales SHOW orders, net_sales, average_order_value WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id, day SINCE 2026-09-17 UNTIL today ORDER BY day ASC
-- 4. Visits and orders by version and country FROM sessions SHOW sessions, sessions_that_completed_checkout WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id, session_country SINCE 2026-09-17 UNTIL today ORDER BY sessions DESC LIMIT 16
-- 5. Funnel by version and device FROM sessions SHOW sessions, sessions_with_cart_additions, sessions_that_reached_checkout, sessions_that_completed_checkout WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id, session_device_type SINCE 2026-09-17 UNTIL today ORDER BY sessions DESC LIMIT 6
-- 6. Visits and orders by version and traffic source FROM sessions SHOW sessions, sessions_with_cart_additions, sessions_that_completed_checkout WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id, utm_medium SINCE 2026-09-17 UNTIL today ORDER BY sessions DESC LIMIT 10
-- 7. Returning customers inside the test, by version FROM sales SHOW orders, returning_customers, new_customers WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id SINCE 2026-09-17 UNTIL today ORDER BY orders DESC LIMIT 2
-- 8. Basket by version and shipping country FROM sales SHOW orders, net_sales, average_order_value WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id, shipping_country SINCE 2026-09-17 UNTIL today ORDER BY orders DESC LIMIT 16
-- 9. US only, by version and device FROM sessions SHOW sessions, sessions_with_cart_additions, sessions_that_reached_checkout, sessions_that_completed_checkout WHERE (rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304) AND session_country = 'United States' GROUP BY rollout_treatment_id, session_device_type SINCE 2026-09-17 UNTIL today LIMIT 10
-- 10. Items per order FROM sales SHOW orders, net_items_sold WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id SINCE 2026-09-17 UNTIL today ORDER BY orders DESC LIMIT 2
-- 11. Finding the pause: attribution by hour on the last day FROM sessions SHOW sessions WHERE rollout_treatment_ids CONTAINS 18022536 OR rollout_treatment_ids CONTAINS 18055304 GROUP BY rollout_treatment_id TIMESERIES hour SINCE 2026-09-22 UNTIL today
Rollout 9011336 "NB10 - Mobile ATC + Add to cart animation". Control 18022536 · Treatment 18055304. Theme version values 149369520264-A / -B, bare 149369520264 = no version. GA4 events, all carrying nb_arm: nb_arm_view, nb_home_sticky_click, nb_home_cta_click, nb_atc_click with atc_location sticky or main. GA4 segments: Arm A / Arm B = nb_arm_view carrying the version, same event, and Country ID not matching ^(AT|BE|BG|CY|CZ|DE|DK|EE|ES|FI|FR|GR|HR|HU|IE|IT|LI|LT|LU|LV|MT|NL|PL|PT|RO|SE|SI|SK)$.