billId,
poNumber, poId); the optional externalRef on each object is the reverse pointer back to
your own id.
v1.0 ships the two-way match (purchase order ↔ bill): price-vs-PO variance, resolution,
and the approval gate. Receipt-quantity variance (goods received notes) is an additive v1.1
follow-up - no v1.0 route or payload changes when it lands.
All requests below require the
x-dolfin-api-key and x-dolfin-organisation-id headers.
See Authentication.Concepts
| Object | What it is |
|---|---|
| Purchase order | The order you raised. Lines carry an optional sku, a quantityOrdered, and a net subTotal. |
| Match group | The review unit for one bill: its allocations plus derived variances. Status is Open, Variance, or Resolved. |
| Allocation | One row tying a bill line to a PO line, on net. The primitive that absorbs every match edge. |
| Variance | Computed at read time, never stored. v1 surfaces price variance (billed vs ordered unit price). |
Lifecycle
Dolfin matches it to the bill
When a bill for the same supplier is in review, Dolfin lazily creates a match group and
aligns lines: exact
sku matches auto-allocate, close description matches are surfaced as
suggestions to confirm, and anything else is allocated manually. The PO and the bill can
arrive in either order.A variance surfaces
A price variance outside the organisation’s rounding tolerance moves the group to
Variance.A reviewer resolves it
accept_price (or dispute, …) settles the match. A clean or accepted match becomes
Resolved.Create a purchase order
Read a bill’s match group
The derived view carries per-linebilledNet / allocatedNet / priceVarianceTotal /
hasPriceVariance, fuzzy suggestions for unmatched lines, and the group status.
Allocate a bill line (or confirm a suggestion)
Resolve
AcceptPrice, AcceptShort, and AcceptAndUpdateCatalog settle the match; Dispute and
RequestCreditNote keep it blocked. AcceptAndUpdateCatalog only records the intent - it
does not mutate any catalog.
Webhooks
Subscribe to match-group lifecycle changes like any other Dolfin webhook:| Event | When |
|---|---|
match_group.created | a match group is created for a bill |
match_group.variance | a variance needs review |
match_group.resolved | the match settled (clean or resolved) |
matchGroup summary (id, billId, status, resolution); fetch
GET /match-groups/{id} for the full derived view.
Notes
- Allocate on net - tax is computed separately, so per-line tax rounding never shows up as a fake price variance.
- The rounding tolerance (default 1p) is configurable per organisation and feeds both line reconciliation and the clean-match threshold.
- “Synced to accounting” does not exist yet; there is no
match_group.syncedwebhook in v1.