How to stop margin compression when selling on Amazon, Shopify, and TikTok Shop
Margins usually do not disappear in one dramatic fee. Amazon, Shopify, and TikTok Shop each shave contribution through different marketplace fees, fulfillment, acquisition, returns, discounts, and operational leakage — then blended revenue hides the channel and SKU doing the damage. Here is the operator loop for finding it and stopping it.
The margin did not vanish. It got split across three ledgers.
The short answer is that margin compression is usually not one dramatic fee. Amazon, Shopify, and TikTok Shop each shave a little more from the same order through different channel fees, fulfillment, acquisition, discounts, returns, and operational leakage — then blended revenue averages the damage away. By the time the founder sees a soft blended margin in the morning, the unprofitable channel-SKU pair may have been subsidizing the rest of the business for weeks.
Start with the order economics, not the topline. Put every SKU on the channel where it sold, charge it for the work that sale created, and make the contribution result visible before you decide whether to add spend, reorder stock, or run another promotion. The operator question is not “Which channel grew?” It is “Which channel and SKU still paid us after everything variable was taken out?”
Three channels, three ways to shave the same SKU.
Multichannel selling is powerful because the channels reach different buyers. It is hard to manage because they do not charge you, acquire demand, or create work in the same way. The same unit can be a good order in one channel and a contribution hole in another.
Amazon: marketplace and FBA costs arrive with the claims queue.
Amazon’s stack includes marketplace fees, FBA pick-and-pack, storage or removal, inbound and prep work, returns, and the claims or adjustments that follow a shipment. A seller can look at the order price minus landed COGS and call the unit profitable while the fulfillment, return, and claim exposure has already consumed the contribution. The Amazon-specific operating loop needs those costs attached to the SKU before a reorder or promotion gets approved.
Shopify: payment, fulfillment, and paid acquisition move together.
Shopify gives you more control over the storefront, but the cost stack does not stop at COGS. Payment processing, pick-and-pack, shipping, 3PL charges, discounts, returns, and the paid acquisition that brought the customer through the door all belong to the order economics. Read the DTC and Shopify operating loop at the contribution level, or a good-looking ROAS can still be attached to a loss-making SKU after fulfillment and returns land.
TikTok Shop: velocity brings commissions and operational drag.
TikTok Shop adds commissions, creator and affiliate payouts, live-stream incentives, pooled ad spend, and the stock, customer-service, and returns work that arrives when a product accelerates. Velocity is useful only if the unit economics survive it. The TikTok Shop and GMV Max loop has to treat a spike as a margin and inventory decision, not just a reason to leave the budget open.
Run the ledger at channel × SKU level.
The useful view is contribution margin, not a blended average. For a practical operator ledger, the row is:
Contribution dollars = net sales − COGS − channel/payment fees − fulfillment/shipping − discounts − returns/refunds − paid/affiliate acquisition − variable operating cost.
Define each field once and keep the components visible. If your system already nets a discount or refund into net sales, do not subtract the same amount twice; record the adjustment separately so the operator can still see what caused the change. The point is not accounting theatre. It is being able to answer which variable cost moved when a channel-SKU pair crossed its floor.
- Revenue is the topline booked by the order. It tells you demand arrived, not that the order was worth taking.
- Gross margin removes COGS from revenue. It is useful for product economics, but it does not pay the channel, carrier, ad platform, affiliate, or returns bill.
- Contribution margin removes the variable costs caused by that channel and SKU. This is the number to trust for price, promotion, spend, and reorder decisions.
- Blended averages combine channels with different economics. Keep them for business-level trend reporting, but never use them to approve the next dollar of spend or the next purchase order.
Review the result in the weekly contribution rollup in Reports with channel, SKU, inventory position, and the reason for the change in the same view. If the rollup only shows GMV or ROAS, it is describing activity — not telling you what to protect.
The recovery loop is small enough to run every week.
Margin recovery does not require a heroic spreadsheet project. It requires a short loop that makes the same decision at the same level every week:
- Set a channel-SKU margin floor. Include the real variable costs and decide what contribution is required before a sale is worth scaling.
- Review weekly contribution. Use the contribution dollars and margin percentage, not GMV or ROAS alone, and compare the result with the floor and the inventory position.
- Apply channel-specific rules. Change the price, pack size, promotion, or fulfillment method where the economics require it. A single universal rule is convenient until it makes one channel subsidize another.
- Brake spend when the inputs drift. If contribution falls below the floor or inventory cannot support the velocity, pause or reduce the spend that is creating the exposure before the next review.
- Centralize reorder and exceptions. One operator should see the evidence before the same SKU gets reordered for one channel, promoted on another, and left to absorb the loss in a blended average.
The case studies show the pause, reorder, and reply workflow in the same operator-shaped sequence: notice the exception, make the reversible move, and keep the reason attached for the next review. That is the useful connection between margin control and the rest of the operating queue — decisions stay explainable instead of disappearing into a dashboard average.
Price the operator against recovered contribution, not against a vague promise to “grow everywhere.” The Tideline pricing page is the right place to evaluate that trade: what does the operating loop need to recover before the work has paid for itself?
Frequently asked questions
Why do margins compress when I sell on multiple channels?
Margins compress because Amazon, Shopify, and TikTok Shop apply different fees, fulfillment costs, acquisition costs, promotion rules, return exposure, and operational work to the same SKU. A blended revenue average hides which channel and SKU are carrying the loss, so the business looks healthy until contribution is reviewed at the channel-SKU level.
Which costs belong in contribution margin?
Use net sales and subtract COGS, channel and payment fees, fulfillment and shipping, discounts, returns and refunds, paid or affiliate acquisition, and other variable operating costs. Keep each component visible in the ledger; if net sales already includes a discount or refund adjustment, do not subtract that same amount twice.
Should I use one price across Amazon, Shopify, and TikTok Shop?
Not by default. A single list price can produce three different contribution results because each channel carries a different fee, fulfillment, promotion, and acquisition stack. Set a channel-specific price or pack-size rule that protects the same margin floor, then make the exception explicit when a promotion is buying a deliberate inventory or acquisition outcome.
How do I find an unprofitable channel and SKU pair?
Review contribution dollars and contribution margin by channel and SKU every week, including returns, discounts, acquisition, and variable operating work. Compare the result with your margin floor and inventory position; GMV, gross margin, and ROAS alone cannot tell you whether the order actually created contribution after the channel-specific costs.
What should I fix first when multichannel margin is shrinking?
Set a channel-SKU margin floor first, then review weekly contribution against it. Next change the channel-specific price, pack size, promotion, or fulfillment rule that is leaking contribution, brake spend when inventory or contribution drifts, and centralize reorder and exception decisions so one channel is not quietly subsidizing another.
See what the contribution loop looks like for your store.
Start with the channel-SKU pairs that are quietly subsidizing the rest of the business, then decide which rule to change first. The goal is a margin floor the operator can see and act on before the next weekly queue.