Invoice email parser
An invoice email parser reads each supplier invoice that arrives by email, including the PDF attachment, and returns the vendor, invoice number, dates, line items, tax and total as typed JSON. ParsedMail sends that JSON to a webhook, Zapier, Make or n8n, so a draft bill appears in QuickBooks, Xero or NetSuite without retyping.
Email received
Fields described as
vendor name, invoice number, invoice date, due date, PO number, line items with description, quantity, unit price and amount, tax, total
JSON delivered to your webhook
{ "vendor_name": "Harbor Paper Co.", 0.98 "invoice_number": "HP-20931", 0.99 "invoice_date": "2026-10-09", 0.97 "due_date": "2026-11-08", 0.96 "po_number": "7741", 0.93 "line_items": [ { "description": "Copy paper A4, 5 ream case", "quantity": 40, "unit_price": { "amount": 31.2, "currency": "USD" }, "amount": { "amount": 1248, "currency": "USD" } }, { "description": "Toner cartridge TK-580", "quantity": 6, "unit_price": { "amount": 64, "currency": "USD" }, "amount": { "amount": 384, "currency": "USD" } } ], 0.95 "tax": { "amount": 134.64, "currency": "USD" }, 0.96 "total": { "amount": 1766.64, "currency": "USD" } 0.99 }
Why invoice email still eats accounts payable time
Most suppliers send invoices by email. Some put every number in the body, some attach a PDF with a text layer, some attach a scan, and a few send an HTML table with a pay link. Each layout names the same values differently: Amount due, Balance, Total incl. tax. Someone on the finance team opens each message, finds the numbers and types them into the accounting system.
Template parsers help until the next supplier, or until a known supplier changes its invoice design. ParsedMail reads the email and its attachments against one schema that you describe once, so a new vendor does not need new setup. The same approach works for order emails sent to your ERP and for any other document that arrives in a mailbox.
The workflow from inbox to accounting system
- Forward. Keep your existing ap@ or invoices@ address and add a forwarding rule to the ParsedMail inbox. Plus tags keep entities apart on one inbox, for example
[email protected]and[email protected]. On Scale you can receive on your own domain through an MX record. - Parse. The model reads the body and up to 8 attachments per email. PDFs with a text layer are read as text on every plan, scanned PDFs and photos of paper invoices are read as images on paid plans.
- Deliver. The JSON is posted to your webhook with a signature header, or you fetch it from the email parsing API.
- Book. An automation looks up the vendor and creates a bill with the line items, dates and PO reference.
Designing an invoice schema that matches your ledger
Describe only what the bill needs. A typical accounts payable schema has 8 to 15 fields:
| Field | Type | Note |
|---|---|---|
| vendor_name | string | Used to match the vendor record |
| invoice_number | string | Keeps leading zeros and letters |
| invoice_date, due_date | date | Always YYYY-MM-DD, whatever the source format |
| currency | enum | Options such as USD, EUR, GBP, CAD |
| line_items | table | Description, quantity, unit price, amount |
| tax, total | money | {"amount": 1766.64, "currency": "USD"} |
Money fields keep the currency next to the amount, which matters when the same vendor bills in two currencies. Mark the fields you cannot post without, usually invoice number, total and due date, as required. Schemas are versioned, and each change increments the version, so older invoices keep the shape they were parsed with.
Sending invoices to QuickBooks, Xero and NetSuite
ParsedMail does not post to the ledger itself. It hands clean JSON to the tool you already trust with that step:
- QuickBooks Online. In Zapier, a Catch Hook trigger followed by a Find Vendor step and a Create Bill step. Line items map from the
line_itemsarray. - Xero. In Make, a Custom webhook module followed by Create a bill (accounts payable invoice), with an iterator over the line items.
- NetSuite. In n8n or your own service, a Webhook node followed by an HTTP request to create a vendor bill record, often in a pending approval state.
Setup for each tool is covered on the integrations page. Because every delivery carries an Idempotency-Key, a retried webhook does not create a second bill if your automation stores that key.
Duplicates, low confidence and other edge cases
Accounts payable has a short list of failure modes, and each one has a mechanism:
- The same invoice sent twice. A resend with the same Message-ID, or the same sender, subject and body within 30 days, is marked
duplicate, not parsed and not charged. - A blurry scan. Each field carries a confidence score from 0 to 1. On Growth and Scale, an email under the inbox threshold (0.80 by default) goes to the review queue, where a reviewer corrects the total next to the original PDF and approves it.
- A missing due date. Missing values come back as
nullwith a warning, never as a guess, and a missing required field sends the email to review. - Statements and reminders. With classification on Growth and Scale, one inbox can hold an invoice schema and a statement schema, and the model picks one per email.
- Spam to a public address. Allowed senders limit the inbox to your vendors, other mail is logged as
blocked_senderand not counted.
What invoice parsing costs on each plan
Plans count emails and attachment pages. A one-page PDF invoice is one email and one page. Starter at $49 a month covers 1,000 emails and 300 pages, which suits a team handling a few hundred PDF invoices a month. Growth at $149 adds the review queue and classification, which most finance teams want before anything is posted automatically. Annual billing halves the monthly price. Details are on the pricing page, and a longer walkthrough is in the guide to extracting invoice data from email.
Frequently asked questions
Does the invoice parser read PDF attachments?
Do I need a template for every supplier?
Can it post bills straight into QuickBooks or Xero?
What happens when a total looks wrong?
Are invoices used to train models?
Related
See your own email as JSON
Paste one into the demo, describe the fields and look at the result. No account needed.