DualEntry extracts structured data from bills, receipts, and invoices you upload as PDFs or images. You drop files onto a transaction list, review the extracted data against the original document, correct any errors, and post the resulting draft.
Uploading documents
OCR runs from the transaction list for the record you want to create. Open Money Out → Bills or Money Out → Direct Expenses and drag your files onto the list, or use the new-record menu in the toolbar to browse for them. You can also send a PDF, PNG, or JPG as a copilot chat attachment and ask it to process the document.
The drag-and-drop area accepts PDF, PNG, or JPG. The new-record menu’s browse picker takes a broader set: PDF, PNG, JPG, CSV, XLS, XLSX, DOC, DOCX, and TXT, up to 50 MB per file.
Each file becomes its own extraction task with its own status, so a batch of files does not wait on its slowest member. Tasks move through pending, processing, and then completed or failed, and a failure on one document leaves the rest of the batch unaffected.
OCR is behind a feature flag. If the drag-and-drop area and the new-record menu do not appear on the Bills or Direct Expenses list, the flag is off for your organization rather than something being wrong with your permissions. Contact support to have it enabled.
The extraction engine reads each document and pulls the following fields:
- Header data: vendor name, invoice number, invoice date, due date, payment terms, and currency
- Line items: description, quantity, unit price, and line amount for each item on the document
- Totals: subtotal, tax amount, and grand total
Extraction runs as its own task with a visible status, moving from pending to processing and finishing as either completed or failed. A failed task leaves the file in place so you can retry it or fall back to entering the record by hand; it does not create a partial draft.
DualEntry matches the extracted vendor name against your existing vendor records using fuzzy matching, so it handles common abbreviations such as “Corp” against “Corporation” as well as minor spelling variations.
The top match has to score at least 0.6 to be considered at all, and it has to beat the runner-up by at least 0.1 or DualEntry declines to guess and leaves the vendor for you to pick. A single candidate skips that comparison but still has to clear the floor. DualEntry also holds back when one word in the name matches closely but another doesn’t. For example, “Visa USA” against “VISA DPS” scores well on the whole, but the mismatched second word prevents auto-assignment.
Extraction produces a draft record. Starting from the Bills or Direct Expenses list produces a matching bill or direct expense draft. Sending a document through copilot chat can also produce a draft invoice, since that path isn’t tied to any list. Open the draft and review the extracted fields against the source document before posting.
Review each field against the original. Select any field to edit it directly, and post the draft once it matches the document.
Nothing posts automatically, so an extraction error that survives review is the one that reaches your ledger. Treat the review as the control rather than a formality, and pay particular attention to the totals and the vendor, since those are the two fields a downstream reader is least likely to question.
Amounts and dates are worth checking against the document even when they look plausible, because a confidently wrong number reads exactly like a correct one once the draft is posted.
Automated categorization runs on OCR-generated drafts. After extraction, DualEntry suggests GL accounts and dimensions for each line item based on your rules and learned patterns.
Posting or routing for approval
An extracted draft is an ordinary draft record, so it follows the same path as one you keyed in by hand. Post it to put it in the ledger, or send it through your approval workflow if the record type is configured for approval. A drafted bill enters accounts payable on posting; a drafted invoice enters accounts receivable.
Drafts you do not act on stay in the list they were created in, on the drafts view for that record type, and there is no separate OCR queue to drain. That is worth knowing because nothing chases you about them: an extracted draft left alone is invisible unless you filter for drafts.
Archive the drafts you decide not to use rather than leaving them. Archiving keeps the record and its attachment for history while removing it from the active list, which keeps the drafts view meaningful as a to-do rather than letting it fill with documents you already dismissed.