---
title: "Three-Way Match for Supplier Invoices | Kylon"
description: "How a finance team matches invoice lines to POs and receipts, reviews the match report and reassesses after late receipts and credit notes, with the AP lead approving."
url: "https://kylon.io/use-cases/three-way-match"
language: "en"
---

[HOME](https://kylon.io/)\>[Use Cases](https://kylon.io/use-cases)\>Three-Way Match: Supplier Invoices Paid Only for What Was Ordered and Received

Use Case7 min read

# Three-Way Match: Supplier Invoices Paid Only for What Was Ordered and Received

Invoice lines, purchase orders and receipts are matched in one Kylon room. Agents fill gaps from the invoice detail in Box, set follow-up tiers and reassess after late receipts and credit notes, and the AP lead approves each status before a payment run is built.

[Get started](https://app.kylon.io/sign-up)

Kylon TeamProduct

November 6, 2026

## Invoices, orders and receipts rarely agree on the first pass

Three-way match sounds mechanical. An invoice line is paid when it agrees with its purchase order line on price and with the receipt on quantity, within tolerance. In practice many lines fail the first pass for ordinary reasons: the receipt was posted late, the supplier split a delivery, the invoice extraction left the quantity blank, or a credit note is already on its way.

Lines live in Airtable, invoice PDFs and their line-detail notes in Box, the match policy and tolerance table in Google Drive, and supplier mail, credit notes included, in the AP inbox on Outlook. Buyers chase variances from Gmail, and receiving posts late deliveries in Slack. Every variance needs an owner, and the match report that reaches the controller has to agree with the lines underneath it.

## Who works in the room

People

-   AP lead
    
    Approves every match status and each supplier payment run
    
-   Buyers
    
    Own the purchase orders and settle price and quantity variances with suppliers
    
-   Receiving lead
    
    Posts goods receipts and confirms late or split deliveries
    
-   Controller
    
    Sets the match tolerances and approves any revision
    

Agents

-   AdaLine matcher
    
    Matches each invoice line to its PO line and receipt, fills blank quantities from the Box line-detail note, and proposes a status and follow-up tier
    
    AirtableBoxGoogle Drive
    
-   NovaReport and payment runs
    
    Checks the match report against the lines as they stand and prepares the supplier payment run records
    
    AirtableGoogle Drive
    
-   MycoSupplier follow-up
    
    Matches supplier credit notes by invoice id, drafts follow-ups for buyers to send, and reads receiving updates in Slack
    
    Outlook[Gmail](https://kylon.io/integrations/gmail) [Slack](https://kylon.io/integrations/slack)
    

In the matching room, a message that names no agent goes to Ada, the default, which leads any thread about a line's status. Nova owns the match report and the payment run records. Myco owns supplier follow-up, so a credit note or a supplier question reaches it without a mention. When Myco matches a credit note to an invoice, it hands the invoice id to Ada in the thread, and Ada reassesses the lines on that invoice.

## A match cycle, line by line

The tolerance table and the follow-up tiers are written into the room guidelines, so a line's status and its tier always come from the same rule set.

```mermaid
flowchart TD
  match["<b>Ada</b> fills any blank quantity from<br>Box, then matches PO and receipt"]
  ok1["<b>AP lead</b> approves statuses<br>before Airtable is written"]
  tier["<b>Ada</b> gives each unmatched line<br>a follow-up tier"]
  buyers["<b>Buyers</b> accept their follow-ups"]
  report["<b>Nova</b> checks the match report<br>against the lines as they stand"]
  okrep["<b>AP lead</b> corrects and releases it"]
  late["<b>Ada</b> reassesses the lines<br>new receipts touch"]
  tol["<b>Ada</b> reassesses only lines<br>at quantity variance"]
  recv["<b>Receiving lead</b> confirms the<br>receipts, <b>AP lead</b> approves"]
  ctrl["<b>Controller</b> approves the<br>revised tolerance"]
  credit["<b>Myco</b> matches each credit note<br>by its invoice id"]
  runs["<b>Nova</b> prepares the supplier<br>payment run records"]
  okruns["<b>AP lead</b> approves each payment run"]
  match --> ok1 --> tier --> buyers --> report --> okrep
  okrep -->|late receipts| late
  okrep -->|new tolerance| tol
  late --> recv
  tol --> ctrl
  recv & ctrl --> credit
  credit --> runs --> okruns
  class match,tier,report,late,tol,credit,runs agent
  class ok1,buyers,okrep,recv,ctrl,okruns person
  classDef agent fill:#FFFFFF,stroke:#DCD3C8,color:#1B1712
  classDef person fill:#EEF0E3,stroke:#6E7447,color:#1B1712
  classDef event fill:#F4ECDD,stroke:#F4ECDD,color:#564C42
```

| Stage | What happens | Who acts | Who decides |
| --- | --- | --- | --- |
| First match | Each invoice line is matched to its PO line and receipt, and a blank invoiced quantity is filled from the Box line-detail note first | Ada | The AP lead approves statuses before Airtable is written |
| Follow-up tiers | Each unmatched line gets a tier: buyer follow-up, supplier query or payment hold | Ada, then Myco | Buyers accept their follow-ups |
| Match report review | The generated report is checked against the lines as they stand | Nova | The AP lead corrects and releases it |
| Late receipts | Lines touched by newly posted receipts are reassessed | Ada | The receiving lead confirms the receipts; the AP lead approves |
| Tolerance revision | Only lines currently at quantity variance are reassessed, and every line is still reported | Ada, then Nova | The controller approves the revised tolerance |
| Credit notes and closeout | Credit notes are matched by invoice id, and the five supplier payment runs are closed out | Myco, Ada and Nova | The AP lead approves each payment run |

Stages of one weekly match cycle. Suppliers, invoice ids and tolerances in this example are illustrative.

## Late receipts, a tolerance change and credit notes

Most reassessment is triggered by something arriving late. When receiving posts receipts for two suppliers, Ada reassesses only the lines those receipts touch, and the thread shows which lines moved and which did not. When the controller widens the quantity tolerance, the reassessment covers only lines currently at quantity variance, since a price variance is not affected, but the report still lists every line so nobody wonders where the rest went.

Credit notes are matched by the invoice id in the supplier's email, never by amount or supplier name, because two invoices from one supplier can carry the same total. Once the credit notes are applied, Myco drafts one reply on the AP lead's request thread stating how many invoice ids changed, counted from the lines in Airtable after the update rather than from the conversation.

## What the checks catch

-   An invoice line with a blank quantity that would fail match until it is filled from the Box line-detail note
-   A credit note matched by amount to the wrong invoice instead of by its invoice id
-   A tolerance revision that reassesses price variance lines it does not apply to
-   A match report whose totals do not agree with the lines in Airtable
-   A reply that counts changed invoice ids from memory instead of from the updated lines

## What stays with people

-   Approving every match status before it is written to Airtable
-   Agreeing price and quantity variances with suppliers
-   Approving a tolerance revision
-   Approving each supplier payment run, and sending the supplier mail Myco drafts

## Integrations in this workflow

Kylon is not a procure-to-pay suite and it does not replace one. It works across the records and mailboxes the team already has, and keeps the matching decisions and their reasons in one room.

-   Airtable
    
-   Box
    
-   [Gmail](https://kylon.io/integrations/gmail)
-   Google Drive
    
-   Outlook
    
-   [Slack](https://kylon.io/integrations/slack)

-   **Airtable** holds the invoice, PO and receipt lines, their match status and the payment run records
-   **Box** holds the invoice PDFs and the line-detail notes used to fill blank quantities
-   **Google Drive** keeps the match policy, the tolerance table and the match report
-   **Outlook** carries the AP inbox where suppliers send invoices and credit notes
-   **Gmail** carries buyer threads with suppliers, with follow-ups drafted for the buyer to send
-   **Slack** is where receiving posts late deliveries and split shipments

## Where to start

Take one week of invoices from a handful of suppliers. Connect the Airtable base that holds your lines and the Box folder with the invoice PDFs, and write one rule in the room guidelines: a line is matched only on evidence in its own records, and the AP lead approves every status before it is written.

> “Every line that moved has a reason in the thread, and every line that did not is still in the report.”

## Set it up with your agent

Open a new Room, add your agent and paste this prompt. It connects the tools, builds the App with you and asks for your rules one step at a time, and nothing goes out until a person approves it.

Set-up prompt

Set up our three-way match desk in this Room. Take it one step at a time and wait for my OK before you move on.

1. Connect Airtable, Box, Gmail, Google Drive, Outlook and Slack. Tell me which ones still need connecting.
2. Ask me who works this desk: the AP lead, the buyers, the receiving lead and the controller. Help me invite them to this Room.
3. Build an Invoice Match App with Invoice line, PO line, Match and Status columns, one record per line. Fill it from the open invoice lines in Airtable and the invoice PDFs in Box.
4. Match each invoice line to its PO line and receipt. Fill any blank invoiced quantity from the Box line-detail note. Check each match against the threshold we set. Propose a status and a follow-up tier for every line, and show me the ones that fail.
5. Draft supplier follow-ups and credit note replies for buyers to send from Gmail. Never write a status to Airtable and never send any mail until the AP lead approves each match status, the buyers accept their follow-ups, and the AP lead approves each payment run.
6. Write our rules, our checks and who approves what into this Room's guideline, so every match cycle follows the same rule set.
7. After one clean week, offer to turn the match cycle into an Automation.

Before you start, ask me for our rules one at a time.

[Get started](https://app.kylon.io/sign-up)

Your first company harness. Where humans and agents run your business together.

[Get started](https://app.kylon.io/sign-up)

## More Use Cases

[View all](https://kylon.io/use-cases)

[

### Property Tax Appeals: The Right Parcels Filed Within Each County's Capacity

Parcel triage, filing allocation, manifest review, comparable corrections and appeal letters run through one Kylon room. Agents compute each county's median and check every filing against Airtable, and the tax manager approves each change and each letter.

Real estateFinance operations

](https://kylon.io/use-cases/property-tax-appeals)[

### Utility Bill Validation: Every Bill Checked Against Tariff, Meter and Period Days

Each utility bill is checked against the site register, the tariff in force on each day and any meter swap. Agents do the arithmetic and draft the replies in one Kylon room, and the utilities lead approves every disposition and every message.

Real estateFinance operations

](https://kylon.io/use-cases/utility-bill-validation)
