● AI Automation  ·  Accounts Payable

AP 3-Way Match AI Agent — Auto-Matches Every PO, Receipt & Invoice Before a Dollar Goes Out

Your AP team is manually matching purchase orders to goods receipts to vendor invoices — one by one, in SAP or NetSuite. It’s 40% of their day and the easiest thing AI can take over.

👈  Live demo below. Watch the AI match a full AP queue — auto-approving clean invoices, flagging discrepancies, and routing exceptions to the right approver. Hit Run Demo to auto-play.
40%
of AP team time on matching
5–10%
of invoices have errors
$0
overpayments missed
AP 3-WAY MATCH — ACME CORP — WEEKLY BATCH PURCHASE ORDERS PO-2024-0841 $12,400 PO-2024-0842 $8,750 PO-2024-0843 $31,200 PO-2024-0844 $5,600 PO-2024-0845 $18,900 + 7 more... 12 POs GOODS RECEIPTS GR-2024-1201 ✓ recv GR-2024-1202 ✓ recv GR-2024-1203 partial GR-2024-1204 ✓ recv GR-2024-1205 ✓ recv 12 receipts VENDOR INVOICES INV-4471 $12,400 INV-4472 $8,750 INV-4473 $33,600 INV-4474 $5,600 INV-4475 $18,900 12 invoices 🤖 AI 3-WAY MATCH ENGINE (Claude AI + n8n) Comparing PO qty/price → GR received qty → Invoice amount → flagging variances ✓ AUTO-APPROVED: 10 invoices  — $71,150 ⚠ FLAGGED: 2 invoices  — $41,900 EXCEPTION 1: INV-4473 — Acme Supplies PO amount: $31,200  |  GR received: partial (80%)  |  Invoice: $33,600 ⚠ Invoice exceeds PO by $2,400  +  partial receipt — routed to CFO approval AI automation replaced 4 hours of manual AP matching. Every discrepancy caught. Every clean invoice auto-approved. Zero overpayments. Integrated with: SAP  |  NetSuite  |  QuickBooks  |  Bill.com  |  Tipalti
The Problem

Every invoice needs a PO and a goods receipt
before it gets paid. Someone has to check all three.

For a mid-size company processing 200 invoices a week, that’s someone’s entire job. And when the amounts don’t match — wrong quantity shipped, duplicate invoice, price that changed since the PO — those exceptions get lost in email threads.

📄
Purchase Order
What you agreed to pay
+
📦
Goods Receipt
What you actually received
+
🧾
Vendor Invoice
What they’re charging you
=
Pay or Flag
All three must agree
⚠  What lands in AP’s inbox
🧾  INV-4473 — Acme Supplies LLCINVOICE
⚠ Invoice is $33,600. PO was $31,200. Where’s the $2,400 from?
📄  PO-2024-0843 — approvedPO
⚠ Partial receipt on file — only 80% of goods received.
📦  INV-4476 — possible duplicateDUPLICATE?
⚠ Same vendor, same amount as INV-4461 paid 3 weeks ago.
✓  What the AI agent does
3-Way Match Result — INV-4473 (Acme Supplies)
PO-2024-0843 amount$31,200Found
Goods receipt statusPartial — 80%Flag ⚠
Invoice amount$33,600Over PO
Variance+$2,400 (7.7%)Discrepancy
Duplicate checkNo match foundClear
HOLD — Do not pay.Routed to CFO for approval with variance detail.
▪  Clean invoices are auto-approved and pushed to payment. Only exceptions reach a human — with full context already attached.
●  Interactive Demo — AP Batch Processing

Watch the AI work through a real AP queue — 6 invoices across 3 vendors. Click any invoice to see the match detail, or hit Run Demo to process all six.

AP Automation  ·  Weekly Batch  ·  Acme Corp  ·  6 Invoices Pending
This week’s invoice queue — 6 invoices waiting to be matched and paid
The AI agent watches your AP inbox and your ERP system. The moment an invoice arrives — email attachment, vendor portal upload, or EDI feed — it pulls the matching PO and goods receipt and begins the comparison automatically. Click any invoice to see it work.
6
Invoices
4
Auto-Approve
2
Flagged
$76,850
Total Value
01
Acme Supplies LLC
INV-4473 · PO-2024-0843 · received Tuesday
INV
PO
$33,600
Pending
02
Midwest Office Solutions
INV-9201 · PO-2024-0838 · received Monday
INV
PO
$8,750
Pending
03
TechStream Services Inc.
INV-2847 · PO-2024-0840 · received Wednesday
INV
PO
$12,400
Pending
04
Acme Supplies LLC
INV-4476 · possible duplicate · received Thursday
INV
DUPE?
$5,600
Pending
05
Pinnacle Logistics Co.
INV-7734 · PO-2024-0844 · received Thursday
INV
GR
$10,200
Pending
06
Cornerstone Industrial
INV-0552 · PO-2024-0845 · received Friday
INV
PO
$6,300
Pending
💡  Connects directly to SAP, NetSuite, QuickBooks, Bill.com, or Tipalti. Invoices are matched the moment they enter the system — whether they come in by email, vendor portal, or EDI feed.
CONNECTS TO ▪ SAP ▪ NetSuite ▪ QuickBooks ▪ Bill.com ▪ Tipalti Outlook Outlook
The AI reads the invoice and matches it against the PO and goods receipt
Left: the actual invoice as received. Right: the AI pulling the matching PO from your ERP, checking the goods receipt, comparing every line item, calculating variance, and checking for duplicates. Select an invoice below.
Vendor invoice — as received
INV-4473INVOICE PDF
AI match result
Comparing PO → GR → Invoice
Ready
Select an invoice above to watch the AI match it.
Match results across all 6 invoices
4 invoices matched cleanly and are queued for auto-payment. 2 are flagged and held — one for a price variance, one as a potential duplicate. No human touched the clean ones.
Acme Supplies LLC — INV-4473
$33,600⚠ Flagged — Hold Payment
PO Amount$31,200✓ received 80%$33,600 invoiced
VariancePartial GR+$2,400 over PO
Invoice exceeds PO by $2,400 (7.7%) and goods receipt is partial. Do not pay until variance explained and full delivery confirmed.
▶ Routed to: CFO for approval  ·  Vendor notified automatically
Midwest Office Solutions — INV-9201
$8,750✓ Matched — Auto-Approved
PO Amount$8,750✓ received 100%$8,750 invoiced
Duplicate CheckNo prior match
✓ Queued for payment  ·  Pushed to NetSuite automatically
TechStream Services Inc. — INV-2847
$12,400✓ Matched — Auto-Approved
PO Amount$12,400✓ received 100%$12,400 invoiced
✓ Queued for payment  ·  Pushed to SAP automatically
Acme Supplies LLC — INV-4476
$5,600⚠ Flagged — Possible Duplicate
Prior PaymentINV-4461$5,600Paid 3 wks ago
Possible duplicate — same vendor, same amount as INV-4461 paid January 8th. Holding for AP manager review.
▶ Routed to: AP Manager  ·  Vendor notified automatically
Pinnacle Logistics Co. — INV-7734
$10,200✓ Matched — Auto-Approved
PO Amount$10,200✓ received 100%$10,200 invoiced
✓ Queued for payment  ·  Pushed to QuickBooks automatically
Cornerstone Industrial — INV-0552
$6,300✓ Matched — Auto-Approved
PO Amount$6,300✓ received 100%$6,300 invoiced
✓ Queued for payment  ·  Pushed to Bill.com automatically
What gets routed to a human — and why
Only 2 of 6 invoices need human attention this week. Both came with full context — the variance amount, the relevant PO, the prior payment record — already attached. Your AP team and CFO spend 10 minutes, not 4 hours.
Price variance — Invoice exceeds PO
Hold
INV-4473 from Acme Supplies is $2,400 over the approved PO amount. Goods receipt is also partial — only 80% of the order was confirmed received. Neither condition alone would clear for payment, and both are present here.
Do not pay until Acme provides a valid change order or the PO is amended.
▶ Routed to: CFO  ·  Vendor auto-notified  ·  AP record updated
Possible duplicate payment
Hold
INV-4476 from Acme Supplies matches INV-4461 exactly — same vendor, same amount, no new PO reference. INV-4461 was paid on January 8th. This is either a resubmission or a billing error.
Hold for AP Manager confirmation before any action.
▶ Routed to: AP Manager  ·  Prior payment record attached
4 invoices auto-approved — no action needed
Cleared
Midwest, TechStream, Pinnacle, and Cornerstone invoices all matched their POs exactly, with full goods receipts confirmed. All four were pushed directly to the payment queue in the respective ERP systems.
$37,650 queued for payment. No human review required.
✓ Pushed to SAP, NetSuite, QuickBooks, Bill.com
How exception routing works
Note
Every exception is routed based on rules you define — price variances over a threshold go to the CFO, duplicate checks go to the AP manager, missing POs go to the department head. Every routing includes the full match detail, not just a flag.
Routing rules are fully configurable per your approval policy.
The AI sends the weekly AP summary to your CFO and AP manager
After every batch run, the AI drafts and sends a summary covering what was auto-approved, what was held, and what needs action. Your leadership team sees the full picture in one email, not a spreadsheet.
How it works

Three steps. Fully automated.

From invoice received to ERP updated — clean ones paid automatically, exceptions routed with full context.

📤
Step 1
Invoice arrives — email, portal, or EDI
The agent watches your AP inbox and ERP system. Invoices from Outlook, vendor portals, or EDI feeds are picked up automatically. It then pulls the matching PO and goods receipt directly from SAP, NetSuite, QuickBooks, Bill.com, or Tipalti.
Orchestrated by n8n or Make.com — the automation layer that connects your inbox and ERP to the AI.
n8n Make.com
🤖
Step 2
AI matches all three documents and flags any variance
Claude AI compares PO price and quantity, goods receipt confirmation, and invoice amount line by line. It checks for price variances, quantity mismatches, partial receipts, and duplicate submissions — and calculates the variance in dollars.
Replaces manual AP matching — the task that takes 40% of your AP team’s week.
Claude AI
Step 3
Clean invoices pay. Exceptions route to the right person.
Matched invoices are pushed directly to the payment queue in your ERP — SAP, NetSuite, Bill.com, or Tipalti. Exceptions are routed to the CFO or AP manager in Outlook with the full variance detail attached — no one has to go digging.
Routing thresholds are fully configurable — you define what goes to whom at what dollar amount.
Outlook Gmail
What this replaces

AP automation platforms charge $20k–$60k/yr.
Or you build it once and own it.

Here’s what finance teams are spending on AP automation today — and what Omni builds for you instead.

Tipalti / Bill.com Current
$20k–$60k
per year · subscription
AP automation built in
Good for high-volume payments
Locked to their payment rails
Limited ERP flexibility
You rent it forever
SAP / Oracle built-in Current
Manual
already licensed · still needs humans
Already in your ERP
No extra license cost
Still requires manual review
No intelligent exception routing
No duplicate detection AI
Your AP team (manual) Current
4 hrs/day
per AP clerk · every week
Understands vendor relationships
Can make judgment calls
40% of day on matching alone
Fatigue = missed duplicates
No audit trail
Omni AI Agent What we build
You own it
one-time build · no annual fees
Connects to your existing ERP
Auto-approves clean invoices
Flags every discrepancy before payment
Routes exceptions with full context
You own it — not a subscription
Demo Notice: Conceptual demonstration of an AI-powered AP 3-way match workflow. All vendor names, invoice numbers, and amounts are illustrative. Omni Online Strategies builds custom AI automation systems integrated with your existing ERP and payment infrastructure.
Josh Leavitt — Founder, Omni Online Strategies
From the founder
“Every finance team I’ve talked to is already in SAP or NetSuite. The 3-way match capability is right there — it just still requires someone to sit there and do it. That’s what we replace.”
We don’t ask you to switch ERPs or adopt a new payment platform. We build the AI layer on top of what you already have — connecting your inbox, your ERP, and your approval workflow into one automated pipeline. Your AP team stops doing data entry and starts doing actual finance work.
Josh Leavitt
Founder & CEO · Omni Online Strategies

Let’s talk about your AP workflow →
About This System
AP 3-Way Match AI Agent — Automated Accounts Payable Invoice Matching
This AI agent automatically matches every vendor invoice against its corresponding purchase order and goods receipt, flags discrepancies above tolerance thresholds, routes exceptions to the right approver, and releases clean matches for payment — without any manual review of matching invoices. Built for finance teams at manufacturing companies, distributors, and mid-market enterprises processing 200 or more vendor invoices per month whose AP staff spends the majority of each week on manual PO matching and exception resolution.
System Facts
CategoryDetail
Manual Process ReplacedAP staff manually comparing each invoice to its PO and goods receipt in the ERP — checking line items, quantities, unit prices, and tax against three separate documents
TriggerNew invoice received via email or uploaded to the AP inbox — PDF, scanned document, or electronic invoice
What the System DoesExtracts invoice data using AI document parsing, retrieves the matching PO and goods receipt from the ERP, performs line-level 3-way match, classifies as clean match or exception with reason code
Who Uses ItAP managers, controllers, finance operations teams at companies processing 200 or more invoices per month
IntegrationsEmail or document inbox (invoice capture), OpenAI (document parsing), ERP system (PO and GR retrieval via API or export), n8n (workflow orchestration), Slack or email (exception routing)
OutputClean matches released to payment queue automatically; exceptions routed to approver with discrepancy summary and recommended action
Time SavedAverage AP teams save 2 to 3 hours per 100 invoices processed — equivalent to 20 to 30% of an AP specialist's time at 500+ monthly invoice volumes
Error Rate ReductionEliminates manual keying errors; catches discrepancies under $50 that human reviewers often let through to meet processing deadlines
Sources & Research
Frequently Asked Questions

3-way matching is the process of verifying that a vendor invoice matches both the original purchase order and the goods receipt (or service confirmation) before approving payment. The three documents are: (1) the purchase order showing what was ordered at what price, (2) the goods receipt showing what was actually received, and (3) the vendor invoice showing what the vendor is billing. A clean 3-way match means all three documents agree on items, quantities, and prices within configured tolerance. Discrepancies between any two documents create an exception that requires human review before payment is released.

The agent catches: price discrepancies (invoice unit price differs from PO price by more than the configured tolerance), quantity discrepancies (invoice quantity exceeds goods receipt quantity), item code mismatches (invoice references an item not on the PO), duplicate invoices (same invoice number or amount from same vendor within a lookback period), missing PO reference (invoice arrives with no matching PO in the system), and tax or freight charges not on the original PO. Each exception type is given a reason code and routed to the appropriate reviewer.

OpenAI's vision and document parsing capabilities extract structured data from invoice PDFs — including vendor name, invoice number, invoice date, line items (description, quantity, unit price, extended amount), tax amounts, freight charges, and total amount. The extraction handles multiple invoice formats without templates because the AI reads the document layout contextually rather than using fixed field coordinates. Extraction accuracy is verified by cross-checking the extracted total against the sum of line items before any matching logic runs.

The agent integrates with any ERP that exposes a query API or can export PO and goods receipt data in a structured format. Pre-built integrations exist for NetSuite, SAP Business One, QuickBooks Online (via QBO API), and Microsoft Dynamics 365. For ERPs without direct API access, the agent can work from scheduled exports to a shared folder or Google Sheet. The key data required from the ERP is the open PO line items and any goods receipts posted against those POs.

When a discrepancy is detected, the agent classifies the exception by type and severity (dollar amount of variance), generates a plain-language summary of the discrepancy, and routes it to the designated approver via Slack or email. The summary includes the invoice number, vendor name, discrepancy type, dollar amount, and a recommended action (contact vendor for credit memo, approve and pay with variance notation, or hold for PO amendment). The approver's decision is logged back to the system and the invoice status is updated.

Yes. Because the extraction uses AI document understanding rather than template-based OCR, it handles any vendor's invoice layout — including multi-page invoices, invoices with complex line item structures, invoices with merged cells or unusual formatting, and invoices in languages other than English. The system handles both digital PDF invoices and scanned paper invoices converted to PDF. Processing accuracy improves as the agent sees more invoices from each vendor over time.

For a company processing 500 invoices per month at $12 average manual processing cost, the total manual cost is $6,000 per month or $72,000 per year. Automated matching reduces the per-invoice cost to approximately $2 for clean matches (roughly 70 to 80% of total volume) and $5 to $6 for exceptions requiring human review. Total automated cost for the same volume drops to approximately $1,500 per month — a 75% reduction. Additionally, faster processing reduces late payment penalties and enables capturing early payment discounts that manual teams miss.

How It Works
STEP 01

Invoice arrives in monitored inbox

Email or document management system routes incoming vendor invoices to the monitored AP inbox. n8n triggers on new email or document upload.

STEP 02

AI extracts structured data from invoice PDF

OpenAI parses the invoice PDF and extracts vendor, invoice number, date, line items, quantities, unit prices, tax, freight, and total into a structured record.

STEP 03

PO and goods receipt retrieved from ERP

The extracted PO reference number is used to query the ERP for the matching purchase order line items and any posted goods receipts against that PO.

STEP 04

Line-level 3-way match performed

Each invoice line is compared to the corresponding PO line and goods receipt line. Variances above the configured tolerance threshold are flagged with a reason code.

STEP 05

Clean matches released to payment queue

Invoices where all lines match within tolerance are automatically coded, approved, and queued for payment processing — no human touch required.

STEP 06

Exceptions routed to approver with summary

Discrepant invoices are routed to the designated approver via Slack or email with a plain-language discrepancy summary, dollar variance, and recommended action.

STEP 07

All activity logged for audit trail

Every invoice processed, its match result, exception reason codes, approver decisions, and payment status are logged to a structured record for finance audit purposes.

--amber:#C98A2D;--amber-dim:rgba(201,138,45,.1); --blue:#3B7DD8;--blue-dim:rgba(59,125,216,.1); --text:#E2E8F0;--text2:rgba(226,232,240,.58);--text3:rgba(226,232,240,.32); } *,*::before,*::after{box-sizing:border-box;margin:0;padding:0} html{scroll-behavior:smooth} body{background:var(--bg);color:var(--text);font-family:'DM Sans',sans-serif;font-size:15px;line-height:1.6;overflow-x:hidden} body::before{content:'';position:fixed;inset:0;background-image:linear-gradient(rgba(42,157,143,.02) 1px,transparent 1px),linear-gradient(90deg,rgba(42,157,143,.02) 1px,transparent 1px);background-size:48px 48px;pointer-events:none;z-index:0} /* ── HERO ── */ .hero{position:relative;z-index:1;display:grid;grid-template-columns:1fr 1fr;align-items:center;gap:60px;max-width:1140px;margin:0 auto;padding:80px 40px 60px} @media(max-width:820px){.hero{grid-template-columns:1fr;padding:60px 24px 40px}} .eyebrow{display:inline-flex;align-items:center;gap:8px;background:var(--teal-dim);border:1px solid var(--teal-border);border-radius:4px;padding:5px 14px;font-size:11px;color:var(--teal);letter-spacing:.07em;text-transform:uppercase;margin-bottom:20px;font-family:'DM Mono',monospace} .hero h1{font-family:'Sora',sans-serif;font-size:clamp(28px,3.6vw,46px);font-weight:800;line-height:1.1;letter-spacing:-1px;margin-bottom:18px} .hero h1 em{font-style:normal;color:var(--teal)} .hero-desc{font-size:16px;color:var(--text2);line-height:1.75;margin-bottom:22px} .hero-desc strong{color:var(--text);font-weight:500} .demo-ptr{display:flex;align-items:flex-start;gap:10px;margin-bottom:28px;font-size:14px;color:var(--text2);background:rgba(42,157,143,.06);border:1px solid rgba(42,157,143,.14);border-radius:6px;padding:12px 16px;line-height:1.55} .stat-row{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:30px} .stat-chip{background:var(--bg3);border:1px solid var(--border);border-radius:6px;padding:10px 16px;display:flex;flex-direction:column;gap:3px} .stat-num{font-family:'Sora',sans-serif;font-size:20px;font-weight:700;color:var(--teal)} .stat-lbl{font-size:11px;color:var(--text3);font-family:'DM Mono',monospace} .cta-primary{display:inline-flex;align-items:center;gap:10px;background:var(--teal);color:white;text-decoration:none;padding:12px 24px;border-radius:6px;font-family:'Sora',sans-serif;font-size:14px;font-weight:700;transition:background .2s;border:none;cursor:pointer} .cta-primary:hover{background:var(--teal2)} .hero-visual{display:flex;align-items:center;justify-content:center} @media(max-width:820px){.hero-visual{display:none}} /* ── SECTIONS ── */ .section{position:relative;z-index:1;max-width:1100px;margin:0 auto;padding:20px 28px 70px} .sec-label{font-family:'DM Mono',monospace;font-size:10px;color:var(--teal);letter-spacing:.12em;text-transform:uppercase;margin-bottom:12px;display:flex;align-items:center;gap:8px} .sec-label::before{content:'';display:block;width:16px;height:1px;background:var(--teal)} .sec-h{font-family:'Sora',sans-serif;font-size:clamp(22px,3vw,34px);font-weight:700;letter-spacing:-.5px;margin-bottom:10px} .sec-sub{font-size:15px;color:var(--text2);max-width:580px;line-height:1.7;margin-bottom:40px} /* ── 3-WAY FLOW DIAGRAM ── */ .match-flow{display:grid;grid-template-columns:1fr auto 1fr auto 1fr auto 1fr;align-items:center;gap:0;margin-bottom:40px} @media(max-width:680px){.match-flow{grid-template-columns:1fr;gap:8px}} .match-node{background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:16px;text-align:center} .match-node.active{border-color:var(--teal-border);background:var(--teal-dim)} .match-node.flag{border-color:rgba(201,76,76,.3);background:var(--red-dim)} .match-node-icon{font-size:22px;margin-bottom:8px} .match-node-label{font-size:12px;font-weight:600;margin-bottom:3px;font-family:'Sora',sans-serif} .match-node-sub{font-size:11px;color:var(--text3);font-family:'DM Mono',monospace} .match-arr{font-size:20px;color:rgba(42,157,143,.35);text-align:center;padding:0 4px} @media(max-width:680px){.match-arr{display:none}} /* ── PROBLEM CHAOS ── */ .chaos-layout{display:grid;grid-template-columns:1fr auto 1fr;align-items:start;gap:32px} @media(max-width:760px){.chaos-layout{grid-template-columns:1fr;gap:20px}} .chaos-arrow{font-size:28px;color:rgba(42,157,143,.3);text-align:center;padding-top:60px} @media(max-width:760px){.chaos-arrow{display:none}} .doc-stack{display:flex;flex-direction:column;gap:8px} .doc-card{background:var(--bg2);border:1px solid var(--border);border-radius:8px;overflow:hidden} .doc-card-bar{padding:8px 14px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;background:var(--bg3)} .doc-card-name{font-size:11px;font-weight:600;color:var(--text2);font-family:'DM Mono',monospace} .doc-card-body{padding:10px 14px} .doc-fake-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:5px} .dfk{height:6px;border-radius:2px;background:rgba(255,255,255,.07)} .dfk.s{width:40%}.dfk.m{width:65%}.dfk.f{width:100%}.dfk.a{width:28%;background:rgba(255,255,255,.1)} .doc-note{font-size:10px;color:rgba(201,76,76,.65);margin-top:7px;font-family:'DM Mono',monospace} .dtag{font-size:9px;font-weight:600;padding:2px 7px;border-radius:3px;letter-spacing:.04em;font-family:'DM Mono',monospace} .t-po{background:rgba(42,157,143,.1);color:#5DC8BC;border:1px solid rgba(42,157,143,.25)} .t-gr{background:var(--blue-dim);color:#80AAEC;border:1px solid rgba(59,125,216,.25)} .t-inv{background:var(--amber-dim);color:#E0AA60;border:1px solid rgba(201,138,45,.25)} .t-ex{background:var(--red-dim);color:#E08080;border:1px solid rgba(201,76,76,.2)} .ai-result-card{background:var(--bg2);border:1px solid rgba(45,157,106,.28);border-radius:8px;overflow:hidden} .ai-result-bar{background:rgba(45,157,106,.07);padding:11px 16px;border-bottom:1px solid rgba(45,157,106,.15);display:flex;align-items:center;gap:8px} .ai-result-bar-title{font-size:12px;font-weight:600;color:var(--green);font-family:'DM Mono',monospace} .ai-result-body{padding:14px 16px} .air{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 0;border-bottom:1px solid rgba(255,255,255,.04);font-size:12px} .air:last-child{border:none} .air-item{color:var(--text2)}.air-val{font-weight:500;color:var(--text);font-family:'DM Mono',monospace} .af{font-size:9px;padding:2px 7px;border-radius:3px;font-weight:600;flex-shrink:0;font-family:'DM Mono',monospace} .f-ok{background:var(--green-dim);color:var(--green)} .f-flag{background:var(--red-dim);color:var(--red)} .f-watch{background:var(--amber-dim);color:var(--amber)} /* ── APP SHELL ── */ .demo-section{position:relative;z-index:1;max-width:1140px;margin:0 auto;padding:0 24px 80px} .demo-intro{text-align:center;margin-bottom:18px} .demo-intro-lbl{display:inline-flex;align-items:center;gap:8px;background:var(--teal-dim);border:1px solid var(--teal-border);border-radius:4px;padding:5px 16px;font-family:'DM Mono',monospace;font-size:11px;color:var(--teal);letter-spacing:.05em;margin-bottom:8px} .demo-intro-sub{font-size:14px;color:var(--text2);max-width:620px;margin:0 auto} .app-shell{background:var(--bg2);border:1px solid var(--border2);border-radius:10px;overflow:hidden;box-shadow:0 24px 60px rgba(0,0,0,.5)} .app-chrome{background:var(--bg3);border-bottom:1px solid var(--border);padding:10px 18px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px} .chrome-left{display:flex;align-items:center;gap:14px} .chrome-dots{display:flex;gap:5px} .chrome-dot{width:10px;height:10px;border-radius:50%} .chrome-title{font-family:'DM Mono',monospace;font-size:11px;color:var(--text3)} .chrome-title span{color:var(--text2)} .run-btn{background:var(--teal);color:white;border:none;border-radius:5px;padding:7px 18px;font-size:12px;font-weight:700;cursor:pointer;font-family:'DM Mono',monospace;letter-spacing:.03em;transition:background .2s,opacity .2s} .run-btn:disabled{opacity:.4;cursor:default} .run-btn:not(:disabled):hover{background:var(--teal2)} .app-tabs{background:var(--bg3);border-bottom:1px solid var(--border);display:flex;overflow-x:auto;scrollbar-width:none;padding:0 8px} .app-tabs::-webkit-scrollbar{display:none} .app-tab{font-family:'DM Mono',monospace;font-size:11px;color:var(--text3);background:none;border:none;border-bottom:2px solid transparent;padding:11px 16px 9px;cursor:pointer;white-space:nowrap;transition:color .15s,border-color .15s;letter-spacing:.02em;display:flex;flex-direction:column;align-items:flex-start;gap:2px} .app-tab:hover{color:var(--text2)} .app-tab.active{color:var(--teal);border-bottom-color:var(--teal)} .app-tab-label{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:500} .tab-num{width:17px;height:17px;border-radius:3px;background:var(--bg4);display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--text3);flex-shrink:0;transition:background .15s,color .15s;font-family:'DM Mono',monospace} .app-tab.active .tab-num{background:var(--teal);color:white} .app-tab-sub{font-size:10px;color:var(--text3);padding-left:23px} .tab-panel{display:none}.tab-panel.active{display:block} .tab-body{padding:22px} .tab-head{margin-bottom:18px} .tab-title{font-size:15px;font-weight:600;margin-bottom:4px;font-family:'Sora',sans-serif} .tab-desc{font-size:13px;color:var(--text2);line-height:1.65} /* ── TAB 1 — INVOICE QUEUE ── */ .queue-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:20px} @media(max-width:580px){.queue-stats{grid-template-columns:1fr 1fr}} .qs{background:var(--bg3);border:1px solid var(--border);border-radius:6px;padding:12px 14px;text-align:center} .qs-num{font-family:'Sora',sans-serif;font-size:22px;font-weight:700;margin-bottom:3px} .qs-lbl{font-size:11px;color:var(--text3);font-family:'DM Mono',monospace} .inv-list{display:flex;flex-direction:column;gap:7px} .inv-row{display:grid;grid-template-columns:28px 1fr auto auto auto 110px;align-items:center;gap:14px;background:var(--bg3);border:1px solid var(--border);border-radius:7px;padding:13px 18px;cursor:pointer;transition:border-color .2s,background .15s;opacity:0;animation:fadeUp .3s ease forwards} .inv-row:hover{border-color:rgba(42,157,143,.28);background:var(--bg4)} .inv-row.processing{border-color:rgba(201,138,45,.3)}.inv-row.matched{border-color:rgba(45,157,106,.22)}.inv-row.flagged{border-color:rgba(201,76,76,.28)} @keyframes fadeUp{to{opacity:1}} .inv-num{font-family:'DM Mono',monospace;font-size:11px;color:var(--text3)} .inv-info{min-width:0} .inv-vendor{font-size:14px;font-weight:500;margin-bottom:2px} .inv-detail{font-size:11px;color:var(--text3);font-family:'DM Mono',monospace} .inv-amt{font-family:'DM Mono',monospace;font-size:13px;font-weight:600;text-align:right} .inv-status{font-size:11px;text-align:right;min-width:100px;font-family:'DM Mono',monospace} .s-wait{color:var(--text3)}.s-proc{color:var(--amber);display:flex;align-items:center;gap:5px;justify-content:flex-end}.s-match{color:var(--green);display:flex;align-items:center;gap:5px;justify-content:flex-end}.s-flag{color:var(--red);display:flex;align-items:center;gap:5px;justify-content:flex-end} .pulsedot{width:6px;height:6px;border-radius:50%;background:var(--amber);animation:pd 1.2s ease-in-out infinite} .greendot{width:6px;height:6px;border-radius:50%;background:var(--green)} .reddot{width:6px;height:6px;border-radius:50%;background:var(--red)} @keyframes pd{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.7)}} .hint-bar{margin-top:12px;padding:11px 15px;background:rgba(42,157,143,.05);border:1px solid rgba(42,157,143,.12);border-radius:6px;font-size:13px;color:var(--text2);line-height:1.55} .tool-strip{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px;padding-top:12px;border-top:1px solid var(--border);align-items:center} .ts-lbl{font-family:'DM Mono',monospace;font-size:10px;color:var(--text3);margin-right:4px;letter-spacing:.04em} .tool-pill{display:flex;align-items:center;gap:6px;background:var(--bg4);border:1px solid var(--border);border-radius:5px;padding:5px 11px;font-size:12px;color:var(--text2);text-decoration:none;transition:border-color .2s} .tool-pill:hover{border-color:var(--border2)} .tool-pill img{width:14px;height:14px;object-fit:contain} /* ── TAB 2 — AI MATCH ── */ .match-picker{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px} .mpbtn{font-family:'DM Mono',monospace;font-size:11px;padding:6px 12px;border-radius:5px;background:var(--bg3);border:1px solid var(--border);color:var(--text3);cursor:pointer;transition:all .15s;display:flex;align-items:center;gap:6px} .mpbtn:hover{color:var(--text2);border-color:var(--border2)} .mpbtn.active{background:var(--teal-dim);border-color:var(--teal-border);color:var(--text)} .match-split{display:grid;grid-template-columns:1fr 1fr;gap:14px} @media(max-width:660px){.match-split{grid-template-columns:1fr}} .pane-lbl{font-family:'DM Mono',monospace;font-size:10px;color:var(--text3);margin-bottom:7px;text-transform:uppercase;letter-spacing:.06em;display:flex;align-items:center;gap:6px} .doc-viewer{background:#F8F7F4;border-radius:7px;overflow:hidden;border:1px solid rgba(0,0,0,.08);min-height:320px} .doc-top{background:#EDEAE0;padding:9px 14px;border-bottom:1px solid rgba(0,0,0,.08);display:flex;align-items:center;justify-content:space-between} .doc-top-name{font-size:11px;font-weight:600;color:#2E2C1E;font-family:'DM Mono',monospace} .doc-top-type{font-size:10px;color:#7A7460;font-family:'DM Mono',monospace} .doc-content{padding:14px;font-size:12px;line-height:1.9;color:#46443A;font-family:'DM Mono',monospace} .doc-line{display:flex;justify-content:space-between;gap:14px;padding:1px 4px;border-radius:3px;transition:background .15s} .doc-line.hl{background:rgba(42,157,143,.13)}.doc-line.sc{color:#B8B2A0}.doc-line.bl{font-weight:600;color:#1E1C0E} .doc-line-val{font-weight:600;color:#1E1C0E;white-space:nowrap} .ai-panel{background:var(--bg3);border:1px solid var(--border);border-radius:7px;overflow:hidden;display:flex;flex-direction:column;min-height:320px} .ai-panel-top{padding:10px 14px;border-bottom:1px solid var(--border);background:var(--bg4);display:flex;align-items:center;justify-content:space-between} .ai-panel-lbl{font-family:'DM Mono',monospace;font-size:11px;font-weight:500;display:flex;align-items:center;gap:7px} .ai-panel-status{font-family:'DM Mono',monospace;font-size:10px;color:var(--text3)} .prog-wrap{height:2px;background:var(--bg4)} .prog-bar{height:100%;background:linear-gradient(90deg,var(--teal),var(--green));width:0%;transition:width .35s ease} .ai-findings{padding:8px;display:flex;flex-direction:column;gap:5px;flex:1;overflow-y:auto} .ai-finding{padding:9px 13px;background:var(--bg2);border:1px solid var(--border);border-radius:6px;display:flex;align-items:center;justify-content:space-between;gap:10px;opacity:0;transform:translateY(4px);transition:opacity .2s,transform .2s} .ai-finding.show{opacity:1;transform:translateY(0)} .finding-name{font-size:12px;color:var(--text);flex:1} .finding-val{font-family:'DM Mono',monospace;font-size:12px;color:var(--text2);margin-right:6px} .finding-flag{font-family:'DM Mono',monospace;font-size:9px;padding:2px 7px;border-radius:3px;font-weight:600;white-space:nowrap} .b-ok{background:var(--green-dim);color:var(--green)} .b-flag{background:var(--red-dim);color:var(--red)} .b-watch{background:var(--amber-dim);color:var(--amber)} .ai-placeholder{padding:40px 20px;text-align:center;font-size:13px;color:var(--text3);font-family:'DM Mono',monospace} /* ── TAB 3 — MATCH RESULTS ── */ .results-grid{display:flex;flex-direction:column;gap:10px} .result-card{background:var(--bg3);border:1px solid var(--border);border-radius:8px;overflow:hidden} .result-card.rc-matched{border-color:rgba(45,157,106,.25)} .result-card.rc-flagged{border-color:rgba(201,76,76,.3)} .result-card.rc-partial{border-color:rgba(201,138,45,.25)} .rc-header{padding:12px 16px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--border)} .rc-vendor{font-size:14px;font-weight:600;font-family:'Sora',sans-serif} .rc-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap} .rc-badge{font-family:'DM Mono',monospace;font-size:10px;padding:3px 9px;border-radius:4px;font-weight:600} .badge-matched{background:var(--green-dim);color:var(--green);border:1px solid rgba(45,157,106,.22)} .badge-flagged{background:var(--red-dim);color:var(--red);border:1px solid rgba(201,76,76,.22)} .badge-partial{background:var(--amber-dim);color:var(--amber);border:1px solid rgba(201,138,45,.22)} .rc-body{padding:12px 16px} .rc-match-row{display:grid;grid-template-columns:140px 1fr 1fr 1fr auto;gap:10px;align-items:center;padding:6px 0;border-bottom:1px solid rgba(255,255,255,.04);font-size:12px} .rc-match-row:last-child{border:none} .rc-field{font-family:'DM Mono',monospace;color:var(--text3);font-size:10px;letter-spacing:.03em} .rc-po{color:var(--teal)}.rc-gr{color:var(--blue)}.rc-inv{color:var(--amber)} .rc-match-icon{font-size:14px;text-align:center} .rc-flag-note{margin-top:10px;padding:10px 12px;border-radius:5px;font-size:12px;font-family:'DM Mono',monospace} .rc-flag-note.error{background:var(--red-dim);border:1px solid rgba(201,76,76,.2);color:var(--red)} .rc-flag-note.warn{background:var(--amber-dim);border:1px solid rgba(201,138,45,.2);color:var(--amber)} .rc-action{margin-top:8px;font-size:12px;color:var(--text2);display:flex;align-items:center;gap:6px} /* ── TAB 4 — EXCEPTIONS ── */ .exc-intro{font-size:13px;color:var(--text2);margin-bottom:18px;padding:12px 16px;background:rgba(201,76,76,.05);border:1px solid rgba(201,76,76,.14);border-radius:6px;line-height:1.6} .exc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px} .exc-card{background:var(--bg3);border:1px solid var(--border);border-radius:8px;padding:16px;transition:transform .2s} .exc-card:hover{transform:translateY(-2px)} .ec-high{border-color:rgba(201,76,76,.28)}.ec-med{border-color:rgba(201,138,45,.22)}.ec-info{border-color:rgba(42,157,143,.2)}.ec-ok{border-color:rgba(45,157,106,.22)} .exc-hd{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:8px} .exc-ttl{font-size:13px;font-weight:600;line-height:1.35;font-family:'Sora',sans-serif} .exc-sev{font-family:'DM Mono',monospace;font-size:9px;font-weight:700;padding:3px 8px;border-radius:3px;flex-shrink:0;letter-spacing:.04em;text-transform:uppercase} .sv-high{background:var(--red-dim);color:var(--red);border:1px solid rgba(201,76,76,.22)} .sv-med{background:var(--amber-dim);color:var(--amber);border:1px solid rgba(201,138,45,.22)} .sv-info{background:var(--teal-dim);color:var(--teal);border:1px solid var(--teal-border)} .sv-ok{background:var(--green-dim);color:var(--green);border:1px solid rgba(45,157,106,.22)} .exc-bd{font-size:12px;color:var(--text2);line-height:1.6} .exc-action{margin-top:8px;font-size:12px;font-weight:600;font-family:'DM Mono',monospace} .exc-route{margin-top:6px;display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text3);font-family:'DM Mono',monospace} /* ── TAB 5 — APPROVAL EMAIL ── */ .email-wrap{max-width:680px;margin:0 auto} .email-shell{background:var(--bg3);border:1px solid var(--border);border-radius:8px;overflow:hidden} .email-bar{background:var(--bg4);padding:10px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;justify-content:space-between} .email-bar-left{display:flex;align-items:center;gap:7px;font-family:'DM Mono',monospace;font-size:11px;color:var(--text3)} .email-field{padding:9px 16px;border-bottom:1px solid rgba(255,255,255,.04);display:flex;gap:10px;align-items:baseline} .ef-label{font-family:'DM Mono',monospace;font-size:10px;color:var(--text3);width:52px;flex-shrink:0;letter-spacing:.04em} .ef-val{font-size:13px;color:var(--text);flex:1} .email-body{padding:18px;font-family:'DM Mono',monospace;font-size:12px;line-height:2;color:var(--text2);min-height:280px;max-height:400px;overflow-y:auto} .el{opacity:0;animation:eli .2s ease forwards} @keyframes eli{to{opacity:1}} .eg{color:var(--green)}.er{color:var(--red)}.ea{color:var(--amber)}.eb{color:var(--teal)} .email-foot{padding:12px 16px;border-top:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px} .send-btn{background:var(--teal);color:white;border:none;border-radius:5px;padding:9px 22px;font-family:'DM Mono',monospace;font-size:12px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:7px;transition:background .2s;letter-spacing:.02em} .send-btn:hover{background:var(--teal2)} .send-btn.sent{background:var(--green);cursor:default} /* ── HOW IT WORKS ── */ .hiw{position:relative;z-index:1;background:var(--bg2);border-top:1px solid var(--border);border-bottom:1px solid var(--border);padding:70px 28px} .hiw-inner{max-width:1060px;margin:0 auto} .hiw-steps{display:grid;grid-template-columns:1fr auto 1fr auto 1fr;gap:0;margin-top:44px} @media(max-width:720px){.hiw-steps{grid-template-columns:1fr;gap:20px}} .hiw-arr{color:rgba(42,157,143,.28);font-size:24px;padding:34px 10px 0;text-align:center} @media(max-width:720px){.hiw-arr{display:none}} .hiw-step{background:var(--bg3);border:1px solid var(--border);border-radius:8px;padding:24px 20px} .hiw-icon{width:48px;height:48px;border-radius:7px;display:flex;align-items:center;justify-content:center;margin:0 0 14px;font-size:22px} .hiw-num{font-family:'DM Mono',monospace;font-size:10px;color:var(--teal);font-weight:600;letter-spacing:.08em;text-transform:uppercase;margin-bottom:6px} .hiw-title{font-family:'Sora',sans-serif;font-size:15px;font-weight:700;margin-bottom:9px;line-height:1.3} .hiw-body{font-size:13px;color:var(--text2);line-height:1.65;margin-bottom:12px} .hiw-note{font-size:11px;color:var(--text3);padding:8px 11px;background:rgba(255,255,255,.03);border:1px solid var(--border);border-radius:5px;margin-bottom:11px;font-family:'DM Mono',monospace;line-height:1.5} .hiw-note strong{color:var(--red)} .tool-logos{display:flex;flex-wrap:wrap;gap:7px} .tlb{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;background:var(--bg4);border:1px solid var(--border)} .tlb img{width:16px;height:16px;object-fit:contain} /* ── BENCHMARK ── */ .bench{position:relative;z-index:1;max-width:1060px;margin:0 auto;padding:70px 28px} .bench-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin-top:40px} .bench-card{background:var(--bg2);border:1px solid var(--border);border-radius:8px;padding:20px} .bench-card.hl{border-color:rgba(45,157,106,.3);background:rgba(45,157,106,.03)} .bench-name{font-family:'DM Mono',monospace;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text3);margin-bottom:10px;display:flex;align-items:center;gap:6px;flex-wrap:wrap} .bench-name span{padding:2px 7px;border-radius:3px;font-size:9px} .tag-them{background:var(--red-dim);color:var(--red)}.tag-us{background:var(--green-dim);color:var(--green)} .bench-price{font-family:'Sora',sans-serif;font-size:26px;font-weight:700;margin-bottom:3px} .bench-period{font-size:11px;color:var(--text3);margin-bottom:14px;font-family:'DM Mono',monospace} .bench-features{display:flex;flex-direction:column;gap:6px} .bench-feature{font-size:12px;color:var(--text2);display:flex;align-items:flex-start;gap:6px} .bench-feature::before{content:attr(data-icon);flex-shrink:0} /* ── JOSH ── */ .josh{border-top:1px solid var(--border);padding:60px 28px;position:relative;z-index:1} .josh-inner{max-width:860px;margin:0 auto;display:grid;grid-template-columns:170px 1fr;gap:48px;align-items:center} @media(max-width:640px){.josh-inner{grid-template-columns:1fr}} .josh-photo{width:100%;border-radius:8px;border:1px solid var(--border);display:block} .j-eyebrow{font-family:'DM Mono',monospace;font-size:10px;color:var(--teal);letter-spacing:.1em;text-transform:uppercase;margin-bottom:12px} .j-quote{font-family:'Sora',sans-serif;font-size:clamp(16px,2vw,20px);font-weight:600;line-height:1.45;letter-spacing:-.2px;margin-bottom:13px} .j-body{font-size:14px;color:var(--text2);line-height:1.75;margin-bottom:22px} .j-name{font-family:'Sora',sans-serif;font-weight:700;font-size:15px;margin-bottom:2px} .j-title{font-family:'DM Mono',monospace;font-size:12px;color:var(--text3);margin-bottom:22px} .cta-btn{display:inline-flex;align-items:center;gap:8px;background:var(--teal);color:white;text-decoration:none;padding:11px 22px;border-radius:6px;font-family:'Sora',sans-serif;font-size:14px;font-weight:700;transition:background .2s} .cta-btn:hover{background:var(--teal2)} .disclaimer{max-width:1060px;margin:0 auto;padding:0 28px 48px;position:relative;z-index:1} .disclaimer-inner{font-size:11px;color:var(--text3);line-height:1.75;background:var(--bg2);border:1px solid var(--border);border-radius:6px;padding:13px 17px;font-family:'DM Mono',monospace} .disclaimer-inner strong{color:rgba(226,232,240,.4)}
● AI Automation  ·  Accounts Payable

AP 3-Way Match AI Agent — Auto-Matches Every PO, Receipt & Invoice Before a Dollar Goes Out

Your AP team is manually matching purchase orders to goods receipts to vendor invoices — one by one, in SAP or NetSuite. It’s 40% of their day and the easiest thing AI can take over.

👈  Live demo below. Watch the AI match a full AP queue — auto-approving clean invoices, flagging discrepancies, and routing exceptions to the right approver. Hit Run Demo to auto-play.
40%
of AP team time on matching
5–10%
of invoices have errors
$0
overpayments missed
AP 3-WAY MATCH — ACME CORP — WEEKLY BATCH PURCHASE ORDERS PO-2024-0841 $12,400 PO-2024-0842 $8,750 PO-2024-0843 $31,200 PO-2024-0844 $5,600 PO-2024-0845 $18,900 + 7 more... 12 POs GOODS RECEIPTS GR-2024-1201 ✓ recv GR-2024-1202 ✓ recv GR-2024-1203 partial GR-2024-1204 ✓ recv GR-2024-1205 ✓ recv 12 receipts VENDOR INVOICES INV-4471 $12,400 INV-4472 $8,750 INV-4473 $33,600 INV-4474 $5,600 INV-4475 $18,900 12 invoices 🤖 AI 3-WAY MATCH ENGINE (Claude AI + n8n) Comparing PO qty/price → GR received qty → Invoice amount → flagging variances ✓ AUTO-APPROVED: 10 invoices  — $71,150 ⚠ FLAGGED: 2 invoices  — $41,900 EXCEPTION 1: INV-4473 — Acme Supplies PO amount: $31,200  |  GR received: partial (80%)  |  Invoice: $33,600 ⚠ Invoice exceeds PO by $2,400  +  partial receipt — routed to CFO approval AI automation replaced 4 hours of manual AP matching. Every discrepancy caught. Every clean invoice auto-approved. Zero overpayments. Integrated with: SAP  |  NetSuite  |  QuickBooks  |  Bill.com  |  Tipalti
The Problem

Every invoice needs a PO and a goods receipt
before it gets paid. Someone has to check all three.

For a mid-size company processing 200 invoices a week, that’s someone’s entire job. And when the amounts don’t match — wrong quantity shipped, duplicate invoice, price that changed since the PO — those exceptions get lost in email threads.

📄
Purchase Order
What you agreed to pay
+
📦
Goods Receipt
What you actually received
+
🧾
Vendor Invoice
What they’re charging you
=
Pay or Flag
All three must agree
⚠  What lands in AP’s inbox
🧾  INV-4473 — Acme Supplies LLCINVOICE
⚠ Invoice is $33,600. PO was $31,200. Where’s the $2,400 from?
📄  PO-2024-0843 — approvedPO
⚠ Partial receipt on file — only 80% of goods received.
📦  INV-4476 — possible duplicateDUPLICATE?
⚠ Same vendor, same amount as INV-4461 paid 3 weeks ago.
✓  What the AI agent does
3-Way Match Result — INV-4473 (Acme Supplies)
PO-2024-0843 amount$31,200Found
Goods receipt statusPartial — 80%Flag ⚠
Invoice amount$33,600Over PO
Variance+$2,400 (7.7%)Discrepancy
Duplicate checkNo match foundClear
HOLD — Do not pay.Routed to CFO for approval with variance detail.
▪  Clean invoices are auto-approved and pushed to payment. Only exceptions reach a human — with full context already attached.
●  Interactive Demo — AP Batch Processing

Watch the AI work through a real AP queue — 6 invoices across 3 vendors. Click any invoice to see the match detail, or hit Run Demo to process all six.

AP Automation  ·  Weekly Batch  ·  Acme Corp  ·  6 Invoices Pending
This week’s invoice queue — 6 invoices waiting to be matched and paid
The AI agent watches your AP inbox and your ERP system. The moment an invoice arrives — email attachment, vendor portal upload, or EDI feed — it pulls the matching PO and goods receipt and begins the comparison automatically. Click any invoice to see it work.
6
Invoices
4
Auto-Approve
2
Flagged
$76,850
Total Value
01
Acme Supplies LLC
INV-4473 · PO-2024-0843 · received Tuesday
INV
PO
$33,600
Pending
02
Midwest Office Solutions
INV-9201 · PO-2024-0838 · received Monday
INV
PO
$8,750
Pending
03
TechStream Services Inc.
INV-2847 · PO-2024-0840 · received Wednesday
INV
PO
$12,400
Pending
04
Acme Supplies LLC
INV-4476 · possible duplicate · received Thursday
INV
DUPE?
$5,600
Pending
05
Pinnacle Logistics Co.
INV-7734 · PO-2024-0844 · received Thursday
INV
GR
$10,200
Pending
06
Cornerstone Industrial
INV-0552 · PO-2024-0845 · received Friday
INV
PO
$6,300
Pending
💡  Connects directly to SAP, NetSuite, QuickBooks, Bill.com, or Tipalti. Invoices are matched the moment they enter the system — whether they come in by email, vendor portal, or EDI feed.
CONNECTS TO ▪ SAP ▪ NetSuite ▪ QuickBooks ▪ Bill.com ▪ Tipalti Outlook Outlook
The AI reads the invoice and matches it against the PO and goods receipt
Left: the actual invoice as received. Right: the AI pulling the matching PO from your ERP, checking the goods receipt, comparing every line item, calculating variance, and checking for duplicates. Select an invoice below.
Vendor invoice — as received
INV-4473INVOICE PDF
AI match result
Comparing PO → GR → Invoice
Ready
Select an invoice above to watch the AI match it.
Match results across all 6 invoices
4 invoices matched cleanly and are queued for auto-payment. 2 are flagged and held — one for a price variance, one as a potential duplicate. No human touched the clean ones.
Acme Supplies LLC — INV-4473
$33,600⚠ Flagged — Hold Payment
PO Amount$31,200✓ received 80%$33,600 invoiced
VariancePartial GR+$2,400 over PO
Invoice exceeds PO by $2,400 (7.7%) and goods receipt is partial. Do not pay until variance explained and full delivery confirmed.
▶ Routed to: CFO for approval  ·  Vendor notified automatically
Midwest Office Solutions — INV-9201
$8,750✓ Matched — Auto-Approved
PO Amount$8,750✓ received 100%$8,750 invoiced
Duplicate CheckNo prior match
✓ Queued for payment  ·  Pushed to NetSuite automatically
TechStream Services Inc. — INV-2847
$12,400✓ Matched — Auto-Approved
PO Amount$12,400✓ received 100%$12,400 invoiced
✓ Queued for payment  ·  Pushed to SAP automatically
Acme Supplies LLC — INV-4476
$5,600⚠ Flagged — Possible Duplicate
Prior PaymentINV-4461$5,600Paid 3 wks ago
Possible duplicate — same vendor, same amount as INV-4461 paid January 8th. Holding for AP manager review.
▶ Routed to: AP Manager  ·  Vendor notified automatically
Pinnacle Logistics Co. — INV-7734
$10,200✓ Matched — Auto-Approved
PO Amount$10,200✓ received 100%$10,200 invoiced
✓ Queued for payment  ·  Pushed to QuickBooks automatically
Cornerstone Industrial — INV-0552
$6,300✓ Matched — Auto-Approved
PO Amount$6,300✓ received 100%$6,300 invoiced
✓ Queued for payment  ·  Pushed to Bill.com automatically
What gets routed to a human — and why
Only 2 of 6 invoices need human attention this week. Both came with full context — the variance amount, the relevant PO, the prior payment record — already attached. Your AP team and CFO spend 10 minutes, not 4 hours.
Price variance — Invoice exceeds PO
Hold
INV-4473 from Acme Supplies is $2,400 over the approved PO amount. Goods receipt is also partial — only 80% of the order was confirmed received. Neither condition alone would clear for payment, and both are present here.
Do not pay until Acme provides a valid change order or the PO is amended.
▶ Routed to: CFO  ·  Vendor auto-notified  ·  AP record updated
Possible duplicate payment
Hold
INV-4476 from Acme Supplies matches INV-4461 exactly — same vendor, same amount, no new PO reference. INV-4461 was paid on January 8th. This is either a resubmission or a billing error.
Hold for AP Manager confirmation before any action.
▶ Routed to: AP Manager  ·  Prior payment record attached
4 invoices auto-approved — no action needed
Cleared
Midwest, TechStream, Pinnacle, and Cornerstone invoices all matched their POs exactly, with full goods receipts confirmed. All four were pushed directly to the payment queue in the respective ERP systems.
$37,650 queued for payment. No human review required.
✓ Pushed to SAP, NetSuite, QuickBooks, Bill.com
How exception routing works
Note
Every exception is routed based on rules you define — price variances over a threshold go to the CFO, duplicate checks go to the AP manager, missing POs go to the department head. Every routing includes the full match detail, not just a flag.
Routing rules are fully configurable per your approval policy.
The AI sends the weekly AP summary to your CFO and AP manager
After every batch run, the AI drafts and sends a summary covering what was auto-approved, what was held, and what needs action. Your leadership team sees the full picture in one email, not a spreadsheet.
How it works

Three steps. Fully automated.

From invoice received to ERP updated — clean ones paid automatically, exceptions routed with full context.

📤
Step 1
Invoice arrives — email, portal, or EDI
The agent watches your AP inbox and ERP system. Invoices from Outlook, vendor portals, or EDI feeds are picked up automatically. It then pulls the matching PO and goods receipt directly from SAP, NetSuite, QuickBooks, Bill.com, or Tipalti.
Orchestrated by n8n or Make.com — the automation layer that connects your inbox and ERP to the AI.
n8n Make.com
🤖
Step 2
AI matches all three documents and flags any variance
Claude AI compares PO price and quantity, goods receipt confirmation, and invoice amount line by line. It checks for price variances, quantity mismatches, partial receipts, and duplicate submissions — and calculates the variance in dollars.
Replaces manual AP matching — the task that takes 40% of your AP team’s week.
Claude AI
Step 3
Clean invoices pay. Exceptions route to the right person.
Matched invoices are pushed directly to the payment queue in your ERP — SAP, NetSuite, Bill.com, or Tipalti. Exceptions are routed to the CFO or AP manager in Outlook with the full variance detail attached — no one has to go digging.
Routing thresholds are fully configurable — you define what goes to whom at what dollar amount.
Outlook Gmail
What this replaces

AP automation platforms charge $20k–$60k/yr.
Or you build it once and own it.

Here’s what finance teams are spending on AP automation today — and what Omni builds for you instead.

Tipalti / Bill.com Current
$20k–$60k
per year · subscription
AP automation built in
Good for high-volume payments
Locked to their payment rails
Limited ERP flexibility
You rent it forever
SAP / Oracle built-in Current
Manual
already licensed · still needs humans
Already in your ERP
No extra license cost
Still requires manual review
No intelligent exception routing
No duplicate detection AI
Your AP team (manual) Current
4 hrs/day
per AP clerk · every week
Understands vendor relationships
Can make judgment calls
40% of day on matching alone
Fatigue = missed duplicates
No audit trail
Omni AI Agent What we build
You own it
one-time build · no annual fees
Connects to your existing ERP
Auto-approves clean invoices
Flags every discrepancy before payment
Routes exceptions with full context
You own it — not a subscription
Demo Notice: Conceptual demonstration of an AI-powered AP 3-way match workflow. All vendor names, invoice numbers, and amounts are illustrative. Omni Online Strategies builds custom AI automation systems integrated with your existing ERP and payment infrastructure.
Josh Leavitt — Founder, Omni Online Strategies
From the founder
“Every finance team I’ve talked to is already in SAP or NetSuite. The 3-way match capability is right there — it just still requires someone to sit there and do it. That’s what we replace.”
We don’t ask you to switch ERPs or adopt a new payment platform. We build the AI layer on top of what you already have — connecting your inbox, your ERP, and your approval workflow into one automated pipeline. Your AP team stops doing data entry and starts doing actual finance work.
Josh Leavitt
Founder & CEO · Omni Online Strategies

Let’s talk about your AP workflow →