MerchantFlowMerchantFlow Docs
Profit & Loss

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.

Fulfillment Costs

Fulfillment cost in MerchantFlow is what it costs you to get a sold order to the customer - carrier charges, pick and pack fees, or the per-unit shipping price your supplier bills you. It is tracked as its own line in the P&L waterfall, separate from COGS, and MerchantFlow supports three ways to capture it: real carrier costs from a connected 3PL, a percentage of product cost, or per-unit rates you set on each product. This guide explains all three methods, how to configure them, and how they interact.

Note: In-app labels use the British spelling "Fulfilment" (for example, the "Fulfilment Cost" settings card). This guide quotes those labels exactly as they appear on screen.

What Is Fulfillment Cost?

Fulfillment cost covers the order-level cost of delivery:

  • Carrier shipping charges reported by your 3PL
  • Pick, pack, and packaging material fees
  • The per-unit fee a dropshipping supplier charges to ship each item

Fulfillment cost is not part of COGS. COGS is the cost to acquire or produce the product (including freight from your supplier to your warehouse); fulfillment is the cost of delivering a sold order. The two land in different lines of the profit waterfall:

Gross Profit = Net Revenue - COGS
Contribution Margin = Gross Profit - Shipping - Fulfillment - Payment Fees - Ad Spend

Why it matters: if you fold delivery costs into COGS, your gross margin understates product profitability and you cannot see fulfillment efficiency trends separately.

Note: Use this fulfillment configuration for per-order delivery costs. Fulfillment-adjacent overhead that does not scale per order - bulk packaging purchases, warehouse rent, storage fees - belongs in Expenses. Recording the same cost in both places would double-count it.

The Three Fulfillment Cost Methods

MethodCost is based onPrecisionWhen it applies
3PL integrationActual carrier charges per orderHighestWhenever a supported 3PL is connected
PercentageA percentage of each unit's product cost (COGS)ApproximateNo 3PL connected, method set to Percentage
Per productA per-unit rate you set on each variantHigh (if rates are accurate)No 3PL connected, method set to Per product

Method 1: 3PL Integration (Actual Carrier Costs)

If you fulfill through a supported 3PL - Speedfulfill, CJ Dropshipping, Gooten, ShipMonk, or Printful - MerchantFlow syncs the actual cost charged for each order and attributes it to that order in the P&L.

Carrier-reported costs always win. Once a 3PL reports a cost for an order, MerchantFlow never overwrites it with a derived or estimated figure. A carrier-reported cost of zero is still treated as authoritative (for example, when a shipping discount covered the full charge).

Replacement shipments are included. If a 3PL reships an order and bills that replacement on top of the original, MerchantFlow adds the extra charge to the same order's fulfillment cost rather than leaving it out of the P&L. A replacement sent free of charge adds nothing. Speedfulfill reports these today.

"Connected" means usable, not merely present. A stale Speedfulfill credential, a CJ token whose initial exchange never completed, or a ShipMonk/Printful integration whose feature flag is off does not count as a connected 3PL - so per-product rates keep applying instead of the fulfillment line silently dropping to zero.

Merchant-entered costs are protected too. A fulfillment cost you type in yourself - on a manual B2B order, or via the Adjust order editor on a synced order - is treated as authoritative for the same reason a hand-entered COGS row is: a deliberate human entry outranks an automated guess. It is never overwritten by per-product derivation.

Use when: your 3PL is supported. This is the most accurate method and needs no manual configuration beyond connecting the integration.

Method 2: Percentage of Product Cost

The Percentage method estimates fulfillment as a percentage of each sold unit's product cost - not a percentage of revenue or order value. For every unit sold, MerchantFlow adds unit product cost x percentage to the fulfillment line.

Fulfillment cost per unit = Unit product cost x (Percentage / 100)
  • The percentage applies to the product cost alone. Per-unit handling loaded onto the same cost entry is not part of the base, so the estimate is a percentage of CM1's cost line rather than of full COGS.
  • The percentage must be between 0.01 and 100.
  • Units with no COGS entry contribute nothing to the estimate, so COGS coverage directly affects how complete this figure is.
  • Orders with a refund are skipped by the percentage calculation.

Use when: you want a quick, blended approximation and your fulfillment spend genuinely tracks your product cost. Because the percentage applies to product cost, this method is a poor fit when shipping costs many times more than the product itself (common in dropshipping, where a $0.90 product may cost $7.00 to ship) - use the Per product method instead.

Method 3: Per-Product Rates

The Per product method lets you enter what you pay your supplier to fulfill each unit of each variant - or, if your supplier bills a single parcel price, the whole order at once. Each rate has a basis:

"one item" basis:       Fulfillment cost per line  = Rate x Quantity
"the whole order" basis: Fulfillment cost per group = Rate (charged once, not multiplied)
  • Rates and their basis are set per variant on the COGS page (see below).
  • A variant with no rate contributes exactly 0 - it is never backfilled with an estimate.
  • The method only applies while no 3PL is connected. Connecting a supported 3PL switches fulfillment to carrier data automatically.

Use when: you pay your supplier a known fee to fulfill orders (typical for dropshipping and supplier-fulfilled stores) and no supported 3PL is in the picture.

Note: If your supplier quotes a per-parcel price rather than a per-item one, set the rate's basis to "the whole order" instead of dividing the parcel price by quantity yourself - MerchantFlow will charge it once instead of multiplying it by every unit on the order. See Bundles Measured and Parcel Rates below for an important detail about how "the order" is counted on multi-line orders. If your supplier instead charges less per unit as quantity increases (without a flat parcel price), use Price Breaks on the product-cost side or Country Fulfillment Rates quantity tiers on the delivery side.

How to Access

Navigate to Settings > Integrations and find the "Fulfilment Cost" card. The card shows an "Active" pill once a method is configured.

To use the Percentage method:

  1. Select "Percentage" on the card's toggle
  2. Enter a value in the "Fulfilment Cost %" field (for example, 15)
  3. Click "Save"

To use the Per product method:

  1. Select "Per product" on the toggle
  2. Click "Enable per-product costs"
  3. Follow the "Set per-product costs on the COGS page" link to enter rates per variant

To turn the feature off entirely, click "Remove fulfilment cost".

The mode toggle is only shown while no usable 3PL is connected - with a 3PL active, carrier data owns the fulfillment line and the manual methods are not applicable.

Note: The same method toggle (plus the country-rates toggle and the Bundles measured setting below) is also editable from a "Cost settings" card at the top of Profit > COGS, so you rarely need to leave that page to change how costs are calculated. See COGS Management.

Choosing a Method During Onboarding

The onboarding flow includes a Fulfillment & Shipping Costs step. You can connect a supported 3PL directly, choose "My 3PL is not listed" to set a percentage of product cost, or choose "I pay my supplier directly" to enable per-product rates. Picking "Skip for now" leaves fulfillment cost unconfigured - your contribution margin will overstate profit until you set one up.

Setting Per-Unit or Per-Order Rates on the COGS Page

With the Per product method enabled, go to Profit > COGS and expand a product to its variants. Click a variant's cost to open the inline editor: alongside the unit cost input you will see an amber "Fulfilment cost per unit" input, and next to it a "for" dropdown offering "one item" or "the whole order". Enter the rate, choose the basis that matches your supplier's quote, and save. A live preview - "A 2-item order books {amount}" - updates as you type, so you can sanity-check the basis before saving.

  • Under each variant's cost, the page shows the saved rate (for example, "$6.81 fulfilment") or an amber "Fulfilment unset" marker. The display does not currently distinguish a per-item rate from a per-order one - use the inline editor to check the basis if you are unsure.
  • "Fulfilment unset" means that variant adds 0 to fulfillment cost on every order. MerchantFlow deliberately never estimates a missing per-product rate, so unset variants silently understate your costs - review them regularly.
  • Saving a fulfillment rate without changing the cost does not create a manual COGS override, so store cost sync keeps working for that variant.
  • You can also load rates in bulk through the CSV importer's fulfillment_cost and fulfillment_basis columns - see Importing COGS.

Bundles Measured and Parcel Rates

A "the whole order" rate is charged once per tier group, not once per literal order - and which lines count as one group is controlled by the Bundles measured setting (Profit > COGS > Cost settings, also documented in full at Price Breaks):

Bundles measuredWhat "the whole order" actually charges once for
"Per order line" (default)Each order line separately - so a "the whole order" rate is charged once per line, not once per order
"Per product in the order"Once per product, across every line of that product in the order
"Across the whole order"Once for the entire order, regardless of how many products or lines it contains

This matters: if your supplier bills one flat parcel fee no matter how many different products are in the box, set the rate's basis to "the whole order" and set Bundles measured to "Across the whole order". Leaving Bundles measured on the default "Per order line" while using a "the whole order" rate will still charge the parcel fee separately for every distinct line item on a multi-product order - a smaller version of the exact doubling problem the basis option exists to fix.

Worked example. Your supplier charges a flat $6.50 to ship a parcel, however many items it contains. A customer orders 1 unit of Product A and 2 units of Product B in a single checkout (two order lines).

  1. Set the "Fulfilment cost per unit" rate to 6.50 with basis "the whole order" on both variants. Rates are per variant -- there is no store-wide default rate, so every variant that can land in the parcel needs one.
  2. Set Bundles measured to "Across the whole order" in the Cost settings card.
  3. The order now books fulfillment cost of exactly $6.50 once, regardless of how many lines or units it contains - not $6.50 per line ($13.00) and not $6.50 per unit ($19.50).

Fulfillment Cost Estimation

Carriers and 3PLs can take a few days to report costs back. The Fulfilment Cost Estimation setting (in Settings > Financial Preferences) fills that reporting gap on the dashboard:

  • Off - show only carrier-reported cost (default): profit reflects only confirmed fulfillment data.
  • On - estimate the last 7 days: orders placed in the last 7 days that have no reported cost receive an estimated cost.

The estimate uses your store's historical average cost per order (computed over the last 90 days of carrier-reported costs, and only once at least 5 such orders exist). If there is no reliable history, it falls back to your configured fulfillment percentage applied to average order value - note this is a different basis from the Percentage method itself, which applies the percentage to unit COGS. When an estimate is included, the dashboard shows an amber pill: "Includes {amount} estimated fulfilment".

Two important boundaries:

  • Estimation never touches stores using the Per product method with no 3PL connected - per-product figures are already complete at order time, and unset rates are intentionally left at 0 rather than guessed.
  • Estimates are a dashboard overlay only. Stored P&L records keep the confirmed figures, and the estimate disappears as real carrier data arrives.

Connecting or Disconnecting a 3PL

Connecting a supported 3PL changes fulfillment behavior immediately:

  • Per-product derivation stops; carrier data takes over as each order's cost syncs.
  • Previously derived per-product figures are kept until the carrier reports the real cost for those orders, then overwritten order by order.
  • The estimation overlay becomes available for orders the carrier has not reported yet.

Switching your fulfillment method (for example, from Per product to Percentage, or turning it off) triggers an automatic recalculation of historical order margins so the P&L stays consistent with the new method.

Best Practices

1. Let the 3PL Win

If a supported 3PL is connected, do not try to maintain per-product rates alongside it - carrier data is authoritative and the manual methods are inactive by design.

2. Use Percentage as a Stopgap, Per Product for Accuracy

The percentage method is quick to set up but blends everything into one ratio of product cost. If you know your per-unit supplier fees, per-product rates give order-accurate figures.

3. Audit "Fulfilment unset" Variants

Unset variants contribute zero fulfillment cost without warning. Scan the COGS page for amber "Fulfilment unset" markers whenever you add products.

4. Enable Estimation Only Once History Exists

The 7-day estimation needs at least 5 orders with carrier-reported costs (or a configured percentage) before it can produce a number. Turning it on earlier has no effect.

Troubleshooting

Fulfillment cost is 0 for some orders

Cause: The ordered variants have no per-unit rate set ("Fulfilment unset"), and unset rates are never estimated. Solution: Set the rate in the variant's inline editor on Profit > COGS, or bulk-load rates via CSV import. Historical orders recalculate automatically.

Per-product rates are being ignored

Cause: A supported 3PL is connected, so carrier data owns the fulfillment line. Solution: This is by design. Disconnect the 3PL only if it no longer fulfills your orders; otherwise trust the carrier-reported costs.

Fulfillment cost doubles or triples on multi-unit orders

Cause: A per-parcel shipping price was entered as a "one item" rate, so it multiplies by quantity. Solution: Switch the rate's basis to "the whole order" instead of dividing the parcel price by hand. If the order can span more than one line item, also check Bundles measured - see Bundles Measured and Parcel Rates above. For rates that genuinely scale down per unit as quantity rises (rather than one flat parcel price), model it with Price Breaks or Country Fulfillment Rates quantity tiers instead.

The estimated fulfillment pill never appears

Cause: The estimation setting is off, fewer than 5 orders have carrier-reported costs and no percentage is configured, or your store uses the Per product method without a 3PL (estimation is intentionally inactive there). Solution: Check Settings > Financial Preferences, and confirm your store meets the history or percentage requirement.

Percentage cost looks far too low

Cause: The percentage applies to product cost, not to revenue or order value. A 15% setting on a $2 unit cost adds only $0.30 per unit. Solution: If your delivery cost does not track product cost, switch to the Per product method and enter real per-unit rates.

Frequently Asked Questions

Is fulfillment cost part of COGS?

No. COGS covers acquiring or producing the product, including supplier-to-warehouse freight. Fulfillment cost covers delivering sold orders and is deducted separately at the contribution margin line. See COGS Management.

Which method wins if more than one is configured?

A connected 3PL always wins. The Percentage and Per product methods only apply while no supported 3PL is connected, and only one of them can be active at a time.

Do refunded orders get fulfillment cost?

Under the percentage method, orders with a refund are skipped. Under the per-product method, refunded orders keep their fulfillment cost - you paid the supplier to ship regardless. 3PL costs reflect whatever the carrier actually charged.

What currency are rates and percentages in?

Everything is in your store currency. Per-unit and per-order rates, country rates, and derived costs are all entered and reported in the same currency as your P&L.

What is the difference between a "one item" rate and price breaks?

A "one item" vs "the whole order" rate basis is about how a single configured rate is charged - once per item or once per group. Price Breaks is a different mechanism on the product-cost side: a whole ladder of different rates at different quantities (for example, cheaper per unit at 2+, cheaper again at 5+). Use a per-order rate for a flat parcel fee; use price breaks when your supplier's per-unit price genuinely steps down at each quantity.

Why does Margin by Region show an estimated fulfillment figure?

The Margin by Region page uses the same fulfillment configuration described here, including the estimation overlay for recent orders that carriers have not reported yet.

Can I vary fulfillment cost by destination country?

Yes - with the Per product method, enable Country Fulfillment Rates to override the flat per-unit rate for specific destination countries and quantity tiers.


Last updated: August 29, 2026

Last updated on

On this page