Invoice to Excel: Invoice & Receipt OCR with AI
Pricing
from $100.00 / 1,000 document processeds
Invoice to Excel: Invoice & Receipt OCR with AI
Turn PDF, image, Excel or Word invoices and receipts into one Excel/CSV row each: date, seller, tax/VAT ID, subtotal, VAT, total and currency. Missing fields and total mismatches are flagged, never guessed. Free preview, then pay per document.
Pricing
from $100.00 / 1,000 document processeds
Rating
0.0
(0)
Developer
Turgay NANTA
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Share
Invoice to Excel: AI Invoice and Receipt OCR to Excel, CSV and PDF
Typing supplier invoices and receipts into a spreadsheet is slow and error-prone, and most invoice tools want a monthly subscription before you have processed a single document.
Send your invoices and receipts as PDF, image, Excel, Word or text. The Actor reads each one with an AI vision model and returns one clean row per document: invoice date (also split into year, month and day), seller, seller tax or VAT ID, subtotal, VAT or tax, grand total and currency, plus a confidence flag that tells you which rows to double-check. You get the table in the dataset and, if you want, as an Excel file, a CSV, a PDF report or an HTML report.
- Many file types: PDF, PNG, JPG, WEBP, GIF, Excel (.xlsx), Word (.docx), and plain text, CSV or HTML.
- Seller, not buyer: the extraction rules tell the model to take the party that issued the invoice, even when the buyer is printed at the top.
- Never guesses: a field the model cannot see stays empty and the row is marked Low confidence with the reason.
- Checks the math: if subtotal plus VAT does not match the total, the row is flagged.
- Free preview first: by default the Actor only counts your documents and pages. Nothing is processed or charged until you switch on Process.
- Pay per document: $0.10 per processed document. No subscription. Documents that fail are not charged.
At a glance
| Input | Files as base64 (files) or pasted invoice text (texts) |
| Output | One row per document in the dataset, plus optional Excel, CSV, PDF and HTML files |
| Columns | Document, Date, Year, Month, Day, Seller, Tax ID, Subtotal, VAT/Tax, Total, Currency, Confidence, Note |
| Quality checks | Missing date, total or tax ID; tax ID length; subtotal + VAT vs. total |
| Languages | Reads invoices in any language the model understands; labels in English, Turkish, German, Spanish or French |
| Model | Anthropic Claude vision model; the default is the stronger one |
| Pricing | $0.10 per processed document; preview is free. See Pricing |
| Runs on | Apify Console, API, schedules, n8n, Make, Zapier, AI agents via MCP |
Quick start
- Click Start with the default input. The Actor loads a built-in sample invoice and returns a free preview (document and page count). Nothing is charged.
- Tick Process (incurs charges) and start again. The sample invoice is extracted for $0.10 plus the $0.0001 start fee.
- Replace the sample with your own documents in Invoice files (see Input) and choose an output format, for example Excel (.xlsx).
- Open the Dataset tab for the table, and the Key-value store tab for
INVOICE_TABLE.xlsxand the other files.
What the result looks like
The built-in sample is a short text invoice. Processed, it gives this row:
| Document | Date | Year | Month | Day | Seller | Tax ID | Subtotal | VAT/Tax | Total | Currency | Confidence | Note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| text-1 | 2026-06-29 | 2026 | 6 | 29 | ABC Ltd | 1234567890 | 1000 | 200 | 1200 | USD | High | - |
A scanned receipt without a readable tax number would come back like this, so you know exactly what to check:
| Document | Date | Seller | Tax ID | Total | Currency | Confidence | Note |
|---|---|---|---|---|---|---|---|
| receipt-0412.jpg | 2026-04-12 | Corner Cafe | - | 18.4 | EUR | Low | missing: vendor_tax_id |
The second row is an illustration of the format; your run reports what it finds in your documents. Empty values are shown as a dash.
Why people use it
Generic OCR turns a page into text, and you still have to find the total, the date and the seller yourself. This Actor goes straight to the fields a bookkeeper types in, and it is honest about what it could not read.
- Fields, not text. Each document becomes one row with the columns an expense sheet or bookkeeping import needs.
- Seller and buyer are kept apart. The instructions tell the model which party issued the invoice, including layouts where the customer block is printed first.
- No invented values. The model is told to return nothing for a field it cannot see. Missing critical fields are listed in the Note column.
- Arithmetic check. Subtotal plus VAT is compared with the total; a gap above 1% is flagged as
total mismatch. - Date safety net. If the model leaves the date empty, the Actor looks for a labelled date such as "Invoice Date: 01. 06. 2026" in the document text and uses it.
- Numbers you can add up. European (
1.234,56) and US (1,234.56) formats are both converted to real numbers. In the Excel file amounts stay numeric, with thousands separators for display.
OCR tool vs. this Actor
| Plain OCR | This Actor | |
|---|---|---|
| Output | Page text | One row per invoice with named columns |
| Seller vs. buyer | Not handled | Explicit rule, seller only |
| Unreadable field | Silent gap or wrong text | Empty field plus a Low-confidence note |
| Total check | No | Subtotal + VAT vs. total |
| Excel and CSV files | Separate step | Built in |
| Cost before you commit | Varies | Free preview, then per document |
Use cases
Bookkeepers and accountants
Collect a client's monthly supplier invoices, run them in one batch and paste the Excel table into your working file. Sort by Confidence and review only the Low rows.
Small business owners and freelancers
Turn a folder of receipts and supplier bills into an expense sheet before the tax deadline. The Year and Month columns make monthly totals a simple pivot.
Accounts payable teams
Pre-fill invoice registers from incoming PDFs. The Tax ID and Total columns give you what you need to match an invoice to a supplier and a payment.
E-commerce sellers
Keep track of supplier and freight invoices from several countries in one sheet. The Currency column keeps totals in different currencies apart.
Employees and managers handling expense reports
Photograph receipts, send the images, and get date, merchant and total as rows instead of typing them.
Developers and automation builders
Add invoice extraction to a workflow: an email attachment or a cloud folder feeds the Actor, and the rows go to a database, an accounting import or a sheet.
Teams working with Turkish e-invoices
The extraction rules cover e-Fatura layouts where the customer appears under the "SAYIN" heading at the top, and Turkish number and date formats are parsed.
How it works
- Load. Each file is decoded from base64 and its type is detected from the file signature and extension: PDF, image, Excel, Word or text.
- Preview (free). The Actor counts documents and PDF pages and stores a
PREVIEWrecord with a short text sample. If Process is off, the run stops here with no charge. - Extract. With Process on, each document is sent to an Anthropic Claude model: PDFs and images directly to the vision model, Excel and Word as their extracted text, text as it is. The model returns a fixed JSON structure.
- Normalise. Dates become
YYYY-MM-DD, amounts become numbers, the currency becomes a code (symbols such as $, €, £ and ₺ are recognised), and the tax ID keeps only letters and digits. - Check. Missing date, total or tax ID, a tax ID outside 8-15 characters, and a subtotal + VAT that does not match the total are flagged.
- Fallback. A missing date is searched for as a labelled date in the document text.
- Output. One dataset row per document, the chosen extra files in the key-value store, and a
REPORTrecord with counts. - Charge. Only documents that were actually extracted are charged.
If a document cannot be processed (for example the model response is cut off or unreadable), it still gets its own row with Confidence Low and the reason in the Note column, and it is not charged.
Input
| Field | Type | Default | Description |
|---|---|---|---|
files | array | [] | Documents as {"name": "...", "data": "..."}. data is base64 or a data URI. The name's extension helps type detection. |
texts | array | one sample invoice | Invoice text pasted directly, for example OCR output. Each string is one document. |
output_format | select | Excel (.xlsx) | Extra file besides the dataset: Table only (tablo), Excel (excel), CSV (csv), PDF Report (pdf), HTML Report (rapor), All (hepsi). |
language | select | English | Language for labels the model writes. Field values are always copied from the document as printed. |
model | select | claude-sonnet-4-6 | The stronger default, or claude-haiku-4-5-20251001 for simple, standard invoices. The price per document is the same. |
process | boolean | false | Off: free preview only. On: extract and charge per processed document. |
Remove the sample from texts (or leave the field empty) when you send your own files, otherwise the sample is processed and charged as one more document.
Example: two files
{"files": [{"name": "supplier-march.pdf", "data": "JVBERi0xLjcKJ..."},{"name": "receipt-0412.jpg", "data": "data:image/jpeg;base64,/9j/4AAQSk..."}],"texts": [],"output_format": "excel","process": true}
Example: encode a folder in Python and run
import base64, pathlibfrom apify_client import ApifyClientfiles = [{"name": p.name, "data": base64.b64encode(p.read_bytes()).decode()}for p in pathlib.Path("invoices").iterdir() if p.is_file()]client = ApifyClient("YOUR_TOKEN")run = client.actor("enezli/invoice-to-excel").call(run_input={"files": files, "texts": [], "output_format": "hepsi", "process": True})store = client.key_value_store(run["defaultKeyValueStoreId"])pathlib.Path("invoices.xlsx").write_bytes(store.get_record("INVOICE_TABLE.xlsx")["value"])
Run it once with "process": False first to see the document and page count in PREVIEW before you pay.
Output
Dataset: one row per document
| Column | Content |
|---|---|
Document | File name, or text-1, text-2 for pasted text |
Date | Invoice date as YYYY-MM-DD, or a dash when not found |
Year, Month, Day | The date split into numbers, handy for pivots |
Seller | The party that issued the invoice |
Tax ID | Seller tax, VAT or registration number, letters and digits only |
Subtotal, VAT/Tax, Total | Numbers as printed, converted to numeric values |
Currency | Currency code, for example USD, EUR, GBP, TRY |
Confidence | High, or Low when any check failed |
Note | Why a row is Low, for example missing: vendor_tax_id, tax id length, total mismatch, truncated response, processing error |
Key-value store files
| Key | When | Content |
|---|---|---|
INVOICE_TABLE.xlsx | Excel or All | Styled sheet, numeric amount columns, frozen header |
INVOICE_TABLE.csv | CSV or All | UTF-8 with BOM so Excel opens accents correctly; comma separated; amounts written with thousands separators |
INVOICE_REPORT.pdf | PDF Report or All | Landscape A4 table |
INVOICE_REPORT.html | HTML Report or All | Self-contained report with confidence badges and a count of rows to review |
REPORT | Always when processing | total_documents, processed, unparsed, low_confidence, high_confidence, language |
PREVIEW | Always | document_count, estimated_pages, sample_text |
Pricing
This Actor charges per event. Current prices are on the Pricing tab; at the time of writing:
| Event | When | Price |
|---|---|---|
actor-start | Once per run, only when Process is on | $0.0001 |
documents-processed | Per document successfully extracted | $0.10 |
The preview is free: a run with Process off charges nothing. Documents that fail are not charged.
| Documents in one run | Cost |
|---|---|
| 1 | $0.1001 |
| 10 | $1.0001 |
| 50 | $5.0001 |
| 100 | $10.0001 |
A monthly routine: 4 weekly runs of 25 invoices = 4 x $2.5001 = $10.0004 for 100 invoices a month.
The model choice does not change the price. The Excel, CSV, PDF and HTML files are included.
Worked example: month-end supplier invoices
A small workshop receives about 40 supplier invoices a month as PDFs and phone photos.
- Preview. The owner sends all 40 files with Process off.
PREVIEWshows 40 documents and 52 pages, so every file was read. Cost: nothing. - Process. Same input with Process on and All as output format. Cost: 40 x $0.10 + $0.0001 = $4.0001.
- Review.
REPORTshows 36 High and 4 Low rows. The Note column says two receipts had no tax number, one invoice had a total mismatch because of a discount line, and one photo was cut off. - Fix. The cut-off photo is taken again and sent in a new run for $0.1001. The other three are checked against the paper copies.
- Book. The Excel file goes to the accountant; the Year and Month columns give the monthly VAT total with one pivot.
The numbers in this example are illustrative; your own run reports its own counts.
Review checklist for Low rows
-
missing: invoice_date: find the date on the document and type it in -
missing: vendor_tax_id: common on small receipts; decide whether your bookkeeping needs it -
tax id length: compare the number with the document; a character may be misread -
total mismatch: look for discounts, shipping lines or several VAT rates -
truncated response,parse:orprocessing error: send the file again (not charged the first time)
Integrations
API
curl -X POST "https://api.apify.com/v2/acts/enezli~invoice-to-excel/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"texts":["INVOICE Date: 2026-06-29 Seller: ABC Ltd Tax ID: 1234567890 Total: 1,200.00 USD"],"process":true,"output_format":"tablo"}'
JavaScript
import { ApifyClient } from 'apify-client';import { readFileSync } from 'node:fs';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const data = readFileSync('invoice.pdf').toString('base64');const run = await client.actor('enezli/invoice-to-excel').call({files: [{ name: 'invoice.pdf', data }], texts: [], process: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
n8n, Make, Zapier
A typical flow: a new email attachment or a new file in a cloud folder, convert the file to base64, run the Actor with process on, then append the dataset rows to Google Sheets, Airtable or your accounting import. Rows with Confidence = Low can be routed to a person for review.
Schedules
If invoices arrive in a shared folder, a scheduled workflow can collect the week's files and send them to the Actor in one run, so the Excel file is ready every Monday.
AI agents (MCP)
Through the Apify MCP server, an assistant can pass invoice text or files to the Actor and read back the structured rows.
Tips for better results
- Start with the preview. It confirms the Actor could read every file and shows how many pages you sent.
- Send clear images. Straight, well-lit photos with the whole invoice in frame give the best results.
- Name files meaningfully. The file name becomes the
Documentcolumn, which makes review easier. - Keep one invoice per file. Each file becomes one row.
- Clear the sample text in
textswhen you send your own files. - Review Low rows only. The Note column tells you what to check.
- Use the default model for invoices with complex layouts or two company blocks.
Limitations
- One row per document. A PDF that contains several invoices is read as one document. Split it first.
- Header fields only. The output covers date, seller, tax ID, subtotal, VAT, total and currency. Line items are not included in the table or files.
- Buyer details are not extracted. Only the seller is returned.
- Images: PNG, JPG, WEBP and GIF are supported. Convert TIFF or BMP to PNG or JPG first.
- Input size: documents travel inside the run input as base64, which has a size limit on Apify. Send large batches in several runs.
- Scanned PDFs: the date fallback needs a PDF with a text layer; the main extraction also works on scanned PDFs through the vision model.
- Confidence is rule-based. A High row passed the checks above; it is still worth spot-checking amounts for important payments.
- Currency symbols. A lone
$is read as USD. If you handle CAD, AUD or other dollar currencies, check the Currency column.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Only a row saying "PREVIEW: ... Turn on 'process'" | Process is off | Tick Process (incurs charges) and run again |
| "No valid document uploaded" | files and texts are both empty | Add files or text |
| One extra document was processed | The sample invoice was still in texts | Empty texts when you send files |
A row with processing error | The file could not be processed, for example an unsupported image format such as TIFF or BMP | Convert to PDF, PNG or JPG and run that file again; it was not charged |
truncated response or parse: in Note | The model's answer was cut off or unreadable | Run the file again, or try the default model; it was not charged |
total mismatch | Subtotal + VAT differs from the total, for example because of discounts or several tax rates | Check the document; the row keeps the values as printed |
| Seller shows the buyer's name | Unusual layout | Use the default model; if it persists, check the row manually |
FAQ
Do I need an Anthropic or OpenAI key? No. The model call runs inside the Actor. You only need an Apify account.
Which languages can the invoices be in?
Any language the model reads. Values are copied as printed; the language setting only affects labels the model writes.
Is my data stored or shared? Documents are sent to Anthropic's API only to extract the fields. Results are stored in your own Apify storage (dataset and key-value store).
What happens with a blurry photo? Fields the model cannot read stay empty and the row is marked Low with the reason. Nothing is guessed.
Can I get line items? Not in the current output. Each row holds the document's header fields and totals.
Can I process hundreds of invoices? Yes, in several runs to stay within the input size limit. Each run returns its own Excel file.
Why is a row Low when everything looks right? Usually the tax ID is missing or outside 8-15 characters, or subtotal plus VAT differs from the total by more than 1%. The Note column names the reason.
Is the preview really free? Yes. With Process off, the run only counts documents and pages and charges nothing.
Can I choose the output language of the Excel headers?
Column headers are always English so imports stay stable. The language setting applies to text the model writes.
How are amounts formatted?
In the dataset and Excel they are numbers. The CSV and the PDF and HTML reports show them with thousands separators, for example 1,200.00.
Can an AI agent use it? Yes, through the Apify MCP server. With Process off by default, an agent can preview safely before any charge.
Trademarks
This Actor is not affiliated with, endorsed by, or connected to Microsoft, Anthropic or any accounting software vendor. Excel is a trademark of Microsoft Corporation. All product names are trademarks of their respective owners.