One pillow store, one clear lever
72.3% of SnugWell orders contain a single item, and one product, the Therapeutic Pillow, is in 84.6% of them. The growth lever is the 1-to-2-pillow transition, and Kaching Bundles already owns that mechanic with a live 2-for-15% deal. So the Upnova build goes where Kaching is not: a cross-product Recovery Kit bundle builder and a free-gift threshold. Two offers built and parked inactive; the second-pillow BXGY was built, then rejected and archived. Nothing is live.
Sitewide offer check: the 50% off is the price, not a promo
The storefront runs a permanent "Spring Sale 50% Off + Free Delivery" announcement bar, but the mechanics live in compare-at pricing: the pillow sells at A$64.95 against a A$129.90 compare-at on every variant. There is no sitewide discount code to replace or stack against. The email capture ("Enter your email and get 10% OFF") is a list incentive, not a sitewide offer. Verdict: Upnova offers compete on top of the marked-down prices above, and no replacement decision is needed.
Existing deals inventory
Kaching Bundles is live and doing real volume. Quantity-break deals per SKU, read from the live storefront config:
| SKU family | Tiers live | Evidence it works |
|---|---|---|
| Therapeutic Pillow | 2 for 15% off, 3 for 20% off, each with a free gift | 430 orders used the "2 Pillows" discount in 90 days |
| Massager | 2 for 10% off, with a free gift | 268 orders used the "1 Massager" discount |
| Cushion | 2 for 10% off, 3 for 20% off | 7 orders used "2 Cushions" |
| Belt | 2 for 10% off, 3 for 20% off | Small: 1 order |
| Bamboo Align Pillow | 2 for 10% off, 4 for 20% off | 2 orders |
| Eye Mask | 2 at a set price, 3 at a set price plus a free gift | 2 orders |
| Sciatica ebook | Attached free to pillow and massager deals | 717 orders carried it at A$0.08 net |
Upnova state on the store: the cart drawer (cart-winston) is already installed and heavily styled to the brand, and one automatic product-recommendation widget (bottom of cart, flow 9873) is active from an earlier session. All three earlier offers were switched off before this analysis.
Order size decides the offer type
Counting actual items per order across 2,865 sampled orders (83.4% of all orders, two date windows): 2,071 contain one item. The store is Case A, which points to Buy X Get Y as the lead play.
Items per order, 2,865 sampled orders
Order value distribution, 3,210 sampled orders
X is unambiguous: the Therapeutic Pillow
Chosen by order count, not revenue. The pillow appears in 2,423 of 2,865 sampled orders; the next real product (the massager) appears in 252. And 16.0% of pillow orders already contain two or more pillows, driven by the Kaching 2-for-15% deal. That 16% is the free-rider floor any second-pillow offer inherits.
What else is in the cart on pillow orders
Discount inventory and stacking
Discount usage over the last 90 days, from ShopifyQL:
Discount usage by title, 90 days
| Discount | Status | Combines with product discounts |
|---|---|---|
| WELCOME10 (code, 10% off) | Active, no end date | Yes: product-discount combination is enabled, so it stacks with Upnova BXGY |
| Kaching quantity breaks (2 Pillows, 1 Massager, etc.) | Active, automatic | Price-rule style discounts; stacking with an Upnova BXGY on the same units must be tested before both run |
No popular code blocks product-discount combination, so nothing needs to be reconfigured before Upnova offers go live. The one real stacking risk is Kaching's own "2 Pillows 15%" bar versus the Upnova second-pillow offer, covered in the verdict below.
Brand style detection
Read from the live DOM, not theme CSS guesses: product titles render in Figtree (computed style on the pillow PDP h1), the buy button is #2488ea, and the theme's radius tokens are 14px on buttons and inputs, which is a rounded aesthetic. The installed cart-winston template is the correct rounded variant, the brand color is already stored in cart settings, and the merchant's custom CSS already pulls Figtree into widget titles. No style changes are needed.
The offers, built and parked
Status: two offers are inactive, one was built and then rejected and archived. Nothing is live. Review links are in Upnova admin under each offer.
Offer 1: Recovery Kit bundle builder (offer 1795)
| Pick pool | 8 products: pillow, massager, cushion, belt, eye mask, power bank, pillow cover, bamboo align pillow |
| Tiers | Buy 2, save 10%; Buy 3, save 15% |
| Headline | Richtext, verified in the isolated preview: bold 28px "Build Your Recovery Kit" with the full deal in the subheadline, "Any 2 items save 10%, any 3 save 15%" |
| Why it fits | It is the only surface Kaching does not own. Kaching runs per-SKU quantity breaks; the bundle builder sells cross-product kits (pillow plus massager, pillow plus cover), which is where the co-purchase data points next |
| Reach | Dedicated bundle page plus entry widgets; new surface, so reach builds from zero |
| Stacking | Cross-product bundles do not collide with the per-SKU Kaching tiers. Only a shopper bundling multiple units of one SKU would touch both systems |
| State | Offer 1795 inactive. The first build (1794) had a flat one-line headline and is superseded, its title now says so |
| Blocker | The bundle builder page template does not exist in the Shopify theme yet. Upnova flags this at creation; the theme template must be added before this offer can go live |
Interactive preview, bundle page (real products, draft config)
Offer 2: Free Eye Mask over A$95 (offer 2338)
| Threshold | A$95. A single-pillow order (A$64.95) crosses it by adding one pillow cover (A$32.95): A$97.90 |
| Gift | SnugWell Therapeutic Eye Mask, A$22.95, 3.5% of the threshold, the cheapest real gift SKU that is not already given away free by Kaching |
| State | Offer 2338 inactive |
| Reach | Cart drawer surface: the progress bar renders for every cart session |
| Free-rider | 25.2% of orders already sit at A$95 or above and would claim the gift anyway; 74.8% get the nudge to add more. Under the 30% gate |
| Preview | No interactive preview surface exists yet for the free-gift offer type (tooling gap, not a store problem). Config above is verbatim from the created offer |
Rejected: Buy X Get Y, 20% off a 2nd pillow (offer 3020, archived)
The single-item majority points at a second-pillow BXGY, and one was built as offer 3020 with a linked PDP widget. Then the overlap check killed it: Kaching already runs 2-for-15% on the pillow, used by 430 orders in 90 days, and a 2-for-20%-on-the-second Upnova offer on the same units would stack with it and regress the customer's existing deal (A$116.91 versus the Kaching A$110.42 for two). The mechanic is proven here, which is exactly why Upnova must not duplicate it. Offer 3020 is archived; nothing references it.
Preview of the rejected build, kept as the record
Not built: Order Volume
A A$150 tier would qualify 10.8% of orders. Kept out of the standing stack, campaign use only, to avoid training customers to wait for discounts. Per-SKU volume stays with Kaching.
How the Kaching overlap is resolved
Division of labour, not competition: Kaching keeps per-SKU quantity breaks on every SKU family, Upnova takes the two surfaces Kaching cannot do, cross-product bundles and a threshold gift in the Upnova cart. WELCOME10 combines with product discounts and stacks cleanly on both. No pillow volume offer goes live from Upnova unless Kaching's pillow deal is retired first, and that is a separate decision.
Decision chart, confirmed tier
What ships next
- Add the bundle builder page template to the Shopify theme (prerequisite for offer 1795).
- Activate the bundle builder and free gift briefly, verify rendering and discount logic in a real cart, deactivate immediately.
- Merchant go-ahead, then activate for real. Store traffic is about 1,400 sessions a day at a 3.7% conversion rate, so signals arrive within days.
Sources and method
Order data: ShopifyQL sales dataset via the Upnova merchant MCP for shop krqjui-nb.myshopify.com, Aug 5 to Nov 3, 2026. AOV: native average_order_value with Online Store channel and excludes_post_order_adjustments filters. Items-per-order and co-purchase: sales grouped by order name and product title in two windows (2,865 of 3,436 orders captured; proportions stable across windows). Order values: gross sales plus discounts per order, 3,210 rows. Store prices: AU-market storefront JSON (the shop's primary market, AUD). Brand style: computed style from the live pillow PDP (Figtree titles, #2488ea buttons, 14px radii). Kaching config: window.__kachingCartBundlesDeals from the live storefront. Reach is the share of SHOPPERS the offer is EXPOSED to (widget placement times how many orders touch that surface), independent of how many qualify. Free-rider is the share of qualifying orders that would trigger anyway.