Tuff Pupper
A DTC dog gear brand with the catalogue of an adventure label and no way to bundle it. I built a native Build-the-Kit system, a cart-aware add-on rail, and a measurement framework honest enough for the store's real volume, then turned it into an ongoing retainer.
The Store
Tuff Pupper, run by founder Logan Edwards, sells rugged dog gear through Shopify: harnesses, leashes, collars, the PupFlask hydration bottle, plus bowls, toys, grooming, and apparel. Most of the brand’s volume runs through Amazon, where it carries thousands of reviews, while the Shopify storefront was comparatively underdeveloped. That split matters, because Shopify orders are fulfilled through Amazon’s multi-channel fulfilment, so every Shopify order tends to cost more per unit than the equivalent on Amazon. Lifting average order value on Shopify is not a nice-to-have here, it is the economics of the channel.
The catalogue has the depth of an adventure brand and a value price point, with harnesses from roughly $19 to $60. The competitive set is well established. Wild One runs a discounted Walk Kit assembled inline on a single product page, implemented as a custom Liquid section rather than an app, with over 1,400 reviews on that one kit. Ruffwear takes the no-discount route, curating harness, leash, and collar as a starter kit and running a dedicated page that walks a buyer to the right harness by use case before they ever reach a product page. Both competitors monetise the same three mechanics. 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 was tied to a fetched URL so the brief was a map of verified gaps, not opinion. Three mechanics that drive average order value in this category were missing.
No bundles, despite a catalogue built for them
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 across the site. Wild One’s verified Walk Kit shows exactly what was being left on the table: the set priced slightly under the sum of the singles, presented in one place, with a single Add to Cart.
A harness range a buyer cannot self-route
The store carries six active harness families with overlapping positioning. Tracker and Trailblaze are both waterproof, both have a lifting handle, both sit around the same price, and the copy gives no reason to pick one over the other. Trailblaze versus Trailblaze Lite is a price and size-range difference that is invisible to a shopper. Fast Fit versus Titan Tactical are both pitched at control. Without a use-case selector, the buyer carries the cognitive load, and choice fatigue on a collection page is a silent conversion leak.
A $35 free shipping bar with nothing to fill it
The cart drawer already had a free shipping progress bar at $35, but many of the bestsellers sit well below it. A collar at $13.96 or a leash at $14.96 in a single-item cart falls more than $20 short of free shipping, and nothing in the experience helped close that gap. The threshold was set up to motivate a larger basket and then given no path to one.
What I Built: Milestone 1
Milestone one shipped to the live store. Two systems, both native, both configurable from the theme editor.
Build-the-Kit, a native bundle picker on the harness pages
Every harness page now carries a Build-the-Kit panel with three tiers: Just the Harness, Walk Set (harness plus leash, recommended by default), and Full Kit (harness plus leash plus collar). One black button adds the whole kit in a single click, and Shop Pay express carries the full bundle on every tier, not just the single item. The savings land at the cart and checkout through a Shopify Discount Function, Walk Set and Full Kit each discounted to an exact dollar figure so the picker price matches the cart to the cent.
The detail work is where a bundle either feels solid or feels broken. When the shopper changes the harness colour, the picker swaps the harness thumbnail across all tiers and finds the closest matching colour on each add-on, exact match first, then a fuzzy word match, so March Red maps to Crimson Red and Steel Grey maps to Cool Grey. If a matched colour is out of stock it falls back to the first available variant, and the thumbnail always reflects what will actually be added to the cart. When a selected size or colour is sold out, an inline status row appears above the buy button and both the kit submit and Shop Pay are disabled until the shopper picks something in stock. On mobile, three competing buttons used to stack above the fold and the dominant red one stole taps meant for the bundle. I collapsed that into one canonical buy surface and added a kit-aware sticky button that mirrors the selected tier once the picker scrolls away.
It is a configurable block in the product template. The store owner can change the tier products, copy, and savings labels from the theme editor without touching code, and it is gated to harnesses so it never appears on bowls, toys, or leashes.
A cart-aware add-on rail to close the free shipping gap
Under the free shipping progress bar, the cart drawer now shows up to three sub-$35 add-ons when the cart is below the threshold. The rail is content-aware: a harness in the cart recommends a leash, a leash recommends a collar, and a small remaining gap collapses the rail to a single Close the gap recommendation. The whole rail hides the moment the cart reaches free shipping. Every cart change re-renders it server-side, so the recommendations always match what is actually in the cart.
A zero-bug delivery, verified before the client saw it
Before shipping, 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 came out of that pass. The one that would have hit customers hardest was a price-delta corruption that showed the picker total $5 to $10 over the real bundle cost after a colour-then-size flip sequence, and it got a structural fix to the price maths rather than a patch. The kit module added about 18 KB to the page, a rounding error against the store’s existing weight, and it met WCAG 2.2 AA, with eyebrow text contrast raised to 7.1:1, a visible focus ring on the buy button, out-of-stock tiers announced to screen readers, and 44 px tap targets throughout.
Built Without Apps, On Purpose
None of this added an app or a subscription. The bundle pricing runs on a Shopify Discount Function, which works on every plan, instead of the Plus-only Cart Transform Function. The cart rail is a native cart-drawer modification. The same audit surfaced the cost of the opposite approach already running on the store: two app pixels billing roughly $26 a month while sitting Disconnected in the admin, their data not flowing back, and an orphaned script still loading on every product page from an app Shopify removed in 2019. Building the revenue mechanics natively keeps the page fast, the stack lean, and the monthly cost flat.
The Roadmap
Milestone one proved the bundle mechanic. The work after it extends that into store-wide credibility and starts on the real performance problem.
The harness selection gap gets a use-case selector at a dedicated page, six cards that route a buyer to the right harness family by need, everyday, rugged, light and small, pulling control, gear carrying, and senior support, built in the store’s existing design language as a swipe carousel on mobile. The performance work is scoped from a measured Lighthouse baseline: mobile sits at a Performance score of 38 with a 5.8s LCP, while desktop is healthy at 90 and 1.4s, and layout shift is a perfect zero on both. The cause is not the theme, it is a third-party stack with around three seconds of total blocking time and seventeen seconds of main-thread work, driven by duplicated tools, two review apps, two session-replay tools, and three popup tools. The biggest single mobile win is trimming those duplicates, which also cuts subscription cost. Font swap, hero image optimisation, and deferring render-blocking scripts come alongside it.
Further out, the brand architecture work cleans up a catalogue where one product template is applied to ninety-plus non-harness products and thirty-one collections carry duplicates and expired seasonals, promotes the review aggregate and a brand-statement hero above the fold, fills an empty but fully built blog with an editorial series, and consolidates the design tokens, including five near-identical reds. The store reads as a catalogue today. The plan is to make it read as a brand.
How Success Is Measured
At one to three orders a day, a confident conversion-lift percentage inside a sprint would be a fiction, so this engagement does not claim one. It tracks bundle adoption rate, the share of orders that contain a kit, counted from a line-item property written on every kit add, plus cart add-on click-through and a documented heuristic behind every change, the Wild One pattern, the Ruffwear single-CTA-per-page rule, Hick’s law on the tier count, anchor pricing on the higher kit. Conversion and AOV deltas re-enter scope once cumulative volume is large enough to trust the numbers. That is the honest version of measurement for a store at this stage, and it is the version the client gets.
Key Takeaway
In a category where every serious competitor monetises bundles, kit positioning, and a harness selector, the highest-leverage move on an underdeveloped Shopify store is not a redesign. It is adding the average-order-value mechanics the catalogue was already built for, natively, so the page stays fast and the stack stays lean. Build the kit on the page the shopper is already on, sync it to the cent, sweat the colour-match and out-of-stock edge cases so it never feels broken, and give the free shipping bar something to fill. Then measure it in a way that survives scrutiny at the store’s real volume. That is what turns a thin Shopify channel into one that pulls its weight.
For related work, see the WD Electronics retainer for a cart-drawer rebuild and weekly CRO cadence on a high-ticket store, or the Enea Studio engagement for the same engineering depth applied across six sprints. The underlying techniques are written up in build a Shopify bundle without an app and the tiered bundle discount function.
Running a Shopify store leaving average order value on the table? Book a free strategy call and I will map your highest-leverage revenue mechanics.