Skip to content
Vibedata

Build something that is not there yet

Detect duplicate invoice candidates from explicit matching rules before payment

  • When AP paid a duplicate invoice and only found out after the payment run cleared.
  • When the same vendor invoice shows up under two slightly different invoice numbers and nobody catches it before payment.

Build a duplicate-invoice-candidate model that matches on vendor, amount tolerance, normalized invoice number, and a date window, with a test that fails when a new candidate appears ahead of a payment run. Covers surfacing candidates, not merging or auto-rejecting invoices.

Area
Data quality
Runs on
  • Microsoft Fabric Lakehouse
  • Microsoft Fabric Warehouse
  • MotherDuck
  • DuckDB
Built with
  • dbt
  • pytest
Domain
Finance
Industry
Manufacturing, Retail, Public sector
Readiness
SupportedEverything this Recipe composes runs today, without a case that proves this exact shape.
Before you start
needs the normalization and re-issue rules for invoice numbers

Sample This Recipe has not been materialized in the Cookbook repository yet. Its trigger, description, prompt, agent guidance and acceptance conditions, and the explanation below, are prototype drafts. Its name, job, area and readiness come from the reconciled Cookbook seed snapshot. Readiness is a separate question from this one: it says whether the capability exists, not whether the writing has been reviewed.

Use this Recipe

Use the VibeData Recipe `finance-duplicate-invoice-detection` at https://getvibedata.ai/cookbook/finance-duplicate-invoice-detection Read the Recipe and execute it in the context of the current Intent.

Recipe id finance-duplicate-invoice-detection · Not yet materialized in the Cookbook repository, so the pointer addresses this page.

Verified by

What has to be observably true before this Recipe is finished.

  • a seeded duplicate pair is caught by the test before the payment run it targets
  • a legitimate re-issued invoice is not flagged once the agreed re-issue rule is applied
  • every candidate reports the matching rule that fired, not just a flag
  • no invoice is ever deleted, merged, or altered by the detection logic
Recipe promptThe task specification the agent reads. Reference only — it is not what you copy.
Deliver: Detect duplicate invoice candidates from explicit matching rules before payment.

Build a duplicate-invoice-candidate model that matches on vendor, amount tolerance, normalized invoice number, and a date window, with a test that fails when a new candidate appears ahead of a payment run. Covers surfacing candidates, not merging or auto-rejecting invoices.

Execute inside the current Intent. Its Domain, repository, platform, environment and attached sources are the context for this work — read them rather than asking for them.

The work is done when:
- a seeded duplicate pair is caught by the test before the payment run it targets
- a legitimate re-issued invoice is not flagged once the agreed re-issue rule is applied
- every candidate reports the matching rule that fired, not just a flag
- no invoice is ever deleted, merged, or altered by the detection logic

Report the evidence for each condition above with the result. A condition you cannot meet is something to say, not something to work around.
Agent guidanceHow the agent approaches the work, and what it will not do.

Profile the inputs the grain, joins and measures actually depend on before proposing a model. Put the design up for review — grain first — then build in an isolated copy with tests and documentation landing beside the model rather than after it.

Composes

  • test authoring and baseline comparison
  • dbt in the project
  • pytest in the project
  • isolated-copy execution and gate verification

Asks first

Semantic decisions the Intent cannot supply. Never context Studio already holds.

  • which Fabric target this work lands on, when the Domain carries both a Lakehouse and a Warehouse
  • the grain the requester expects, where the request leaves it open to more than one reading

Guardrails

  • Build in an isolated copy. Production is read, never written.

What you need

  • Microsoft Fabric Lakehouse, Microsoft Fabric Warehouse, MotherDuck, or DuckDB.
  • The objects under test, and a baseline you agree is correct.
  • dbt and pytest in the project, or the intent to add it.
  • Needs the normalization and re-issue rules for invoice numbers.

How it goes

  1. State the outcome in one sentence, in the language the request arrived in.
  2. Let it profile the inputs the grain, the joins and the measures actually depend on.
  3. Review the design. Disagreeing about grain here costs a sentence; after the model exists it costs a rewrite.
  4. Let it build in an isolated copy, with the tests and the documentation landing beside the model rather than after it.
  5. Read the acceptance conditions against the run.

What you end up with

The deliverable, in your own repository, as data quality work a reviewer who knows the project reads as native to it. Alongside it, the evidence for every one of the acceptance conditions above — which is the part that is still there in three weeks when somebody asks.