A dealer prices with a markup on purchase cost and finds at year end that one product group earned nothing. The reason lies in the channel fees nobody ever recomputed. The markup was right — it was simply calculated on the wrong basis.
The five branches answer four different questions about the same selling account. They do not depend on each other, and you do not need all of them — but setting prices without recomputing fees means calculating on a basis you do not know.
| Surface | Roles |
|---|---|
| Commerce | Parts trading, Software vendor, Platform and marketplace |
What this case requires
- A net target you want to reach. With
targetNetthe pricing policy works backwards; according to the contract a fixed markup guarantees no target amount. - Willingness to read fee lines. A statement nobody checks is an invoice you simply pay.
- Two checkpoints for the reconciliation. Source and target each need a state;
sourceCheckpointandtargetCheckpointare required fields of the reconciliation. - A recipient for events if you do not want to poll. A subscription without a reachable recipient delivers nothing.
The sequence
The table names the responsible call per stage and what exists afterwards. The reasoning for why a stage cannot be skipped follows below it.
| Stage | Call | What exists afterwards |
|---|---|---|
| Create a pricing policy | POST /commerce/v1/pricing-policies | targetNet works back from the target; includeChannelFees and includeServiceFees control the fees |
| Check the fee statement | GET /commerce/v1/fee-statements | Per line basis, feeBasisPoints and feeAmount — recomputable, not taken on faith |
| Run a reconciliation | POST /commerce/v1/reconciliations | sourceCheckpoint against targetCheckpoint, plus discrepancies with severity |
| Subscribe to events | POST /commerce/v1/webhook-subscriptions | Signed delivery, so there is no need to poll on a timer |
| Re-read the stream | GET /commerce/v1/events | Events with streamId and sequence, retrieved with stable cursor pagination |
Why each stage is needed
- Create the pricing policy.
POST /commerce/v1/pricing-policiesknows, besides a fixed markup, alsotargetNet: you name the net that should remain and the policy works backwards — with channel fees, service fees and discounts, depending on what you include. That is the difference between revenue and earnings. - Check the fee statement.
GET /commerce/v1/fee-statementsreturnsbasis,feeBasisPointsandfeeAmountper line, plus for corrections the reference to the adjusted line. A fee can thus be recomputed instead of believed. - Run the reconciliation.
POST /commerce/v1/reconciliationscomparessourceCheckpointwithtargetCheckpointand returnscounts,integritywith checksums for source and target, anddiscrepancieswithseverity. The decisive figure iscriticalRemaining, the number of critical discrepancies remaining; the reconciliation is not yet activated in the contract. - Subscribe to events.
POST /commerce/v1/webhook-subscriptionssets up a signed delivery. Polling on a timer instead creates load and still notices a gap only late. - Re-read the stream.
GET /commerce/v1/eventsreturns events withstreamIdandsequence. Retrieval uses stable cursor pagination (cursor,limit).
curl -X POST \
-H 'X-Api-Key: <API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: preisregel-netto-2026-09' \
-d '{"strategy":"target_net","scope":{"catalogItemIds":["<catalogItemId>"]},"targetNet":{"target":{"amountMinor":4500,"currency":"EUR"},"calculationBasis":"item_price","includeChannelFees":true,"includeServiceFees":true,"includeDiscounts":false},"revision":"<revision>"}' \
'https://commerce-preview.invalid/commerce/v1/pricing-policies'What you end up with
In the end you can recompute every fee line, have offer prices derived with targetNet from a target amount and the fees included, and read from criticalRemaining after a reconciliation how many critical discrepancies between source and target remain. The contract contains no purchase costs; you determine your margin with your own figures.
Where to find this in the documentation
The binding field lists, error codes and sample responses live in this surface’s OpenAPI contract at docs.tapinomahub.com (tapinoma-commerce). All use cases arranged by surface and role: overview of the use cases.
Sources and legal references
Frequently asked
What is the difference between markup and net target?
The fixed markup applies only the rate from fixedMarkupBasisPoints and guarantees no target amount; the contract does not specify the basis it applies to. The net target works backward from what should remain and includes the fees you choose to include.
Why do I need a reconciliation if I subscribe to events?
Because a delivery can fail. The subscription keeps you current, the reconciliation establishes discrepancies between source and target — those are two different tasks.
Do I have to use all five branches?
No. They are independent. If you want to establish discrepancies between source and target you need the reconciliation; if you want prices set automatically you need the policy.
