Why does Shopify add my shipping rates together instead of just charging the highest one?
When a cart spans more than one shipping profile, Shopify totals the rates from each profile rather than charging just the priciest one — here's why, and how to fix it.
What's going on
A merchant sets up two shipping profiles — say, a General profile for most products and a custom profile for oversized or fragile items — and expects that when a customer buys one of each, checkout will simply charge whichever single rate is higher. Instead, checkout shows both rates added together, so a $5 standard rate and a $12 oversized-item rate become a $17 shipping charge on one order. Customers complain, cart abandonment ticks up on mixed-cart orders, and the merchant assumes something is broken.
It isn't a bug in the traditional sense — it's how Shopify's shipping profile system is designed to work. Shopify calculates a shipping rate independently for each profile a cart's line items belong to, then presents (or totals) those rates at checkout, because it has no built-in concept of 'pick the more expensive one and discard the rest.' The confusion is almost always a mismatch between how the merchant mentally modeled shipping (one combined cost per order) and how Shopify profiles actually price things (one cost per profile, summed).
Why it happens
Shopify's shipping settings are built around 'shipping profiles' — groupings of products, each with its own rates and origin locations, found under Settings > Shipping and delivery. Every product lives in exactly one profile (the General profile by default, or a custom profile you create for a subset of products, such as heavy freight items or a different fulfillment location). When a cart contains items from two or more profiles, Shopify's checkout engine computes shipping for each profile's items separately and combines them into the order total — because from Shopify's perspective, they could be shipping from different warehouses, on different carriers, in different boxes, so it doesn't assume they can be bundled into one rate.
The 'rules' merchants build inside a profile (weight breaks, price breaks, free-shipping thresholds) only govern rate selection within that one profile. There is no native setting that reaches across profiles and says 'if a cart matches multiple profiles, keep only the highest one.' That cross-profile logic has to either be avoided by consolidating products into fewer profiles, or handled with custom code if the split is genuinely necessary (true multi-warehouse or multi-vendor fulfillment).
5 ways to fix it
Consolidate products into fewer shipping profiles
The most direct fix is structural: move products that are frequently bought together into the same shipping profile instead of splitting them across a General profile and one or more custom profiles. Go to Settings > Shipping and delivery, open each custom profile, and check which products are assigned to it. If a customer buying a T-shirt (General profile) and a mug (a custom 'fragile items' profile) is what triggers the stacked rate, either move the mug into the General profile's rate structure or give both profiles identical rates for that origin/zone so the totals stop looking inflated. This is free and usually solves the complaint entirely.
Use weight- or price-based rate tiers instead of flat per-profile rates
Within a single shipping profile, Shopify lets you build rate tiers based on order weight or price (e.g., $0-$50 = $5, $50-$100 = $8, over $100 = free). If your real goal is 'don't charge more just because the cart got bigger,' a well-built tiered rate table inside one profile does this natively without any add-on. Rebuild your rate cards so heavier or higher-value combined carts land in one sensible tier rather than summing two separate profiles' flat rates.
Check whether carrier-calculated shipping is combining differently than you expect
If you're using real-time carrier rates (UPS, USPS, FedEx) instead of manual rates, Shopify calculates a rate per origin location per profile, then totals them when a cart spans profiles shipping from different locations. If everything actually ships from one warehouse, make sure all relevant products share one location assignment in that profile — a mismatched location is a common hidden cause of 'duplicate' rate lines.
Use a delivery customization to hide or reorder rates at checkout
Shopify Functions include a 'delivery customization' type that apps can use to hide, rename, or reorder shipping rates presented at checkout (for example, hiding a redundant rate once another qualifies). This won't recalculate a price for you, but it can stop a customer from seeing two stacked line items when you only want one to display. Availability depends on your plan and whether you have (or install) an app that exposes this; check the Shopify Help Center's shipping and delivery documentation for current plan requirements before relying on it.
Commission a custom rate calculation for genuinely split fulfillment
If products truly ship from different locations or vendors and you need logic like 'charge the higher of the two rates, not the sum,' that requires custom code — either a carrier-service style integration or a checkout rate-adjustment app that computes a single combined rate server-side. This is a developer project, not a settings change, so it's worth confirming with a Shopify expert whether your catalog structure can be simplified first (options 1-3 above) before paying for custom logic.
Bottom line
Before assuming you need custom development, spend twenty minutes auditing your shipping profiles and test-checking out with a mixed cart in an incognito window — most "rates are stacking" complaints trace back to products landing in the wrong profile or location, which is a free fix. Only reach for a delivery-customization app or custom carrier logic once you've confirmed the split is intentional (genuinely separate warehouses or vendors) and can't be modeled with Shopify's native tiered rates.
Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.