+1 (726) 224-7339

Building a Tariff and Landed Cost Scenario Model in Anaplan: Duty Stacking, Sourcing Shifts, and Margin Recovery

Tariffs used to be a line item that procurement owned and finance annotated. Since 2025 they are a planning variable: rates move mid-quarter, country-of-origin rules get reinterpreted, exemptions expire, and a product that was profitable in March is underwater in May. Most companies responded with a spreadsheet — a landed-cost workbook owned by one analyst, refreshed by hand, and quietly inconsistent with the numbers in the operating plan.

That is exactly the wrong shape for the problem. Tariff exposure cuts across sourcing, inventory, pricing, and the P&L, so it belongs where those things already meet. This tutorial builds a tariff and landed-cost scenario engine in Anaplan: a duty calculation layer that sits between your item master and your cost of goods, a sourcing-shift scenario mechanic, a margin-recovery pricing bridge, and reporting that tells the CFO what the exposure is and who can act on it.

It assumes working knowledge of lists, subsidiary views, SUM/LOOKUP, and versions. If you have already built the supply planning or opex models described elsewhere in these tutorials, this one plugs into both.

What the model has to answer

Write the questions down before touching a dimension. Four of them justify the whole build:

  1. What is our exposure? Annualised duty cost by product, supplier, origin country, and legal entity, at current announced rates.
  2. What happens if rates change? A rate scenario applied without rebuilding anything or cloning the model.
  3. What can we do about it? Sourcing shifts, origin re-qualification, bonded/deferral timing, and price actions, each with a quantified P&L effect.
  4. What did we actually pay? Accrued versus actual duty, reconciled to broker invoices, so the forecast learns.

Models that only answer (1) become dashboards nobody revisits. The value is in (3).

Step 1: Dimensional skeleton

Keep the tariff engine in its own spoke model. Duty math is transactional-adjacent and grows with SKU × origin × period; you do not want it competing for workspace with the corporate plan.

ListTypeNotes
ProductsProduction listSKU or planning item, whichever your COGS is planned at
SuppliersProduction listProperties: Origin Country, Incoterm, Preferred Flag
CountriesProduction listOrigin and destination both reference this
HTS CodesProduction listClassification, not product — many SKUs share one code
Trade LanesNumbered listComposite of origin → destination, created once via action
Legal EntitiesProduction listDuty is paid by the importer of record, not the brand
Duty ProgramsFlat listMFN, Section 301, reciprocal/IEEPA, antidumping, FTA-preferential, de minimis
ScenariosFlat listBase, Announced, Escalation, De-escalation, Mitigated

Two modelling decisions matter more than the rest.

Classify at HTS, not at SKU. Rates attach to codes. Put the rate on HTS Code × Trade Lane × Duty Program × Time and let products inherit through a mapping. When a rate changes you edit one cell, not four thousand.

Make Trade Lanes a numbered list, not a two-dimensional module. Real supply chains use a few hundred live lanes out of tens of thousands of country pairs. A dense Countries × Countries module is almost entirely zeros and will dominate your model size for no benefit. Build the lane list from actual purchase history with an import action, and use Trade Lane as a single dimension downstream. This is the same sparsity argument the DISCO blueprint makes, applied to trade.

Step 2: The rate library

One module, SYS Duty Rates, dimensioned HTS Codes × Trade Lanes × Duty Programs × Time (Month) × Scenarios.

Line items:

  • Ad Valorem Rate % — percentage of customs value
  • Specific Duty per UOM — for the codes that charge per kilo or per unit
  • Effective From / Effective To — dates, so mid-month changes are representable
  • Rate Active? — boolean: Rate Active? = Effective From <= END() AND (ISBLANK(Effective To) OR Effective To >= START())
  • Source Note — text, the Federal Register or gazette citation

Two disciplines make this module survivable. First, rates are data, not formulas — they arrive by import from a trade-content feed or a maintained sheet, never hardcoded in a calculation. Second, keep the citation. When the CFO asks why the forecast moved 40 basis points, the answer needs to be a document reference, not "trade ops updated it".

For scenarios, avoid duplicating the whole rate library per scenario. Hold Base rates once and store scenario deltas:

Effective Rate % = SYS Duty Rates.Ad Valorem Rate %[SELECT: Scenarios.Base] + Scenario Delta %

Escalation and de-escalation scenarios then become a handful of numbers a trade analyst can maintain in an hour, and a new scenario costs one list member.

Step 3: Landed cost build-up

CALC Landed Cost, dimensioned Products × Suppliers × Time × Scenarios. This is the module that will be read by pricing, by procurement, and by FP&A, so name the line items the way a non-modeller would.

FOB Unit Cost                = from sourcing plan / supplier price list
Freight per Unit             = from logistics rate card ÷ units per container
Insurance per Unit           = Freight per Unit * Insurance %
Customs Value per Unit       = FOB Unit Cost + IF Incoterm Includes Freight THEN Freight per Unit ELSE 0
Ad Valorem Duty per Unit     = Customs Value per Unit * Total Effective Rate %
Specific Duty per Unit       = Total Specific Duty per UOM * UOM per Unit
Duty per Unit                = Ad Valorem Duty per Unit + Specific Duty per Unit
Fees per Unit                = Customs Value per Unit * (MPF % + HMF %)
Brokerage per Unit           = Brokerage per Shipment ÷ Units per Shipment
Landed Unit Cost             = FOB + Freight + Insurance + Duty + Fees + Brokerage

Three traps show up here every time.

Customs value is not purchase price. Depending on Incoterm and jurisdiction, assists, royalties, and inbound freight may or may not be dutiable. Model Customs Value per Unit explicitly with an Incoterm-driven switch rather than reusing FOB cost. Getting this wrong misstates duty by the freight percentage of cost, which on low-value/high-bulk goods is material.

Stacking is additive, not multiplicative — but not universally. Where a Section 301 or reciprocal duty applies on top of MFN, sum the rates against the same customs value; do not compound. Where a program is exclusive of another, you need a precedence rule. Build a SYS Program Stacking module with Stacks With Base? and Precedence Rank booleans per program, and compute:

Total Effective Rate % = SUM over programs of (Effective Rate % * Program Applies?)

where Program Applies? is resolved by rank so that an exclusive program suppresses lower-ranked ones. Hardcoding the arithmetic for today's program mix guarantees a rebuild the next time a new program is announced.

Use the sparsity switch. Products × Suppliers is mostly empty — each product has one to three real sources. Create a SYS Product Supplier Valid boolean module and apply it as the applies-to filter on the heavy calculations, or restructure onto a numbered Product Source combination list. On a 20,000-SKU estate this is the difference between a model that recalculates in seconds and one that does not open.

Step 4: Exposure roll-up

REP Duty Exposure, dimensioned Products × Legal Entities × Time × Scenarios, fed by volume:

Import Units            = from supply plan receipts, not sales units
Duty Cost               = Import Units * Duty per Unit
Fees Cost               = Import Units * Fees per Unit
Total Trade Cost        = Duty Cost + Fees Cost
Trade Cost % of COGS    = Total Trade Cost ÷ COGS
Exposure vs Base        = Total Trade Cost - Total Trade Cost[SELECT: Scenarios.Base]

The subtlety worth spelling out to stakeholders: duty is incurred on import receipts, then flows into the P&L through inventory. A rate that rises in January hits gross margin when the affected units sell, which on a 90-day inventory turn is the second quarter. Model both:

  • Duty Cash Out — timed to receipt, this is what treasury needs
  • Duty in COGS — timed to sell-through via your inventory absorption logic, this is what the P&L forecast needs

Presenting one number and letting the audience assume it is the other is the most common way these models lose credibility in their first review cycle.

Step 5: Mitigation scenarios

This is the part clients actually pay for. Four levers, each a small module that overrides an input rather than a new copy of the model.

Sourcing shift. INP Sourcing Mix holds Allocation % by Products × Suppliers × Time × Scenarios, validated to sum to 100%. Landed cost blends across suppliers:

Blended Landed Cost = SUM(Landed Unit Cost * Allocation %)

Add Qualification Lead Time (Months) and Capacity Ceiling Units per supplier so the scenario cannot instantly move 60% of volume to a supplier who needs nine months of qualification and can only build half the volume. A mitigation plan that ignores qualification time is a fantasy, and procurement will say so in the meeting.

Origin re-qualification. Substantial transformation or FTA preference can change the applicable lane. Model this as a scenario-scoped override of Supplier Origin Country plus a Compliance Confidence % haircut, so the benefit is risk-weighted rather than booked at full value.

Duty deferral and drawback. Foreign trade zones, bonded warehouses, and drawback on re-exports change timing and sometimes amount. Model Deferral Months (shifts Duty Cash Out only) separately from Drawback Recovery % (reduces net duty). These are different economics and conflating them overstates the benefit.

Price recovery. CALC Margin Recovery:

Cost Increase per Unit     = Landed Unit Cost - Landed Unit Cost[SELECT: Scenarios.Base]
Price to Hold Margin %     = Base Price * (1 + Cost Increase / (Base Price * Base Margin %))
Price to Hold Margin $     = Base Price + Cost Increase per Unit
Elasticity Volume Impact   = Price Change % * Elasticity Coefficient
Net Margin After Recovery  = (Price - Landed Unit Cost) * Volume * (1 + Elasticity Volume Impact)

Holding percentage margin and holding absolute margin are different price points, and they diverge fast at high cost increases. Show both. Let the commercial team pick, and let the elasticity assumption be visible and editable rather than buried.

Step 6: Accrual and reconciliation

Forecasts that never meet actuals drift. Build REC Duty Accrual with Accrued Duty (from the model), Actual Duty Paid (imported from broker invoices or the customs entry summary feed), Variance, and Variance % by entity and month.

Two uses. Operationally, variance above a threshold usually means a classification error — a SKU on the wrong HTS code, sometimes for years, which is a refund opportunity or a disclosure obligation depending on direction. Analytically, persistent one-sided variance tells you your Customs Value logic is wrong, and that is worth fixing before it shows up in an audit.

Step 7: Delivering it in the UX

Build three pages, for three audiences.

  • Exposure board (CFO): total trade cost by scenario, waterfall from base to current, exposure by entity, cash-versus-COGS timing chart.
  • Mitigation workbench (procurement and trade): sourcing mix grid with capacity and qualification warnings, duty-per-unit by supplier, saving versus base with a risk-weighted column.
  • Pricing view (commercial): affected SKUs ranked by margin erosion, both recovery prices, elasticity toggle, and a flag for contract-locked customers who cannot be repriced this year.

Put the rate library behind a Trade Ops role with Dynamic Cell Access. Rate changes are an assertion about law, and unrestricted editing of them invites arguments that the model cannot settle.

Step 8: Governance

A tariff model is only useful if it is current, which means it needs an operating rhythm, not just a build:

  • Weekly rate review during volatile periods; a named owner, a documented source, and a change log. Ship the change log as a module, not a wiki page.
  • Scenario hygiene — keep five named scenarios, retire stale ones. Scenario proliferation is how these models become unreadable.
  • ALM discipline: rate data flows through import, structural change flows through revision tags from dev to production. Never fix a rate directly in production and never carry a structural hotfix as an undocumented change.
  • Quarterly reconciliation review with trade compliance, because classification is their control, not yours.

Where the value lands

Two weeks of build gets you a defensible exposure number. The compounding value comes later: when a rate announcement drops on a Friday, the answer to "what does this cost us and what do we do" is a scenario refresh on Monday morning instead of three weeks of workbook archaeology. That is the difference between a finance team that reacts to trade policy and one that plans around it.

If you are standing this up — or retrofitting duty logic into an existing supply chain or COGS model without destabilising it — talk to our Anaplan consultants. We build these as scenario engines that survive the next policy change, not as one-off analyses.