AI extracts invoice data from emails, validates against purchase orders, and sends confirmation or discrepancy notifications — no manual data entry required.
Finance teams manually process hundreds of invoice emails per month — opening attachments, keying data into spreadsheets, cross-referencing purchase orders, and chasing discrepancies. This manual cycle causes payment delays, duplicate payments, and strained vendor relationships. The busier the month-end close, the more errors creep in.
MultiMail's AI agent monitors your AP mailbox, extracts structured data from invoice emails and attachments, validates line items against your purchase orders, and sends automated confirmations or discrepancy notifications. With monitored oversight, the agent processes invoices autonomously while your finance team maintains full visibility.
Your AI agent watches the accounts payable mailbox for new invoice emails. MultiMail captures the email body and any attachments (PDF invoices, CSV line items) for processing.
The agent parses the email content and downloads attachments via MultiMail's attachment API. It extracts key fields: vendor name, invoice number, line items, amounts, due date, and payment terms.
Extracted data is cross-referenced against your PO database. The agent checks for matching PO numbers, correct quantities, price discrepancies, and duplicate invoice numbers.
For matching invoices, the agent sends a confirmation to the vendor and routes the invoice to your payment queue. For discrepancies, it sends a detailed notification to the vendor and alerts your AP team.
Every processed invoice is tagged with its status (confirmed, discrepancy, duplicate, missing-po) and logged for audit purposes. Your team can review the full processing history at any time.
import requests
API = "https://api.multimail.dev/v1"
HEADERS = {"Authorization": "Bearer mm_live_xxx"}
"cm"># Check AP mailbox for new invoices
inbox = requests.get(
f"{API}/mailboxes/{AP_MAILBOX_ID}/inbox",
headers=HEADERS,
params={"status": "unread", "limit": 30}
).json()
for msg in inbox["emails"]:
email = requests.get(
f"{API}/emails/{msg[&"cm">#039;id']}", headers=HEADERS
).json()
# Download PDF attachment if present
for attachment in email.get("attachments", []):
if attachment["content_type"] == "application/pdf":
pdf_data = requests.get(
f"{API}/emails/{email[&"cm">#039;id']}/attachments/{attachment['id']}",
headers=HEADERS
).content
# Extract invoice fields using your AI model
invoice = extract_invoice_data(email["text_body"], pdf_data)
# Returns: {vendor, invoice_number, po_number, line_items, total, due_date}
print(f"Invoice {invoice[&"cm">#039;invoice_number']} from {invoice['vendor']}: ${invoice['total']}")Poll the accounts payable mailbox for new invoice emails and extract structured data from the content.
import requests
API = "https://api.multimail.dev/v1"
HEADERS = {"Authorization": "Bearer mm_live_xxx"}
def process_invoice(email: dict, invoice: dict):
po = lookup_purchase_order(invoice["po_number"])
if not po:
"cm"># No matching PO — flag and notify
requests.post(f"{API}/reply", headers=HEADERS, json={
"in_reply_to": email["id"],
"text_body": (
f"Thank you for invoice {invoice[&"cm">#039;invoice_number']}. "
f"We could not locate a matching purchase order for "
f"PO"cm"># {invoice['po_number']}. Please verify the PO "
f"number and resubmit or contact our AP team."
)
})
tag_invoice(email["id"], "missing-po")
return
discrepancies = validate_line_items(invoice["line_items"], po)
if discrepancies:
# Send discrepancy details to vendor
detail = "\n".join(
f"- {d[&"cm">#039;item']}: invoiced ${d['invoiced']} vs PO ${d['expected']}"
for d in discrepancies
)
requests.post(f"{API}/reply", headers=HEADERS, json={
"in_reply_to": email["id"],
"text_body": (
f"Invoice {invoice[&"cm">#039;invoice_number']} has discrepancies "
f"against PO"cm"># {invoice['po_number']}:\n\n{detail}\n\n"
f"Please review and resubmit a corrected invoice."
)
})
tag_invoice(email["id"], "discrepancy")
else:
# Confirmed — send receipt and queue for payment
requests.post(f"{API}/reply", headers=HEADERS, json={
"in_reply_to": email["id"],
"text_body": (
f"Invoice {invoice[&"cm">#039;invoice_number']} for ${invoice['total']} "
f"has been validated against PO"cm"># {invoice['po_number']} and "
f"queued for payment by {invoice[&"cm">#039;due_date']}."
)
})
tag_invoice(email["id"], "confirmed")Cross-reference extracted invoice data against purchase orders and send confirmation or discrepancy emails.
"cm">// Invoice processing agent using MultiMail MCP tools
async function processInvoices() {
const inbox = await mcp.check_inbox({
mailbox_id: "ap-mailbox-id",
status: "unread"
});
for (const msg of inbox.emails) {
const email = await mcp.read_email({ email_id: msg.id });
"cm">// Download and parse invoice attachment
const attachment = email.attachments?.find(
(a: any) => a.content_type === "application/pdf"
);
let invoiceData;
if (attachment) {
const pdf = await mcp.download_attachment({
email_id: email.id,
attachment_id: attachment.id
});
invoiceData = await extractInvoiceFromPDF(pdf);
} else {
invoiceData = await extractInvoiceFromText(email.text_body);
}
"cm">// Validate against PO database
const validation = await validateAgainstPO(invoiceData);
"cm">// Tag with processing status
await mcp.tag_email({
email_id: email.id,
tags: ["invoice", `status:${validation.status}`, `vendor:${invoiceData.vendor}`]
});
"cm">// Send appropriate response (auto-sends under monitored mode)
await mcp.reply_email({
email_id: email.id,
text_body: validation.status === "confirmed"
? `Invoice ${invoiceData.invoice_number} validated and queued for payment.`
: `Invoice ${invoiceData.invoice_number} requires review: ${validation.reason}`
});
}
}Process invoices using MultiMail MCP tools for a cleaner integration in AI agent frameworks.
AI extracts vendor, amounts, line items, and PO numbers automatically from emails and PDF attachments. No more copying data from invoices into spreadsheets.
Automated validation against purchase orders catches price mismatches, quantity errors, and duplicate invoices before they enter your payment queue.
Validated invoices are confirmed and queued for payment within minutes of arrival. Vendors get faster confirmations, and your team avoids late payment penalties.
Confirmation emails, discrepancy notifications, and missing PO alerts are sent automatically. Vendors stay informed without your AP team composing individual emails.
Every invoice is tagged with its processing status, validation results, and communication history. Month-end reconciliation and audits become straightforward.
Email infrastructure built for AI agents. Verifiable identity, graduated oversight, and a 38-tool MCP server. Formally verified in Lean 4.