Bundles, CRO, SEO & Support Retainer

Tuff Pupper

A DTC dog gear brand with the catalog of an adventure label and a Shopify store that wasn't pulling its weight. It started as one bundle build in May and became a five-month retainer: native bundles and a cart that sells, a search and content system, a custom support chat, and steady fixes to the pages buyers actually land on.

0.03 Product page CLS bungee leash page, down from 0.40 to 0.64
133/133 Products SEO-complete unique title and meta, 26 of 112 had no title
0 App Store apps added bundles, cart rail and support chat built in-house

Tuff Pupper Tracker harness product page with the Build-the-Kit picker showing Just the Harness, Walk Set and Full Kit tiers, each with product thumbnails and free shipping labels

The Store

Tuff Pupper, run by founder Logan Edwards, sells rugged dog gear on Shopify: harnesses, leashes, collars, the PupFlask water bottle, plus bowls, toys, grooming tools and apparel. Amazon is the brand’s main channel, where it carries thousands of reviews, and the Shopify store was the underdeveloped one. Every extra item in a Shopify order makes that channel work harder, so raising average order value isn’t a nice-to-have here. It’s the economics of the channel.

The competitive set is well established. Wild One sells a discounted Walk Kit assembled inline on a single product page, with over 1,400 reviews on that one kit. Ruffwear curates harness, leash and collar as a starter kit and walks buyers to the right harness by use case. Both monetize the same few mechanics. In May, Tuff Pupper had none of them.

The Opportunity

I opened with a sourced pre-engagement audit of the live store against those two competitors, every claim tied to a fetched URL. Three gaps stood out.

No bundles. Tuff Pupper had zero kit SKUs. A harness, a leash and a collar are a natural set, and the brand sold all three, but a shopper had to find and add each one separately.

A harness range a buyer can’t self-route. Several harness families with overlapping positioning. Tracker and Trailblaze are both waterproof, both have a lifting handle, both sit around the same price, and nothing on the site said which one to pick.

A $35 free shipping bar with nothing to fill it. Many bestsellers sit well under the threshold. A $13.96 collar alone falls more than $20 short, and nothing in the cart helped close the gap.

Milestone 1: Build-the-Kit and a Cart That Sells

A native bundle picker on every harness page

Every harness with a matching leash and collar now carries a Build-the-Kit panel with three tiers: Just the Harness, Walk Set (harness and leash, recommended by default) and Full Kit (harness, leash and collar). One button adds the whole kit, and Shop Pay express carries the full bundle through a multi-line cart permalink, not just the harness. The savings run on Shopify’s own automatic Buy X Get Y discounts, set to exact dollar amounts ($3 and $5) so the price on the picker matches the cart to the cent.

The detail work is where a bundle feels solid or broken. Change the harness color and the picker swaps every thumbnail and finds the closest matching color on each add-on, exact match first, then a fuzzy word match, so March Red maps to Crimson Red. If that color is sold out it falls back to an in-stock one, and the thumbnail always shows what will land in the cart. When the selected size is out of stock, an inline status row appears and both the kit button and Shop Pay disable. On mobile, three competing buttons used to stack above the fold and the red one stole taps meant for the bundle. I collapsed that into one buy surface with a kit-aware sticky button, and shrank unselected tier cards from 350 to 450 pixels tall down to 80 to 110 so the picker doesn’t swallow the screen.

After the first review, Logan’s note was that the bundles felt more like pricing widgets than coordinated gear. So the merchandising pass gave each tier real product names instead of category nouns, bigger thumbnails, a one-line reason the pieces work as a set, and a Matched Pair label on the Full Kit, since that leash and collar share the same ballistic nylon and 3M reflective trim.

Audited before launch

Before it shipped I ran nine parallel deep audits across the async lifecycle, the state machine, edge cases, the cart, accessibility, CSS, mobile iOS, the Shopify integration and performance. Fifteen fixes shipped before go-live. The worst one would have shown the picker total $5 to $10 over the real bundle price after a color-then-size flip, and it got a structural fix to the price math rather than a patch. The module added about 18 KB to the page and met WCAG 2.2 AA: eyebrow contrast raised from 4.6:1 to 7.1:1, card borders from 1.5:1 to 3.1:1, a visible focus ring, out-of-stock tiers announced to screen readers, and 44 px tap targets. It went live on May 22.

A cart rail built on what people actually buy

Under the free shipping bar, the cart drawer shows up to three add-ons when the cart is under $35, and it re-renders server-side on every cart change. In June I tightened it after live use. The bar now says the exact amount left (“Add $10.04 for free shipping”). At Logan’s request the rail only offers items that need no extra decision, so nothing that needs a size. The cheapest item that actually closes the gap moves to the first slot with an “Unlocks free shipping” label, at 7.17:1 contrast.

In September I reordered every suggestion list on measured co-purchase data from recent orders instead of hand curation. The leash-with-a-harness pairing kept its lead slot because the orders backed it. The same review caught a real bug: on five of eight harnesses the cart promised a leash would unlock free shipping, but the leash triggered the $3 bundle discount, so the cart grew by less than the label price and stopped short. That label was wrong every time it showed. It’s correct now, and the cart shows the amount saved next to each bundle name.

More bundles, picked from order data

The bundle pattern spread past harnesses. A leash and collar bundle went live on the Chew Proof Leash page in July. In September three more automatic bundles followed, each paired from what customers already bought together: Bath Robe with Shammy Towel, the Avail leash with the Bungee Handle collar, and the Metro harness with the same collar. The accessory is always the discounted item, so free shipping still applies. The picker also stopped advertising savings on two harnesses that had no bundle discount behind them, and falls back to the next add-on when one sells out instead of showing an empty choice.

Search: From Page Two to a System

The SEO work started with real Search Console data. Products were ranking on page two for big category terms with thousands of impressions and almost no clicks, because their titles were internal names. The rounded-bristle brush was showing for “dog brush” and “pet brush” under the title “Rounded Bristle - Brush”. I rewrote titles, meta descriptions and opening copy in waves, starting with the products closest to page one and front-loading the exact query each one already had impressions for. By the end of September, 133 of 133 active products carried a unique SEO title and description, up from 26 of 112 with no title at all in July.

The technical layer got the same treatment:

  • Every collection page was emitting invalid structured data, so Google discarded all category schema. I rebuilt it, gated review ratings on real reviews, and added return policy and shipping details to the Product markup.
  • Google had 164 pages indexed against 979 not indexed, with 544 crawled and not indexed. I blocked the feed and filter crawl traps in robots.txt and noindexed paginated pages, so crawl budget goes to pages that can rank.
  • I wrote alt text for 357 product images across the optimized products, then went back for whole galleries, every photo naming the color and size.
  • I retired duplicate and legacy collections with clean redirects, and mapped 18 old page URLs that returned 404 to their live equivalents.
  • All 13 blog posts told Google, in their structured data, that the homepage was their main page. Each one now points at itself.

The catalog got category hubs for grooming, leashes, bowls, PupFlask and toys, each with real category copy and links into the products, plus distinct titles on look-alike products that were competing with each other. Toys were repositioned around aggressive chewers, which is who actually buys them.

Buying Guides That Sell

The blog had a few general exercise posts and no buying guides. I built guides from the real catalog, picked from search data: best dog brush by coat type, dematting comb versus undercoat rake versus deshedding tool, best dog leash by use case, how to choose a dog bowl, the best toys for chewers, how to stop dog shedding, and how to put on and fit a harness. Every product claim comes from the product’s own specs.

Then I made them look like Tuff Pupper. The redesign uses the brand fonts and colors, real product photos and product cards that link to the item. It also fixed a sitewide bug where every article heading had always rendered in Times New Roman. In September a product rail went under the guides, showing photo, price and add to cart for the gear each guide discusses. Nine of the ten top-landing blog posts had produced no sale, and most had no direct way to buy what they discussed. FAQ and HowTo markup runs on the guides and the top product pages, and every question and answer is visible on the page, as Google requires.

The Warranty Page: The Biggest Landing Page

Clarity showed something nobody had looked at. The warranty activation page was the single biggest landing page on the site, ahead of the homepage, because Amazon buyers come to register what they bought. The URL printed on the insert cards in every package had stopped resolving after an earlier site rebuild. I redirected it and the other spellings people type.

The page itself was where most of the site’s dead clicks happened. A spin-to-win popup was firing over the form, so I excluded both warranty pages from it. The claim form moved to the top on phones, every card on the activation page now jumps to its form, and the fields and button grew to thumb size (38 to 48 pixels). A fallback form now works if the email platform’s form fails to load. There’s an Activate Warranty button in the top navigation, a row of real products under the form, and a thank-you offer once the warranty is registered. A visitor who arrives to register a harness they bought on Amazon now has a reason to buy the leash on Shopify.

Sizing and Product Answers

Sizing is the biggest reason a harness buyer hesitates, so I treated it as data rather than images. I audited all eight harness size charts against the brand’s own chart images and found three wrong. Tracker was wrong on all four rows and missing its X-Small tier, Fast Fit was wrong on all six, and one harness had no chart at all. After corrections, I transcribed charts for the rest of the catalog into structured product data. Products with a size chart went from 15 to 52, and every chart fits a 360 pixel phone screen. The worst one used to run 680 pixels off the edge.

Every harness now has a numbered fit guide and the questions people actually ask, written from that product’s own chart and description. Two of the eight had this before. The harness size guide page went from four lines of text to a hub listing every harness by chest range, with a section on dogs that back out of a harness. Collection filters now group 13 raw color names into seven families on the harness page, and size is a filter for the first time. On the Tracker, 18 of 23 photos used to share one description, which silently broke the color-filtered gallery. Each photo is named now, and picking a color shows that color’s photos.

Faster, Steadier Pages

The measured mobile baseline in May was a Performance score of 38 on the homepage. The cause is mostly a third-party stack the theme can’t fix on its own, so I went after what the theme did control.

  • Product page layout shift. The bungee leash page scored a CLS of 0.40 to 0.64 across runs, a clear fail. I traced it to two theme causes: the color gallery filtering after first paint, and a stray margin on the kit picker. The fix resolves the gallery in Liquid, so the first paint is the final one. CLS dropped to 0.03, the main photo arrived in about 6 seconds instead of 11.6 on a slow connection, and the same fix took Trailblaze from 0.16 to 0.03 and Fast Fit from 0.18 to 0.03, alongside seven other products.
  • Collection banners pushed the first product below the fold on phones. On desktop, not a single product reached the first screen. Shorter banners with a crop setting per template moved the first product up about 220 pixels on mobile and put four products on the first desktop screen.
  • The email popup’s minimized teaser was sitting on top of the mobile sticky Add to Cart. Of eight test points across the button, five hit the teaser and one reached the button. Now all eight do. In October a page-scroll freeze on product pages was traced, fixed the same day and retested on nine product pages.
  • Smaller fixes: iOS zooming on the quantity box, a sticky buy bar covered by the back-to-top button, collection prices showing a sold-out variant’s price, and theme demo search suggestions (“Cat toys”) on a dog brand.

A Custom Support Chat, No Chat App

In August I built and launched a support assistant on tuffpupper.com from scratch. The front end is a native theme component with a branded launcher, streaming replies, quick-reply chips, a full accessibility pass and a kill switch. Behind it is a Cloudflare Workers backend with a database and one live session per visitor. A read-only custom Shopify app gives it live order lookup, matched on order number plus email, so one customer can never see another’s order. It answers from the real catalog with live prices and stock, it knows which product page the shopper is on, and it uses that product’s own size chart for “will this fit” questions.

Hand-off was designed with the brand. Logan defined 11 escalation triggers, from a human request to an order problem to a safety incident. Escalations post to the team’s Slack, with an email copy and the customer’s reply-to address. Two adversarial audits ran before launch, 42 confirmed issues in the first alone, and every one was fixed. A full re-audit in September confirmed 57 more findings, all fixed except the few that needed the owner’s call, and the backend now runs 160 unit tests. In its first weeks, real customers mostly asked product questions (44 percent), sizing and fit (24 percent) and order status (8 percent). That told me where the product pages themselves were still leaving people unsure.

Launches and Catalog Care

The retainer also keeps the catalog honest:

  • Comfort Pajamas. The 12-product line was set up with size charts, its own auto-updating collection, a custom category tile and SEO on every product, with the first two patterns live and the rest ready as stock arrives.
  • Bubblegum Pop hoodie. Eight variants had been unpublished from the Online Store at the variant level while still showing on social and Google channels, which hid a whole in-stock colorway from the website. I restored them and swept all 157 products for the same issue.
  • Fall apparel. Ahead of the October email campaigns, the raincoat, hoodie, sweater, fleece and coat pages got size tables and fit guides. The raincoat also got a features strip under Add to Cart, and its “You may also like” row now recommends apparel instead of bottles and harnesses.
  • Analytics. I set up GA4 key events and a checkout funnel, then cross-checked GA4 against real Shopify orders. GA4 was undercounting purchases, and you can’t optimize what you’re measuring wrong.

Built Without Apps, On Purpose

None of this added an App Store app or a monthly app subscription. The bundles run on Shopify’s own discounts. The cart rail, the fit guides, the product answers and the size charts are native to the theme, and the support chat runs on the brand’s own infrastructure with a private, read-only order lookup. The first audit had surfaced the cost of the opposite approach already on the store: paid app pixels that were no longer connected, and leftover script from a long-removed app still loading on every product page. That’s exactly the dead weight an app-bloat scan of the page turns up. Building revenue features natively keeps the page fast and the stack lean.

What’s Next

Next up is a post-purchase offer that suggests matched add-ons after checkout, and a warranty registration flow for Amazon buyers. A more compact bundle block on phones is queued for its own measured week, so each change gets read on its own. The remaining mobile speed ceiling is third-party: duplicated popup, review and session-replay tools. Trimming those is the biggest single performance win left, and it cuts subscription cost too.

How Success Is Measured

At this store’s order volume, a confident conversion-lift percentage inside a sprint would be fiction, so I don’t claim one. Each change ships with a documented reason behind it (the Wild One pattern, one primary call to action per page, measured co-purchase data) and gets read against a baseline over weeks, not days. Bundle adoption is counted from a line-item property written on every kit add. Small windows get reported as “too early to call” when that’s the truth. That’s the honest version of measurement for a store at this stage, and it’s the version the client gets.

Key Takeaway

On an underdeveloped Shopify channel, the work that pays most usually isn’t a redesign. It’s adding the order-value mechanics the catalog was already built for, natively, then fixing what stops a buyer from trusting the page: wrong size charts, titles Google can’t match, a warranty link that goes nowhere, a popup sitting on the buy button. Do them one at a time, verify each on the live store, and measure in a way that holds up at the store’s real volume.

For related work, see the WD Electronics retainer for a cart-drawer rebuild and weekly CRO on a high-ticket store, or the Enea Studio engagement for the same engineering depth across six sprints. The techniques are written up in build a Shopify bundle without an app, the free shipping progress bar without an app, Shopify size charts without an app and the Shopify CLS survival guide.


Running a Shopify store that leaves order value on the table? Book a free strategy call and I’ll map the fixes that would pay off first.

Frequently Asked Questions

Can you build a Shopify product bundle without an app?

Yes. A configurable kit can be built as a native Liquid section that posts one multi-line Add to Cart request, with the savings applied by Shopify’s own automatic Buy X Get Y discounts set to exact dollar amounts. On Tuff Pupper that covers the whole mechanic, one button that adds a harness, a leash and a collar, with the discount landing at cart and checkout, no bundle app and no monthly fee. Cart Transform in a custom app needs Shopify Plus, while native discounts work on every plan.

How do bundles and kits increase average order value for DTC stores?

In categories where the core product has natural companions, a harness pairs with a leash and a collar, a kit raises the basket without acquiring a new customer. Direct competitors prove the demand. Wild One sells a Walk Kit at a small discount versus the sum of the singles and it carries over 1,400 reviews. Ruffwear positions a harness, leash, and collar as a starter kit with no discount at all. The lever is presenting the set at the moment of intent on the product page, not hoping the shopper assembles it themselves across separate visits.

What converts better, a build-the-kit picker on the product page or a separate bundle product?

An inline picker on the existing product page tends to win because it keeps one canonical buy surface. The shopper is already on the harness they want, so the kit options appear in context with a single Add to Cart, rather than routing them to a separate bundle SKU they have to discover. It also avoids inventory and variant duplication. The key implementation details are syncing the kit price to the selected variant, keeping component colors matched as the shopper changes the harness color, and disabling the buy action cleanly when a selected variant is out of stock.

How do you use a free shipping threshold to lift average order value?

A free shipping bar only works if the shopper can act on it. Show the exact amount left, then recommend one to three items that need no sizing decision, picked from what’s already in the cart and ordered by what customers actually buy together. Promote the cheapest item that closes the gap, label it as the one that unlocks free shipping, and hide the rail once the cart crosses the line.

Can a Shopify store run a custom support chat without a chat app?

Yes. Tuff Pupper’s support chat is a native theme component talking to a Cloudflare Workers backend, with live order lookup through a read-only custom Shopify app. It answers product, sizing and order questions, and hands off to the team in Slack and email on 11 escalation triggers the brand defined. There’s no chat app subscription and no third-party widget on the page.

Why measure bundle adoption rate instead of a conversion lift percentage on a new bundle?

At low order volume, a confident conversion or AOV percentage inside a single sprint isn’t statistically honest, the sample is too small. The reliable early signal is bundle adoption rate, the share of orders that contain the kit, tracked with a line-item property on every kit add. That’s a clean count, not a noisy ratio. Conversion and AOV deltas come back into scope once cumulative volume is large enough to trust them.
Book a free call