If our custom shipping-rate Function needs updating every time we add a new fulfillment location, does that ongoing cost make a simpler native rule table a better long-term choice?
Short answer
No: custom shipping-rate code that needs a code change for every new location was scoped wrong, not chosen wrong. Read locations from settings, and new warehouses become data edits. Shopify's shipping profiles add the same step on either path: each new location joins every profile with no rates, native or carrier-calculated, until someone assigns it (Shopify Help Center, October 2026).
- New location in shipping profiles
- Joins every profile with no ratesShopify adds a new location to all shipping profiles under Not fulfilling from, so someone adds it to a location group with rates in each profile.Source: Shopify Help Center (Managing fulfillment locations in shipping profiles)
- Custom shipping profiles
- Up to 99, plus the general profileEach profile groups products for shipping, and each location group inside it carries its own shipping zones and rates.Sources: Shopify Help Center (Shipping profiles, Managing fulfillment locations in shipping profiles)
- Delivery customization Functions
- Rename, sort and hide options; 25 per storeShopify's Delivery Customization Function API changes options that already exist; custom prices come from a carrier service app instead.Sources: Shopify developer docs (Delivery Customization Function API, DeliveryCarrierService)
- Carrier-calculated shipping
- Advanced and Plus; Grow by fee or annual billingThe plan gate for carrier services, the apps that return real-time rates for each shipping origin; Grow stores add it for a monthly fee or with annual billing.Source: Shopify Help Center (Third-party carrier-calculated shipping)
Deploi’s call
No, not on the deploy cost alone. Make location a configuration input, not a constant, and this stops being a platform question. The recurring cost in the question is a design defect with a cheap fix. Migrating to native rules to escape it also discards whatever the custom code was doing that native rules cannot.
CustomizeKeep the custom code and move its locations into settings when
- A rate depends on a fact native settings do not model, such as package dimensions, the mix of items or a delivery date.
- New locations arrive often enough that a deploy for each one is a standing cost; Deploi's Function settings record scores editable settings CUSTOMIZE (October 2026).
- The code is a carrier service, an app that returns live rates and already receives the shipping location's address as the origin of every rate request (Shopify developer docs, October 2026).
BuyMove the rates to native shipping settings when
- Every case reduces to product, destination, shipping location, order value or weight (Shopify Help Center, October 2026).
- The code duplicates what shipping profiles already do, often after a Shopify Scripts port that skipped a keep, change or drop audit.
- Operations needs to change rates during peak without a developer.
Basis: Merchant-Editable Function Settings or Hardcode and Redeploy?, our Build vs. Buy decision record, scored CUSTOMIZE.
Is the per-location update a cost of Shopify Functions or of how the code was built?
The per-location update is a cost of how the custom shipping code was built, not of Shopify Functions. Whoever built it wrote location identifiers into the code as constants, so every new warehouse means a code change, a build and a deploy. Code that reads its locations from settings, such as a metafield (a custom data field), turns the same change into a data edit. Who should build and own custom Shopify Functions is a separate decision from what the code costs when locations change.
| Design | A new location means | Who does it | When it breaks |
|---|---|---|---|
| Location identifiers written into the code | A code change, a build and a deploy | A developer | Every expansion, forever |
| Location identifiers read from settings or metafields | A data edit | Operations | Only when the logic itself changes |
If you are living the first row, price a refactor to the second row before a migration back to native rates. In our judgment the refactor usually costs less, because it keeps whatever the code does that native rates cannot.
What can custom code do to shipping rates on Shopify?
Custom rates for shipping to an address come from a carrier service, not from a Shopify Function. A carrier service is an app endpoint that returns real-time rates. For each request, Shopify sends it the origin address of the shipping location, the destination and the items (Shopify developer docs, October 2026). Carrier-calculated shipping is available on Advanced and Plus, and Grow stores can add it for a monthly fee or with annual billing (Shopify Help Center, October 2026).
For delivery options that already exist, the Delivery Customization Function can rename, sort and hide them, and a store can activate up to 25 (Shopify's Function reference, October 2026). Shipping discounts belong to the Discount Function instead, per the same reference. So custom code that prices shipping per location is a carrier service. A carrier service already receives the origin address with every request, which means it can look that location's rates up in settings instead of in code.
Deploi's Build vs. Buy record on shipping rate logic splits the work the same way: native rates for simple offers, a delivery-customization Function to hide, rename and reorder, and carrier-calculated apps for multi-origin complexity (October 2026).
What does a new location cost in Shopify's native shipping settings?
A new location costs an admin edit in every shipping profile it should ship from, and no developer. Most stores still use shipping profiles (Shopify Help Center, October 2026). Carrier-calculated rates sit in the same profile zones (Shopify Help Center, October 2026), so custom rate code needs that edit too. Shopify's shipping profiles page defines a profile as "a set of shipping rules for specific products and locations," and a store can create up to 99 custom profiles beside the general one. Inside each profile, location groups carry their own shipping zones and rates. A new location joins every profile automatically, but in the "Not fulfilling from" section (Shopify's fulfillment locations guide, October 2026). No rates apply there until someone adds the location to a location group.
Native shipping is changing too. In Shopify's newer model, shipping options by market, each rate uses location conditions to set the locations it ships from (Shopify's upgrade guide, October 2026). That model is in early access for certain stores, so check which model your store runs before you price a new location.
Which shipping rules still need code beyond native settings?
Shipping rules still need code beyond native settings, yours or an app's, when a rate depends on a fact native settings do not model. Native rates already cover product groups, destination zones and shipping locations, plus price-based and weight-based tiers (Shopify Help Center, October 2026). In our judgment most custom rate logic fits those, so name the fact that does not:
- The price depends on package dimensions, the mix of items or a delivery date. That is work for a carrier service, an app that returns live rates, because Shopify sends it every item with its quantity, weight and price (Shopify developer docs, October 2026).
- The offer depends on who the customer is, or an option must be hidden, renamed or reordered. That is a Delivery Customization Function, which can hide options for certain products or customers (Shopify's Function reference, October 2026). Public App Store apps run one on any plan; a custom app you own needs Shopify Plus (shopify.dev, October 2026).
- The rule decides which location fulfills the order. That is the Order Routing Location Rule Function, a beta that Shopify opens to Plus merchants by request only (Shopify's Order Routing reference, October 2026). Which Function category to build first covers when that request is worth making.
How do you decide between refactoring the code and moving to native rates?
Move to native rates only if every case reduces to product, destination, location, order value or weight; otherwise, refactor the code. Five steps settle it, and each can end the question early:
- Write the rate rule out. If every case fits those five facts, native settings carry it: migrate and delete the custom code.
- Name the fact that does not fit. That fact is the only reason the code exists, and the only thing it should do.
- Check the design. If the code reads locations as constants, refactor it to read them from settings before you consider migrating. Deploi's Function settings record scores that settings layer CUSTOMIZE (October 2026).
- Count your real change rate. Multiply the locations you add a year by the cost of one deploy (Deploi arithmetic). If that number is small, this was never the expensive problem.
- Price the monitoring either way. A carrier service, the app that returns live rates, gets no retry. An error or timeout shows another eligible rate or Shopify's default backup rates (Shopify Help Center, October 2026). Backup rates miss bugs: a service that answers with a success code shows its wrong prices, or none if it returns an empty list (Shopify developer docs, October 2026). For a Shopify Function, the monitoring guide describes no merchant-facing alert (shopify.dev, October 2026), so Deploi's observability record scores alerting CUSTOMIZE (October 2026).
When is the native rate table the better long-term choice?
The native rate table is the better long-term choice when the custom shipping code does nothing native settings cannot, or when operations cannot change rates without a developer:
- When the code does what profiles already do. Some was written before the merchant knew profiles could do it. Some came from a Shopify Scripts port that skipped the audit. Deploi's Scripts-to-Functions record starts every port by marking each rule keep, change or drop (October 2026).
- When operations cannot self-serve. A rate change that needs a developer does not happen during peak, which is when it matters.
- When the store is below Shopify Plus and relies on a public app. You depend on the vendor's settings anyway, so native profiles plus a delivery customization app is the simpler stack.
Deploi’s point of view
Our own position, from building on Shopify. Kept apart from the sourced facts above.
- What we’ve seen
- Shipping Functions carrying logic that profiles already handle are common, and they are usually inherited rather than chosen. A Scripts migration that ported rules faithfully without asking whether they were still necessary is the usual origin story.
- Where we disagree
- The standard framing treats this as custom-versus-native, a platform choice. It is a configurability choice, and the same question decides the lifetime cost of every Function a business owns, not just this one.
- What this page adds
- What a new location costs on each path, that Shopify Functions shape and discount shipping options while custom rates come from a carrier service, and the constants-versus-configuration distinction that causes the recurring cost in the question. The parent asks who builds; this page shows how a build decision made once becomes a bill forever.
Decision records behind this answer
When this answer changes
- Your store is upgraded from shipping profiles to shipping options by market, where each rate sets its ship-from locations by condition and some shipping apps are not compatible yet.
- Shopify lets the Delivery Customization Function create or reprice rates, not only rename, sort and hide them.
- Shopify changes which plans include carrier-calculated shipping.
- Order Routing Location Rule leaves beta and request-only access.
- Your expansion plan changes how many locations you add a year.
Related questions
This follows from Who actually builds custom Shopify Functions? Do we need an in-house developer or can an agency do it?
- Which of the five Shopify Functions categories (discount, shipping, payment, validation, fulfillment) should a mid-market brand tackle first if we can only afford one custom build this year?
Discount, not fulfillment, is the Shopify Function to build first for most mid-market brands, because a discount rule maps straight to margin.
- How do we write a clear brief for an agency to scope a custom Shopify Function, if we don't know the technical terms ourselves?
A clear Shopify Function brief answers 4 questions in plain words: what the rule reads and decides, how it meets other discounts, what happens when it fails, and who edits it.
Sources
Every figure on this page traces to one of these. Official and vendor pages are checked on the date shown; Deploi records are our own published decisions.
- Shopify Help Center, Shipping profiles
- Shopify Help Center, Managing fulfillment locations in shipping profiles
- Shopify Help Center, Setting up shipping zones and rates
- Shopify developer docs, Delivery Customization Function API
- Shopify Help Center, Third-party carrier-calculated shipping
- Shopify developer docs, DeliveryCarrierService
- Shopify Help Center, Upgrading from shipping profiles to shipping options by market
- Shopify developer docs, About Shopify Functions
- Shopify developer docs, Order Routing Location Rule Function API
- Shopify developer docs, Monitoring and handling errors in production
- Shopify Help Center, Backup shipping rates
- Deploi Build vs. Buy, Merchant-Editable Function Settings or Hardcode and Redeploy?
- Deploi Build vs. Buy, Should You Build or Buy Shipping Rate Logic on Shopify?
- Deploi Build vs. Buy, Build or Buy Observability for Checkout Functions on Shopify?
- Deploi Build vs. Buy, Should You Build or Buy Your Shopify Scripts-to-Functions Migration?