# 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?

Reviewed by Martin Dejnicki, Director of SEO & AI Search · facts verified October 8, 2026 · canonical: https://deploi.ca/shopify/faq/shipping-function-maintenance-vs-native-rate-table

## 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](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles/managing-fulfillment-locations), October 2026).

- **New location in shipping profiles:** Joins every profile with no rates. Shopify 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 ([Shopify Help Center, Managing fulfillment locations in shipping profiles](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles/managing-fulfillment-locations))
- **Custom shipping profiles:** Up to 99, plus the general profile. Each profile groups products for shipping, and each location group inside it carries its own shipping zones and rates ([Shopify Help Center, Shipping profiles](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles); [Shopify Help Center, Managing fulfillment locations in shipping profiles](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles/managing-fulfillment-locations))
- **Delivery customization Functions:** Rename, sort and hide options; 25 per store. Shopify's Delivery Customization Function API changes options that already exist; custom prices come from a carrier service app instead ([Shopify developer docs, Delivery Customization Function API](https://shopify.dev/docs/api/functions/latest/delivery-customization); [Shopify developer docs, DeliveryCarrierService](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryCarrierService))
- **Carrier-calculated shipping:** Advanced and Plus; Grow by fee or annual billing. The 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 ([Shopify Help Center, Third-party carrier-calculated shipping](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/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.

**CUSTOMIZE: Keep 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](https://deploi.ca/shopify/build-vs-buy/merchant-configurable-function-settings) 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](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryCarrierService), October 2026).

**BUY: Move the rates to native shipping settings when**

- Every case reduces to product, destination, shipping location, order value or weight ([Shopify Help Center](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/setting-up-shipping-rates), 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.

## 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](https://deploi.ca/shopify/faq/shopify-functions-in-house-developer-vs-agency) is a separate decision from what the code costs when locations change.

**Deploi's comparison: hardcoded locations cost a deploy per new warehouse, while locations read from settings cost a data edit**

| 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](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryCarrierService), 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](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/third-party-carrier-calculated-shipping), 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](https://shopify.dev/docs/api/functions/latest/delivery-customization), 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](https://deploi.ca/shopify/build-vs-buy/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](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles), October 2026). Carrier-calculated rates sit in the same profile zones ([Shopify Help Center](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/setting-up-shipping-rates), 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](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles/managing-fulfillment-locations), 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](https://help.shopify.com/en/manual/fulfillment/setup/shipping-options/whats-changing-with-shipping), 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](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/setting-up-shipping-rates), 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](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryCarrierService), 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](https://shopify.dev/docs/api/functions/latest/delivery-customization), October 2026). Public App Store apps run one on any plan; a custom app you own needs Shopify Plus ([shopify.dev](https://shopify.dev/docs/apps/build/functions), 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](https://shopify.dev/docs/api/functions/latest/order-routing-location-rule), October 2026). [Which Function category to build first](https://deploi.ca/shopify/faq/shopify-functions-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:

1. **Write the rate rule out.** If every case fits those five facts, native settings carry it: migrate and delete the custom code.
1. **Name the fact that does not fit.** That fact is the only reason the code exists, and the only thing it should do.
1. **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](https://deploi.ca/shopify/build-vs-buy/merchant-configurable-function-settings) scores that settings layer CUSTOMIZE (October 2026).
1. **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.
1. **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](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/backup-rates), 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](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryCarrierService), October 2026). For a Shopify Function, the monitoring guide describes no merchant-facing alert ([shopify.dev](https://shopify.dev/docs/apps/build/functions/monitoring-and-errors), October 2026), so [Deploi's observability record](https://deploi.ca/shopify/build-vs-buy/checkout-function-production-observability) 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](https://deploi.ca/shopify/build-vs-buy/scripts-functions-migration) 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.

> **When moving to native rates is the wrong call**
> - **When a rate depends on a fact profiles do not model,** and you can name it in one sentence.
> - **When the change rate is low.** Two new locations a year at a small deploy cost is noise.
> - **When the code already reads its locations from settings.**
> - **During peak season.** In our judgment rate changes are the riskiest change at checkout, because a failure is invisible in the code and expensive in the orders.

## Deploi's point of view

**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.

## 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.

## Sources

1. [Shopify Help Center, Shipping profiles](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles), checked October 8, 2026
2. [Shopify Help Center, Managing fulfillment locations in shipping profiles](https://help.shopify.com/en/manual/fulfillment/setup/shipping-profiles/managing-fulfillment-locations), checked October 8, 2026
3. [Shopify Help Center, Setting up shipping zones and rates](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/setting-up-shipping-rates), checked October 8, 2026
4. [Shopify developer docs, Delivery Customization Function API](https://shopify.dev/docs/api/functions/latest/delivery-customization), checked October 8, 2026
5. [Shopify Help Center, Third-party carrier-calculated shipping](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/third-party-carrier-calculated-shipping), checked October 8, 2026
6. [Shopify developer docs, DeliveryCarrierService](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryCarrierService), checked October 8, 2026
7. [Shopify Help Center, Upgrading from shipping profiles to shipping options by market](https://help.shopify.com/en/manual/fulfillment/setup/shipping-options/whats-changing-with-shipping), checked October 8, 2026
8. [Shopify developer docs, About Shopify Functions](https://shopify.dev/docs/apps/build/functions), checked October 8, 2026
9. [Shopify developer docs, Order Routing Location Rule Function API](https://shopify.dev/docs/api/functions/latest/order-routing-location-rule), checked October 8, 2026
10. [Shopify developer docs, Monitoring and handling errors in production](https://shopify.dev/docs/apps/build/functions/monitoring-and-errors), checked October 8, 2026
11. [Shopify Help Center, Backup shipping rates](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/backup-rates), checked October 8, 2026
12. [Deploi Build vs. Buy, Merchant-Editable Function Settings or Hardcode and Redeploy?](https://deploi.ca/shopify/build-vs-buy/merchant-configurable-function-settings), checked October 8, 2026, Deploi research
13. [Deploi Build vs. Buy, Should You Build or Buy Shipping Rate Logic on Shopify?](https://deploi.ca/shopify/build-vs-buy/shipping-rate-logic), checked October 8, 2026, Deploi research
14. [Deploi Build vs. Buy, Build or Buy Observability for Checkout Functions on Shopify?](https://deploi.ca/shopify/build-vs-buy/checkout-function-production-observability), checked October 8, 2026, Deploi research
15. [Deploi Build vs. Buy, Should You Build or Buy Your Shopify Scripts-to-Functions Migration?](https://deploi.ca/shopify/build-vs-buy/scripts-functions-migration), checked October 8, 2026, Deploi research
