Shopify · 2025

Shipping Setup Redesign

Rebuilding how stores price shipping, to match how merchants actually think about it

Role
Product designer
Timeline
2025
Team
Second designer, content designer, Product, Engineering
Surfaces
Admin, Checkout
Status
Two releases shipped · third in preview

The interface was confusing because the model was confusing

Shopify’s shipping settings had accumulated complexity over the years – multiple locations, per-product pricing, international markets, among other things. While these features added much needed features for merchants, they also introduced new problems in how this model was presented to them. It was widely regarded as one of the more challenging steps to set up a store – something every merchant had to manage at some point.

A lo-fi view of the shipping profile page with three concepts labelled around it: products, selling regions, and fulfillment locations, each connected by a line to the part of the page it controls.
Many externally managed resources (products, locations, markets) are inputs to shipping settings.

Our longer-term roadmap called for more flexibility in how merchants set up shipping, which could no longer be layered on the current approach. We needed to reconsider previous decisions, and approach this problem from a fresh perspective.

Consolidating scattered conditions into one object

The Shopify admin on the Shipping and delivery settings page, showing a default shipping profile with a Products card, a Fulfillment location card listing the Ottawa Store, and a Domestic Canada shipping zone containing Standard and Express options.
The rebuilt profile page — products, the location fulfilling them, then the zones and the options inside them.
The shipping settings component with three concepts labelled beside it: fulfillment location pointing to the Ottawa Store row, selling region pointing to the Domestic Canada zone, and delivery pointing to the Standard and Express shipping options.
The new card better layers the three main settings (From / To / What). Location > Shipping zone > Shipping option

Three changes to the profile page:

  • The product card was collapsed. This let us focus the emphasis on the main actionable resource – the shipping options.
  • The table was aligned to admin patterns. Updated the component to align with other settings pages – improving consistency and introducing a hierarchy that makes multi-zone setups clearer.
  • Conditions were consolidated. A single shipping option replaces what used to be multiple rates with their own conditional logic.

The sharpest change was in the rates themselves. A single delivery promise used to be split across as many rows as its conditions required, so a merchant maintained five entries to express two actual choices — and the customer never saw them as separate anyway.

Before and after comparison. Before: five separate rate rows — Standard 0–5 lb at $5.00, Standard 5–70 lbs at $20.00, Free shipping, Express 0–1 lbs at $10.00, Express 1–5 lbs at $14.00. After: two shipping options — Standard, $5.00–$20.00, four to eight business days with free shipping over $100; and Express, $10.00–$14.00, three to four business days.
What used to be a mix of shipping rates with conditions has been consolidated into a single option with internal conditions.

Shipping options map to what the customer actually sees

Two surfaces side by side, labelled Merchant and Customer. On the left, the admin showing Standard and Express shipping options. On the right, a phone at checkout showing the same Standard and Express options under Shipping method, connected by a line.
Shipping settings uses a model that more closely matches what customers see at checkout.

The new model leads with what the customer sees at checkout – then lets the merchant add internal conditions that can adjust the price or delivery time.

This also introduces a soft restriction where those individual conditions must share the same name – meaning we avoid letting merchants create accidental duplication of shipping options at checkout, can consolidate rates across multiple profiles, etc.

To support this change, we needed to rebuild the previous settings modal with a settings sheet that could support the new condition UI.

New shipping option sheet covers the screen and shows settings with a checkout preview
The new shipping options sheet provides a focused view to set up conditions, and preview at checkout.
  • One name, all the logic beneath it — price, transit time, and whether the option appears at all
  • Free shipping as a global override, promoted out of the condition list because it was the most common use of price conditions
  • A checkout preview inside the editor — to help reinforce the model that this option is what customers see at checkout

Two ways to model pricing, and why we picked one

The biggest design decision on this project was how to model conditional pricing itself: whether order weight and order value should be treated as rate types or as conditions.

The Edit shipping option sheet with a Type field set to Flat rate, and a checkout preview below it. Fanning out to the right, three alternative cards show the same field set to Carrier calculated, Price-based, and Weight-based, the weight-based one expanding into minimum and maximum weight bands with their own prices.
The rate type approach let us deliver a customer interface for price and weight based rates, giving a purpose built UI to support this use case natively.

We landed on rate types — a top-level choice about how a merchant wants to price, rather than a condition layered alongside others.

In a later update, we would introduce product and location conditions. We determined that if weight and value lived there too, every combination would have to be declared explicitly, creating more complex setups.

Opinions differed — map to the backend exactly (conditions), or create a new layer that improves frontend presentation (rate types). We made the case for rate types, and aligned as a team on this approach.

The model held strong

The model I helped define for the first project milestone held after I left, in the second release for Shopify’s Spring ‘26 Edition as “Advanced Shipping Options,” and the third in public feature preview as Market-driven shipping — where product and location conditions live inside rates, and shipping configuration finally moves into Markets as the top-level container.

Market-driven shipping product conditions UI, showing a shipping rate scoped to a specific product collection
Product conditions within a shipping rate, from Shopify’s Market-driven shipping developer preview.

It was an interesting challenge joining a project in-progress, working on the details of the first project milestone, while also planning towards the future vision that was shaping alongside this work. Working on an infrastructure project (rather than a new feature add) was also quite rewarding, as it requires you to learn more deeply about the domain, and considering deicisions that were made long before your project.

More case studies

Making it clear how each store location is set up online

Letting stores move stock between locations, so one missing item stops blocking an order