Skip to content
ParsedMail

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

From: Billing <[email protected]> Subject: Invoice HP-20931 from Harbor Paper Co. Attachment: HP-20931.pdf (1 page) Hello, Please find attached invoice HP-20931 for your PO 7741. Invoice date: October 9, 2026 Due date: November 8, 2026 (Net 30) 40 x Copy paper A4, 5 ream case @ $31.20 = $1,248.00 6 x Toner cartridge TK-580 @ $64.00 = $384.00 Subtotal: $1,632.00 Sales tax (8.25%): $134.64 Total due: $1,766.64 Thank you, Harbor Paper Co. billing team

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

  1. 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.
  2. 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.
  3. Deliver. The JSON is posted to your webhook with a signature header, or you fetch it from the email parsing API.
  4. 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:

FieldTypeNote
vendor_namestringUsed to match the vendor record
invoice_numberstringKeeps leading zeros and letters
invoice_date, due_datedateAlways YYYY-MM-DD, whatever the source format
currencyenumOptions such as USD, EUR, GBP, CAD
line_itemstableDescription, quantity, unit price, amount
tax, totalmoney{"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_items array.
  • 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 null with 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_sender and 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?

Yes. PDFs with a text layer are read on every plan. Scanned PDFs and photos are read as images on paid plans. Up to 8 files per email are read, and each PDF page counts as one page on your plan.

Do I need a template for every supplier?

No. One schema covers all suppliers. The model reads meaning rather than positions, so a new vendor or a redesigned invoice works without setup.

Can it post bills straight into QuickBooks or Xero?

ParsedMail delivers JSON to a webhook. Zapier, Make or n8n then create the bill using their own QuickBooks, Xero or NetSuite steps. There is no native ParsedMail app in those marketplaces, the built-in webhook trigger is used.

What happens when a total looks wrong?

Every field has a confidence score. On Growth and Scale, emails under your threshold wait in the review queue. A reviewer fixes the value, and the corrected value is what the webhook and API return.

Are invoices used to train models?

No. Raw emails are kept for the retention period of your plan, from 30 days on Starter to configurable or zero retention on Scale, and are never used for model training.

Related

See your own email as JSON

Paste one into the demo, describe the fields and look at the result. No account needed.