Back to work

Fluid / Native bundles

Building bundles into the platform, not bolting them on

I designed Fluid’s native bundle builder and its customer-facing theme, growing basic product grouping into a flexible commerce capability while keeping everyday setup approachable.

My role
Sole product designer across the admin builder and customer-facing theme
Collaborators
Art director, a client-facing designer, engineers, implementation specialists, and clients
Timeline
About two weeks for the initial design, followed by several months of iteration alongside other projects
Research
Four implementation specialists, four other employees, and six clients
Delivery
In use by clients
The storefront pairs bundle details and the total with choices grouped for the shopper.

Native bundling was the opportunity

Advanced bundling often depends on third-party apps, even on established commerce platforms. Shopify offers its own Bundles app for fixed bundles and multipacks, while more customized experiences can use third-party apps or custom development. Those integrations can introduce inconsistencies across storefront, cart, checkout and back-office workflows.

For Fluid’s clients, starter packs were a requirement. Our workarounds sometimes produced incorrect prices or incomplete product pages, and shoppers couldn’t change a pack’s preset contents. Building bundling into Fluid gave us a way to address those needs as part of the platform.

The bundling ecosystem

Shopify App Store results for 'bundle builder'. The 3,016 results at capture time offer a glimpse of the wider app ecosystem, not a count of dedicated bundle apps.

Platform context: Shopify’s bundle options.

From grouping products to shaping a purchase

We started with a simple capability: combine multiple products into one bundle. Real client requirements gradually expanded it. A fixed kit, a customizable box and a subscription pack needed different rules, but merchants shouldn’t have to configure every option to sell any one of them.

Ordinary product setup centers on details, media and publishing. Bundles added decisions about what shoppers could choose, how selections affected price, and whether the resulting purchase worked across countries and inventory settings.

  1. Combine products

    Start with several products sold together as a bundle.

  2. Configure purchase behavior

    Add fixed or dynamic pricing, customizable or exclusive groups, minimum/maximum selections, defaults and required subscriptions.

  3. Support real-world commerce

    Account for country availability, international pricing, inventory and the path through checkout.

Ordinary product setup

Standard product editor (current UI), shown for comparison, not a screenshot of the original bundle builder.
Explore a multi-group bundle
A detail from the Double Stack Biggie Bag editor shows separate groups within one bundle. Open the image to explore the full editor.

Designing with the people using it

Another designer and I used customer research and quick prototypes to make the case that one builder could accommodate different client configurations. I owned the design, with feedback from our art director and engineers on feasibility.

Four implementation specialists used the prototypes repeatedly; four other employees and six clients also participated. Open-ended exploration and focused bundle-building tasks shaped the design, especially bundle-wide pricing and country availability.

The admin prototype

A customizable group combines product choices, a selection requirement and fixed or dynamic pricing.

The admin prototype brings country availability, bundle groups, product choices and pricing controls into one setup flow. This recording shows configuration, not a completed customer purchase.

See the admin prototype 43 seconds / silent recording

Keeping the simple path simple

How do you support increasingly complex use cases without making every merchant’s setup complex?

Each group had its own rules

A single bundle could contain several groups, each with independent rules. Some used one fixed price; others calculated a price from the customer’s choices. Merchants could preselect a variant, allow or require subscriptions, and ask customers to select an exact number of items, a minimum, a maximum or a range. Quantity limits and mutually exclusive groups added another layer of flexibility.

That flexibility risked making ordinary setup intimidating. I kept optional advanced settings off by default, revealing their dependent fields only when merchants opted in. In this group, enabling quantity limits opens the per-item controls. Simple bundles stay lightweight, while more specialized merchants can configure the rules they need.

The toggles themselves remain visible and discoverable. The same principle applies to optional bundle-level pricing and inventory: additional configuration appears when the relevant setting is enabled, rather than exposing every field at once.

Each group has its own rules

Advanced group options are opt-in: enabling quantity limits reveals the relevant per-item controls. The other optional toggles remain visible.

Advanced settings, off by default

Bundle-level settings with inventory and pricing toggles off. The switches stay visible; dependent controls appear when a merchant enables them.

Letting clients price the pack as a whole

Pricing was confusing in the early design. Clients selling a fixed pack needed a clear way to set one price for the whole bundle, rather than price each group separately. I added an optional bundle-wide pricing setting for that task.

Group-level pricing remained available: fixed pricing for a predictable offer, or dynamic pricing that adjusts with the shopper’s selected items and options. The pricing scope could fit the merchant’s offer instead of forcing different businesses into the same setup.

Bundle-wide pricing

A bundle-wide pricing option lets admins price the pack as a whole rather than price each group separately.

Group pricing

Group pricing can remain fixed or adjust with the shopper’s selections.

Two pricing scopes in the current design, not a before-and-after comparison.

Pricing across groups and markets

Each group could use fixed or dynamic pricing independently. For international merchants, I designed a primary-price workflow: set a reference amount and currency, initialize prices for enabled countries through conversion, then adjust individual country prices as needed. It offered a practical starting point without sacrificing local control.

This is group-level pricing, separate from the optional bundle-level override that prices the pack as a whole. The sample values illustrate the workflow, not verified conversion accuracy; manually adjusted prices are not claimed to stay automatically synchronized.

Pricing across groups and markets

Fixed or dynamic pricing is chosen per group. Country Pricing holds the prices for enabled markets.

A starting point for country prices

Set a primary amount and currency to initialize enabled-country prices through conversion, then fine-tune individual values. Example values do not verify conversion accuracy or ongoing synchronization.

Checking availability during setup and later edits

Country availability originally lived within individual groups. Feedback showed that this made it too easy to choose products that didn’t work in the bundle’s intended countries. I moved availability to the bundle level: admins could only add products available in every country selected for the bundle.

Later edits mattered, too. If a country change made an existing product invalid, the designed save-time error required admins to resolve the conflict before saving. Country pricing also needed to follow that availability, whether the price came from the bundle or its groups and selections.

When adding products
Available in all bundle countries.
After country changes
Resolve conflicts before saving.
International pricing
Keep visible country prices aligned with availability and the chosen pricing scope.
Inventory
Account for included product quantities, with optional tracking of the bundle as its own inventory unit.

Bundle-wide availability

Country availability is set for the whole bundle rather than managed separately within each group.

These checks describe the designed behavior. The save-time error is not pictured in the supplied recording.

The rules had to make sense to shoppers, too

I designed a reusable storefront theme alongside the admin builder. Merchant rules had to become clear purchase choices that made sense from the product page through cart and checkout, including subscriptions for individual products or the whole bundle.

In this example, shoppers choose seasonal flavors, a spoon and one add-on bundle. Defaults and completion indicators make requirements visible, and add-to-cart stays unavailable while required selections are incomplete. The theme needed to explain what was included and what could change without asking shoppers to interpret the admin settings.

A required choice, with a default

A required choice starts with a default selection and shows when the requirement is complete.

One add-on, with its contents visible

Shoppers choose one add-on bundle, with the contents of each option shown before they select it.

When selections are incomplete

The add-to-cart action stays unavailable while required selections are incomplete.

Other required groups can be offscreen; the visible spoon or add-on choice alone does not explain the incomplete state.

Using code to work through the design

I used Claude to build working prototypes, iterated in code and submitted pull requests. Engineers could use those changes or refer to them during implementation. I remained responsible for the design decisions, revising them with engineers, our art director, implementation specialists and clients.

Helping clients stay on Fluid

Native bundling is in use by clients and helped retain businesses that would otherwise have left Fluid. It gave them a platform capability for selling starter packs and accommodated more merchant scenarios as their requirements grew.

I estimate that the feature helped retain about $50,000 in monthly revenue over a six-month period. That figure is my estimate of revenue from retained accounts, not an audited measurement or new revenue generated by the feature.

Additional transaction revenue was estimated at approximately 5%. This was an estimate, not a measured gain or a guaranteed result.

What I’d do differently

I would start more user conversations before designing. Quick prototypes helped us get the project approved, but earlier input would have given me a stronger foundation for the expanding requirements. The lasting design lesson was to make room for complexity without making every merchant work through it.