Country Fulfillment Rates - Per-Destination Rates and Quantity Tiers
Set per-country fulfillment rates in MerchantFlow, including parcel (per-order) pricing and per-unit quantity tiers. Covers how rates are resolved on each order and bulk setup via CSV.
Country Fulfillment Rates
Country fulfillment rates let you refine the flat default fulfillment rate on each variant with overrides per destination country - and per quantity tier within each country. If your supplier charges more to ship to Germany than to the United States, or charges a different price per parcel depending on quantity, country rates are how you model that accurately in your P&L. Orders shipping to a covered country use its rate; everywhere else falls back to the variant's default rate.
Note: In-app labels use the British spelling "Fulfilment" - this guide quotes them exactly as they appear on screen.
Prerequisites
Country rates extend the Per product fulfillment method, so all three of these must be true:
- Your fulfillment cost method is set to "Per product" on the Settings > Integrations > "Fulfilment Cost" card, or from the Cost settings card on the COGS page - see Fulfillment Costs
- No supported 3PL integration is connected (with a 3PL, carrier-reported costs own the fulfillment line)
- The "Country fulfilment rates" toggle is switched on (below)
How to Access
Enable in Settings
- Navigate to Settings > Financial Preferences and find the "Country fulfilment rates" card (it is only shown while the Per product method is active and no 3PL is connected), or use the "Country rates" control on the Cost settings card at the top of Profit > COGS
- Select "On - set rates per country" (the default is "Off - one rate for all destinations")
- Save
Note: Toggling this setting recomputes historical profit. Orders shipping to countries you cover will be re-costed with their country rates across your whole history, so expect past P&L figures to shift once rates are in place.
Set Rates per Variant on the COGS Page
- Go to Profit > COGS and expand a product to its variants
- Click the globe link labelled "Country fulfilment rates" next to the variant's fulfillment cost
- In the modal, click "Add country rate" and fill in:
- Country - the destination country
- "Cost per unit" - the per-unit rate for that destination
- "Min quantity (optional)" - the quantity tier floor. The hint reads: "Applies when the line quantity is at least this value. Leave as 0 for all quantities."
- Save. Existing overrides are listed with their country and, for tiered rates, a "{n}+ units" label
Each variant manages its own set of country overrides - rates you add here apply only to that variant.
Note: The "Add country rate" modal always saves a per-unit rate. To set a parcel (per-order) price for a country - one flat amount regardless of how many units ship in it - use the CSV importer's
fulfillment_basiscolumn (below) rather than this modal. That column also works on the API directly if you are scripting rate setup.
Two Rate Bases: Per Parcel or Per Unit
Every country rate has a basis, mirroring the flat default rate described in Fulfillment Costs:
- Per unit (default) - the rate is multiplied by the line quantity, exactly as a per-unit rate always has been.
- Per order - the rate is a parcel price, charged once per tier group rather than multiplied by quantity. Use this when your supplier bills one flat amount to ship a destination, however many units are in the box.
If your supplier already quotes a flat parcel price per destination, set fulfillment_basis to per_order on the CSV row and enter that amount directly - do not divide it by quantity. This also depends on the Bundles measured setting (Tenant.cogsTierScope, set on the COGS page's Cost settings card): a per_order rate is charged once per tier group, and what counts as one group - a single order line, everything sharing a product, or the whole order - is exactly what Bundles measured controls. See Fulfillment Costs for the full mechanics and a worked example of a shared multi-product parcel fee.
If your supplier instead quotes a genuine quantity discount (a lower per-unit rate at higher quantities, rather than one flat parcel price), keep the basis at per unit and build a quantity-tier ladder using the divide-by-quantity method below - this is the original, still-supported way to model country tiers and remains the only option available from the "Add country rate" modal.
Legacy Method: Deriving a Per-Unit Tier Rate
To convert a parcel price into a per-unit tier rate (rather than switching the row to a per_order basis), divide the total shipping price at each quantity by that quantity:
Tier rate = Total shipping at that quantity / QuantityWorked example. Your supplier ships one unit to the United States for $6.81 total, but ships two units together for $8.00 total:
| Rate | "Cost per unit" | Min quantity | An order line books |
|---|---|---|---|
| Base rate | 6.81 | 0 | 1 unit: 1 x 6.81 = $6.81 |
| Quantity tier | 4.00 | 2 | 2 units: 2 x 4.00 = $8.00 |
Without the tier, a 2-unit order would book 2 x 6.81 = $13.62 - nearly double the real cost. This still works and is the only option in the "Add country rate" modal today, but if the amount you were quoted is genuinely one flat price for the parcel (not a lower per-unit price at higher quantity), a per_order basis via CSV is the more direct fit and avoids re-deriving the math every time your supplier's pricing changes.
Note: If your fulfillment costs look inflated on multi-unit orders, this is almost always the cause: a per-parcel price was entered as a per-unit rate. Fix it with a
per_orderbasis (preferred) or with tiers - not by lowering the base rate.
How Rates Are Resolved
For each order line, MerchantFlow resolves the fulfillment rate in this order:
- Carrier data first - an order that already carries a carrier-reported fulfillment cost keeps that stored value and never consults country rates at all
- Destination match - the order's shipping country is matched against your overrides (exact ISO alpha-2 match; an order with no shipping country skips straight to the default rate)
- Source, then product identity - within that country's overrides, manual entries are checked first across the whole variant -> SKU -> product chain, then entries from any source down the same chain, then the earliest entry as a back-compat fallback
- Quantity tier - among matching rates, the highest tier whose minimum quantity does not exceed the tier quantity wins (the bound is inclusive, and a tier has no upper limit - it is capped only by the next tier above it). What counts as "the tier quantity" depends on Bundles measured - see below
- Fallback - if the country is not covered, or no tier qualifies, the line falls back to the variant's flat default rate from the COGS page
- Unset - if there is no default rate either, the line contributes exactly 0 (never estimated)
For a per-unit rate, the final cost is resolved per-unit rate x that line's own quantity. The tier quantity decides which rate wins; the line quantity is what it is multiplied by. For a per-order rate, the resolved rate is charged once per tier group and is not multiplied at all (see above).
Quantity Tiers and the Bundles Measured Setting
Country-rate tiers compare against the tier quantity, which is controlled tenant-wide by Bundles measured (Tenant.cogsTierScope, on the COGS page's Cost settings card) - the same setting that governs Price Breaks:
| Bundles measured | Tier quantity for a country rate |
|---|---|
| "Per order line" (default) | Just that one order line's own quantity |
| "Per product in the order" | Every line in the order resolving to the same product, added together |
| "Across the whole order" | Every line in the order, whatever the product |
"Per order line" is the default, and reproduces the original behaviour exactly: an order with 2 units of Product A and 1 unit of Product B resolves A at its 2+ tier and B at its base rate, and the three combined units do not push B into a higher tier. If your supplier prices parcels across mixed products, switch Bundles measured to "Per product in the order" or "Across the whole order" rather than trying to approximate it with per-line tiers.
Bulk Setup via CSV
For many products or countries, load rates through the COGS CSV importer instead of the modal. The importer accepts these columns (header names are case-insensitive):
| Field | Accepted headers |
|---|---|
| SKU (required, or use variant_id) | sku, variant_id |
| Per-unit or per-order rate | fulfillment_cost, fulfilment_cost, fulfillment, fulfilment |
| Rate basis | fulfillment_basis, fulfilment_basis, fulfillment basis, fulfilment basis - per_unit (default) or per_order |
| Destination country | country_code, country, destination_country, ship_country |
| Quantity tier floor | fulfillment_min_quantity (on a row that also carries cost) or min_quantity (on a country-rate-only row) |
- A row with a country column writes a country override; the same row can also carry a
costcolumn to update COGS independently. - A country-rate-only file (just
sku,country_code, andfulfillment_cost) is valid - nocostcolumn needed. On such a row,min_quantitysets the country-rate tier directly. - The CSV import is currently the only way to set a country rate's basis to
per_order- the "Add country rate" modal always writesper_unit.
See Importing COGS for the full importer reference.
Currency and Historical Recompute
- All rates are entered and stored in your store currency - a rate for Germany is not entered in euros unless your store currency is EUR. MerchantFlow does not convert country rates from local currencies.
- Every rate you add, change, or delete triggers an automatic recompute of historical profit, because the earliest configured rate also backfills orders that predate it. Recent P&L views update quickly; product-level figures may lag a few minutes on large stores.
Worked Example: Country Rates Combined with Price Breaks
A supplier quotes different prices per destination and per quantity for the same product:
| Destination | 1 unit | 2 units (total) | 3 units (total) |
|---|---|---|---|
| United States | $6.81 | $8.00 | $9.50 |
| Germany | $9.20 | $11.40 | $13.90 |
This is two separate configurations working together, not one feature:
- Product cost (Price Breaks) - if these numbers describe what you pay your supplier for the goods, enter them as a price-break ladder on the variant with basis "a total for the quantity".
- Delivery cost (this page) - if these numbers describe what it costs to ship the order, enter them as country rates instead: for each destination, add a base rate at quantity 1 and further rows with
min_quantity2 and 3, using the divide-by-quantity method (or aper_orderbasis via CSV if a given quantity is genuinely a flat parcel price rather than a stepped per-unit rate).
The two mechanisms never conflict, because product cost and fulfillment cost are separate lines of the P&L waterfall and are resolved independently - a single variant can carry a price-break ladder for its product cost and a full set of country rates for its delivery cost at the same time.
Best Practices
1. Derive Tiers from Real Supplier Invoices
Take actual parcel prices at each quantity from your supplier's rate card or invoices. Use a per_order basis directly when the invoice shows one flat parcel amount; use the divide-by-quantity rule only when it shows a genuine per-unit discount. Guessing tier rates defeats the purpose of the feature.
2. Cover Your Top Destinations First
Add rates for the countries that drive most of your volume, and let the flat default rate catch the long tail. You do not need every country covered for the P&L to improve materially.
3. Keep a Base Rate at Min Quantity 0
Always give each covered country a rate with minimum quantity 0 (or 1). If every tier has a higher floor, single-unit orders fall back to the flat default rate, which may not match that country at all.
4. Bulk-Load Large Catalogs
For more than a handful of variants, maintain rates in a spreadsheet and import via CSV. The modal is best for spot corrections to a per-unit rate; CSV import is currently the only way to add a per_order (parcel) country rate.
Troubleshooting
My country rates are being ignored
Cause: One of the prerequisites is not met - a 3PL is connected, the fulfillment method is not "Per product", or the "Country fulfilment rates" toggle is off. Individual orders that already carry a carrier-reported cost (for example, from a previously connected 3PL) also keep that stored value and never consult country rates. Solution: Check Settings > Integrations (or the Cost settings card on the COGS page) for the method and Settings > Financial Preferences for the toggle. With a 3PL connected, carrier costs are used by design.
Costs balloon on multi-unit orders
Cause: A per-parcel price was entered as a per-unit rate.
Solution: Import the rate again with fulfillment_basis set to per_order, or apply the legacy tier math above (total shipping at that quantity / quantity) as the tier's "Cost per unit". If the order can contain more than one product, also check the Bundles measured setting.
A destination is not picking up its rate
Cause: The order's shipping country does not exactly match the override's country, or the rate was added on a different variant than the one ordered. Solution: Confirm the override exists on the ordered variant and for the exact destination country. Unmatched lines silently use the flat default rate.
Historical profit changed after I toggled the setting
Cause: Enabling or disabling country rates recomputes past orders against the new configuration. Solution: This is by design - the P&L now reflects the rates you configured. If the change looks wrong, review the rates themselves rather than the toggle.
Frequently Asked Questions
Do quantity tiers look at the whole order?
By default, no - tiers use each order line's quantity independently, so two different products in one order each resolve their own tier. This is controlled by the Bundles measured setting: switch it to "Per product in the order" or "Across the whole order" if you need tiers to look beyond a single line. See Quantity Tiers and the Bundles Measured Setting above.
What happens for a country I have not covered?
The line falls back to the variant's flat default rate from the COGS page. If that is unset too, the line contributes 0 fulfillment cost.
Can I use country rates with the Percentage method?
No. Country rates refine the Per product method only. The Percentage method applies one ratio of product cost regardless of destination.
Can I mix a flat default rate with country overrides?
Yes - that is the intended setup. The flat rate on the variant is the catch-all; country overrides supersede it for covered destinations.
Are rates converted from local currencies?
No. Every rate is in your store currency. Convert your supplier's local-currency pricing before entering it.
Does deleting a rate also recompute history?
Yes. Adding, editing, or deleting any rate triggers the same historical recompute so past orders always reflect the current configuration.
Can I set a parcel (per-order) country rate from the dashboard?
Not from the "Add country rate" modal today - it always writes a per-unit rate. Use the CSV importer's fulfillment_basis column (set to per_order) to load a parcel-priced country rate.
Related Guides
- Fulfillment Costs - the three fulfillment methods, prerequisites, and per-order (parcel) rates
- Price Breaks - quantity-tiered product cost and the Bundles measured setting
- Importing COGS - CSV bulk setup for rates and costs
- COGS Management - product cost tracking fundamentals
- Margin by Region - see per-country profitability once rates are set
- P&L Overview - the full profit waterfall
Last updated: August 23, 2026
Last updated on
Fulfillment Costs - 3PL, Percentage, and Per-Product Methods
Configure fulfillment costs in MerchantFlow with 3PL carrier data, a percentage of product cost, or per-unit supplier rates. Covers cost estimation, the 3PL gate, and choosing the right method for your store.
Ad Spend Tracking Across Platforms
Track advertising spend across Meta, Google, TikTok, and Snapchat in MerchantFlow. View ROAS, campaign performance, and cost-per-conversion automatically.