If you sell 15 kg kibble bags and 400 g treat pouches from the same catalogue, one flat shipping rate is quietly funding your losses. Shopify handles this natively: open Settings → Shipping and delivery, create a shipping profile, and inside each zone add rates with a weight condition instead of a price condition. That's how you set up Shopify shipping rates by weight, and it takes about twenty minutes. The part that takes longer, and the part that decides whether the tiers make you money, is choosing where the boundaries sit. Get them wrong by 200 grams and you pay a full extra courier slab on every heavy order.
How Shopify shipping rates by weight actually work
Each rate inside a zone gets a minimum and a maximum cart weight. Shopify adds up the weight of everything in the cart, finds the rates that match, and shows them at checkout. Three things follow from that, and all three catch people out.
First, the bands must not overlap. If you have a 0–5 kg rate at ₹60 and a 0–10 kg rate at ₹120, a 4 kg cart sees both and the customer picks ₹60. That's fine if you meant to offer a choice of speed. It's not fine if you meant a ladder.
Second, the bands must be exhaustive. Leave the top tier at 0–25 kg and a customer who adds two 15 kg bags gets "no shipping available" at checkout. Leave the maximum blank on your last tier. We have shipped this bug to production and only found it because a founder tried to order three bags for a shelter.
Third, cart weight comes from variant weights, and Shopify defaults a variant to 0 kg. Any SKU imported from a CSV without a weight column will ship free forever under a weight-based table. Filter your product list by weight before you go live.
Why flat rate breaks on pet food specifically
Pet food has the worst combination in retail logistics: heavy, bulky in a box, low ticket relative to weight, and bought on repeat by price-sensitive customers who compare to a shop two kilometres away.
Take an illustrative surface rate card — use your own numbers, but the shape is typical for a Bengaluru origin. Say ₹55 for the first kilo and ₹18 for each additional kilo to a national zone, billed in 1 kg slabs rounded up.
- A 1.2 kg pouch in a box with padding weighs 1.45 kg. Bills as 2 kg. Freight ₹73.
- A 15 kg bag in a box weighs 15.6 kg. Bills as 16 kg. Freight = 55 + (15 × 18) = ₹325.
Now price it. The pouch retails at ₹420. At 22% gross margin that's ₹92 of contribution. Freight ₹73, plus a COD fee that's usually the greater of a flat charge and a percentage of the collected amount — call it ₹35. You are ₹16 down before you have paid for the box. Every single time.
The 15 kg bag at ₹4,800 carries ₹1,056 of margin. Freight ₹325, COD fee at 2% is ₹96. If 6% of your COD orders come back, the expected RTO cost is 0.06 × (325 forward + 325 return) = ₹39. Total ₹460. You keep ₹596, or 12.4% of order value, on what looked like a 22% product.
Those two SKUs cannot share a shipping rate. That's the whole argument.
Build the tiers around your courier's slabs, not round numbers
Most stores set tiers at 0–1, 1–5, 5–10, 10–20 kg because those are tidy. Couriers don't bill tidy. They bill in 0.5 kg or 1 kg increments for light parcels and often 5 kg increments once you cross into cargo, with a minimum chargeable weight per consignment.
Your tier ceiling should land just below a slab boundary, and your packed weight has to be inside it. A 12 kg bag is not a 12 kg parcel. Corrugated box, filler, tape and the label add 300–600 g depending on how you pack. If your tier says 10–12 kg and the parcel weighs 12.4 kg, the courier bills 13 kg and you have collected for 12. At ₹18 a kilo that's ₹18 a parcel, which is nothing until you do it four hundred times a month.
Weigh five packed parcels of each SKU on a real scale. Use the heaviest. Then set the tier boundary above it.
Dimensional weight matters less here than you'd fear. Dry kibble sits around 0.4 kg per litre, so a 15 kg bag in a 60 × 40 × 20 cm box gives volumetric weight of 48,000 ÷ 5000 = 9.6 kg against 15 kg actual. Actual wins. Where it bites is multi-bag orders packed into one oversized carton with air in it, and single small pouches sent in a box three sizes too big. Cat litter and canned wet food are dense enough that you'll never see volumetric.
Zone rate tables when Shopify zones are states and courier zones are pincode pairs
Shopify builds Indian zones from states. Your courier prices origin-to-destination by pincode. Those two models don't line up, and no amount of clicking will make them.
What works in practice, for a single warehouse, is five zones:
- Home state — Karnataka for a Bengaluru origin. Cheapest per kg, often same-day or next-day surface.
- Regional — the adjacent states your courier prices as zone B.
- Metro / rest of India — the bulk of orders.
- Northeast, J&K, Ladakh, Himachal, Andaman & Nicobar, Lakshadweep — a separate zone, always. Surface cargo to Guwahati or Srinagar can run 40–60% above a Delhi lane, and some heavy lanes are air-only.
- Rest of world, if you export at all. Most pet food doesn't cross borders easily anyway.
Zone 4 is the one everyone skips. Then they wonder why the Northeast looks unprofitable in the P&L. It isn't unprofitable, it's underpriced.
Multi-location breaks this. If you hold stock in Bengaluru and Delhi, Shopify's static table can't know which warehouse will pick the order, so any single number is a blend. You either accept the blend, run separate profiles per product group that only stock in one place, or move to calculated rates keyed to the fulfilment location. We get the split wrong on the first pass more often than not and correct it after a month of actual dispatch data.
A worked rate table you can copy and re-price
Cost basis: ₹55 first kg + ₹18/kg additional to national, roughly ₹40 + ₹12/kg regional, ₹35 + ₹9/kg in-state, and national × 1.5 for the Northeast zone. Recovery target: 70–80% of freight on light orders, 100% plus a small buffer on heavy ones, because heavy orders are where the money leaks.
- 0–2 kg — Karnataka ₹45, regional ₹55, national ₹69, NE ₹99
- 2.01–6 kg — ₹79 / ₹99 / ₹139 / ₹209
- 6.01–12.5 kg — ₹129 / ₹169 / ₹249 / ₹379
- 12.51–22 kg — ₹179 / ₹249 / ₹359 / ₹549
- 22.01 kg and above (leave max blank) — ₹249 / ₹349 / ₹519 / ₹799
Check the middle row against cost: a 12 kg packed parcel to a national pincode bills as 12 kg → 55 + (11 × 18) = ₹253. You charge ₹249. You eat ₹4 and the customer sees a number that doesn't scare them off. That's deliberate. The row above it is where you recover: a 15.6 kg parcel costs ₹325 and you charge ₹359.
Five bands × four zones is twenty rates. Enter them once. Revisit when your courier revises the rate card, which for most contracts is annually plus a fuel surcharge that moves quietly.
The free shipping threshold that funds your competitor
"Free shipping over ₹1,499" is fine for supplements. On pet food it means a customer in Shillong can order a 20 kg bag at ₹4,900 and you absorb ₹800 of freight. Meanwhile three treat pouches at ₹520 total pay full shipping and convert badly.
Cap free shipping by weight, not just by cart value. Shopify won't let one rate carry both a price and a weight condition, but you can approximate it: make the 0–6 kg tier free above a value threshold using a discount or a ₹0 rate in that weight band only, and keep paid rates on every band above it. Heavy orders then always pay something, even if it's a subsidised ₹99 that hides half your cost.
Blunt version: if a 10 kg cat litter SKU is your only item in the cart and the customer is 1,800 km away, that order should not exist at your current price. Either make litter an add-on with a minimum basket, restrict it to a regional shipping profile, or raise the price by the freight. Nobody wants to hear it. It's still true.
When static tables stop being enough
Static weight tiers are right for most pet brands. They're predictable, they're fast at checkout, and they let you decide the customer-facing number rather than exposing a courier's arithmetic. Move off them when one of these is true:
- You run two or more fulfilment locations and lanes differ by more than about 25%.
- You want live rates from an aggregator so the price reflects the actual serviceable courier for that pincode.
- You need rules a table can't express — free freight on subscription orders only, or a surcharge for oversized litter boxes regardless of weight.
Third-party calculated rates are included on Advanced and Plus, and available on lower plans depending on your billing terms — check what your plan page says today, because Shopify has changed this. For rules a rate table genuinely cannot express, the Carrier Service API or a Shopify Function is the honest answer, and that's custom app work rather than a setting. You do not need Shopify Plus to fix shipping. If someone is selling you Plus as the solution to a rate table, ask them to show you which Plus-only feature they intend to use.
COD, RTO and the heavy-parcel penalty
A heavy COD order that gets refused costs you twice the freight and, sometimes, a damaged bag you can't resell. On a ₹325 lane, that's ₹650 plus stock. Two things reduce it: a COD fee that's visible at checkout on orders above your heavy tier, and a prepaid discount roughly equal to that fee. Customers who won't prepay ₹4,800 for dog food are also the customers most likely to refuse the parcel.
On invoicing, shipping charged alongside the goods generally rides as a composite supply and attracts GST at the rate of the principal supply. Your CA will confirm how that sits with your HSN codes. Worth setting up correctly at the start, because unpicking it across a year of orders is grim.
One India-specific note that saves confusion: pet food isn't governed by FSSAI the way human food is, so don't copy compliance blocks from a snacks store. Dog and cat food labelling follows BIS standards, and imported product needs animal quarantine clearance.
Nudge the cart towards the slab
The best shipping optimisation on a pet store isn't a rate at all. It's getting a 4.8 kg cart to 5.5 kg so the customer buys more without paying more freight, or getting a monthly 7 kg buyer onto a bi-monthly 14 kg cadence.
Show the remaining headroom on the cart drawer: "add up to 1.2 kg more at no extra shipping." Sell the large bag at a clear per-kg discount and state the per-kg price on the product page so the maths is done for them. For subscriptions, default the interval to whatever consumes one large bag rather than one small one. A 30 kg dog eating 400 g a day gets through 12 kg in a month; that's your default, not a 3 kg bag every eight days.
Before you publish the table
Weigh five packed parcels per SKU. Confirm no variant has a 0 kg weight. Test a 1 kg cart, a 13 kg cart and a 45 kg cart against a Guwahati, a Mumbai and a Bengaluru pincode. Make sure exactly one rate appears each time unless you meant to offer a choice. Then take last quarter's orders, run each one through the new table, and compare what you'd have collected against what you actually paid the courier.
If that comparison is more than a few hours of work, or the answer looks bad and you can't see why, send us the store. A free audit covers the shipping profiles alongside everything else, and we'll tell you plainly if the problem is the rate table or the price of the product.


