Duplicate Payment Auditor
Finds the payments your exact-match control was never going to catch
- 8hard rules
- Things it must never do, enforced in every run
- 5handover rules
- Conditions where it stops and gives the work to a person
- 8output fields
- A structured result, not a paragraph you have to re-read
- ≤7steps per run
- Bounded work: at most 5 tool calls, enforced by the runtime
Read-only by design. This agent has no path to sending, spending, publishing or committing anything. Where that limit is the product, removing it would remove the reason to trust the output.
Overview
Duplicate payments are the most reliably recoverable money in any finance function, and almost every organisation has them. Not through carelessness — the controls that exist only catch the easy case.
An accounts payable system blocks the same invoice number from the same supplier twice. That check is exact, and duplicates almost never are. The invoice arrives by email and again by post, keyed once as "INV-4471" and once as "4471". The supplier is set up twice under slightly different names, so the system sees two suppliers. A credit note is applied against the wrong invoice, leaving the right one open to be paid again. An invoice is paid on account and again against a purchase order. A payment run is rerun after a bank rejection and the successful half goes out twice.
Every one of those passes an exact-match control, and every one is visible to a check that compares amount, date proximity and supplier identity rather than reference strings.
The other half of the value is the window. Suppliers do not report being overpaid — the credit sits on their ledger, and if the relationship ends before it is used, the money is gone.
This agent finds them and gives you the evidence. It recovers nothing itself and contacts no supplier: a recovery request is a conversation with someone you depend on.
Benefits
Money back with no negotiation
It was already yours, and the evidence is unarguable.
The control gap named
So the next one is prevented rather than found later.
Recovered while it still can be
A credit on a dormant supplier's ledger is usually lost.
What it does
Matches on substance, not on reference strings
"INV-4471" and "4471" are the same invoice. Every exact-match control in every AP system sees two.
Finds duplicated supplier records
One supplier set up twice under slightly different names. The system sees two, and blocks nothing.
Catches misapplied credit notes
A credit posted against the wrong invoice leaves the right one open, and it gets paid again.
Detects rerun payment batches
A run repeated after a bank rejection, where the half that succeeded goes out twice.
Ranks by what is still recoverable
A live supplier with ongoing volume is recoverable. A dormant one is a much harder conversation.
Recovers nothing itself
It contacts no supplier and raises no claim. A recovery request is a conversation, not a transaction.
What this changes
What this changes about your week
- It takes over
- Finding invoices that were paid more than once.
- Done today by
- The AP system's duplicate check, which only catches exact matches.
- How often
- Never, beyond the automated block.
- Typical manual effort
- References, supplier records and credit notes all have to be normalised before anything compares.
Why Finance & Accounting in particular. Real duplicates are never exact — that is why they got through. 'INV-4471' and '4471', one supplier set up twice, a rerun payment batch. And suppliers never report being overpaid.
Runs unattended
Started by you or by an event, and it finishes on its own. Nothing waits for someone to be at a desk.
The same standard every time
The two-hundredth item is held to the bar the first one was. Consistency is the part people cannot sustain.
It cannot act on its own
Duplicate Payment Auditor has no path to sending, spending or committing. That limit is why its output is safe to act on.
How it runs
This agent runs server-side through the PROMIVO runtime. Each run is logged step by step and every tool call is permission-checked before it executes.
- 1InputValidated against the agent input schema
- 2Modelclaude-opus-5 with automatic fallback
- 3Toolsextract_structured_data
- 4PermissionsRuns READ actions automatically; anything higher waits for approval
- 5OutputStructured result matching the output schema
- 6LoggingTokens, duration and every step recorded
Demo
Demo dataIllustrative sample output, abridged.
Input
{
"period": "24 months to Aug 2026",
"currency": "USD",
"payments": [],
"dateProximityDays": 90
}Output
{
"escalate": true,
"disclaimer": "An analysis of your own payment records. No supplier has been contacted, no claim raised, nothing offset or reversed, no supplier records merged, and candidates marked needs-checking are reported with the reason they may be legitimate rather than presented as findings.",
"duplicates": [
{
"amount": 18400,
"payments": [
"PAY-40218",
"PAY-41776"
],
"supplier": "Nordvale Supplies",
"daysApart": 47,
"mechanism": "duplicate-supplier-record",
"confidence": "high",
"controlGap": "The supplier master allows a second record with the same bank details and tax identifier.",
"recoverability": "live-supplier",
"whyItMightNotBe": "Nothing. Same amount, same invoice date, same net reference once formatting is stripped."
},
{
"amount": 2260,
"payments": [
"PAY-38112",
"PAY-38119"
],
"supplier": "Harbour Freight",
"daysApart": 0,
"mechanism": "rerun-batch",
"confidence": "high",
"controlGap": "A batch was rerun after a partial bank rejection. Nothing excluded the payments that had already succeeded.",
"recoverability": "live-supplier",
"whyItMightNotBe": ""
},
{
"amount": 1450,
"payments": [
"PAY-29940",
"PAY-31002"
],
"supplier": "Meridian Print",
"daysApart": 31,
"mechanism": "exact-repeat",
"confidence": "needs-checking",
"controlGap": "",
"recoverability": "live-supplier",
"whyItMightNotBe": "Meridian bills a fixed monthly retainer at exactly this amount. This may be two legitimate months rather than a duplicate. Reported rather than filtered out, because a missed duplicate costs more than a check."
}
],
"supplierGroups": [
"NORDVALE SUPPLIES LTD and Nordvale Supplies Limited share a tax identifier and bank account. Two records, one supplier — and every duplicate check ran within each record separately."
],
"totalIdentified": 84200,
"escalationReason": "One duplicate is 18,400, above threshold, and two supplier records share bank details without sharing a name.",
"controlGapsSummary": [
"Reference formatting is not normalised before the duplicate check, so 6 of 11 findings were invisible to it.",
"The supplier master permits duplicate bank details.",
"Payment batches can be rerun without excluding successful lines."
],
"recoverableFromLiveSuppliers": 71400
}Requirements
Integrations
No integrations required.
Before you start
- Payment and invoice history: supplier, reference, amount, date, purchase order
- The supplier master file
- Credit notes and how they were applied
- Requires the All-Access plan or higher
Use cases
Periodic AP review
Run over the last two years, then monthly.
After a system migration
Where duplicate supplier records are created wholesale.
Before an audit
The finding an auditor samples for, found first.
After a payment run failure
Whether the rerun duplicated the successful half.
Pricing
All-Access
Billed monthly through your PROMIVO subscription. Cancel at any time.
Runs consume your plan allowance for agent executions and tokens. See plan limits
FAQ
Will it claim the money back?
No. It never contacts a supplier or raises a claim. Asking for money back is a conversation with someone you depend on, and the tone belongs to a person.
How is this different from our AP system's duplicate check?
Those match exactly on invoice number and supplier. Real duplicates almost never match exactly — that is the entire reason they got through.
Will it produce false positives?
Some, deliberately. A legitimate recurring charge of the same amount to the same supplier looks like a duplicate, so it reports confidence and the reason rather than filtering them out silently. A missed duplicate costs more than one to check.
Reviews
Reviews open once customers have run this agent.
Need this agent to work differently?
Tell us what to change and our team will scope a customised version for your business.
Customize this agent