Payvol Reconcile
Money met an invoice. Say precisely how well.
Reconcile weighs what arrived against what was asked and answers on five independent axes. It never collapses them into one word, and it never closes anything.
Read the rules See all modules
@payvol/core5 axes17 fixture scenarios In development
The code exists and runs in this repository. It is not published yet, so there is nothing to install.
Five axes, not one label
Most reconciliation software answers a question nobody asked.
It reports matched or unmatched, and then a person opens the record anyway, because what they needed to know was whether the amount was right, whether it came late, whether it came in the asset they expected, and whether accepting it breaks a policy. Those are four different questions with four different answers.
A payment can be several things at once
Why one field fails
Exact and late. Complete but into the wrong account. Correct in every way except the policy that forbids partials. One status field has to pick a winner, and the four answers it drops are the ones an operator wanted.
Late means late on the ledger
One timestamp decides
The only timestamp that decides lateness is the one the settlement carries. When an adapter restarts, or a backlog clears at midnight, nothing becomes overdue that was not already overdue.
Two stablecoins are not one currency
No assumed rate
Payments in the same asset aggregate. Payments in different assets do not, because adding them would mean assuming a rate, and an issuer risk, and a redemption right. Cross-asset totals need an accepted conversion result or they do not happen.
A record is added, never edited
Append only
When a second payment arrives and the picture changes, a new record supersedes the old one and the old one stays. Six months later an auditor can see not just the conclusion but the order in which it was reached.
How it works
Gather, weigh, hand over.
01
Gather
- Take sightings from your own participant
- Find the requests they could belong to
- Aggregate same-asset payments against one request
- Keep candidates that could belong to more than one
02
Weigh
- Amount, against what the request asked for
- Timing, from the settlement's own effective time
- Instrument and receiver, against what was declared
- Policy, against the rules the request carried
- Flags for duplicates, malformed metadata, missing evidence
03
Hand over
- Produce a readiness state, not a decision
- Append the record, superseding rather than editing
- Emit it locally for the ERP or the operator
- Export a statement when the period closes
Three ways to close a payment
The difference shows up on the exceptions.
01
By hand
a statement and a spreadsheet
Someone reads the amounts, guesses the invoice, and marks it closed. It works until the day two payments arrive for one invoice, or one payment covers two.
Every exception costs a phone call
02
One status field
automated, and still opaque
Software decides matched or unmatched and writes it down. The exceptions still land on a person, now with less context than the spreadsheet had.
Automation that hides its reasoning
03
Five verdicts and a readiness
Payvol Reconcile
Each axis is answered separately, the flags say what was strange, and the readiness state says whether a human needs to look. The clean ones stop being work.
Exceptions arrive already explained
Boundaries
What Reconcile deliberately does not do.
The line sits exactly where somebody else judgement begins, and it does not move because a feature request asks nicely.
Payvol classifies and hands over. The ERP closes.
For finance teams
The same input always produces the same record.
Every rule is covered by a fixture you can read, and the rule set is versioned inside the record, so a conclusion from March can still be explained in November.
import { reconcile } from '@payvol/core/draft02'
// weigh what arrived against what was asked
const record = reconcile(payload, digest, observations, policy)
// 5 answers and a readiness, never one word
record.amount // 'short'
record.timing // 'late'
record.closureReadiness // 'requiresReview'
// a later payment supersedes rather than edits
reconcile(payload, digest, more, policy, record) Where it is used
4 of the six situations reach Reconcile.
Run it over the exceptions you already have.
17 scenarios ship as fixtures, including the ones that are supposed to be uncomfortable.