Bills
Bills are money you owe vendors and suppliers. You enter them manually, capture them from a forwarded email, or extract them from a PDF/image with AI — then track them through a status lifecycle until they're paid. Each bill that's received or paid posts a double-entry journal entry (Debit Expense, Credit Accounts Payable), so your AP balance and aging stay accurate to the cent.
Key capabilities
- Multiple entry paths: manual draft, AI extraction from documents, bulk CSV import, or auto-created from a purchase order/transfer
- Six-state lifecycle (draft, forecasted, received, partially_paid, paid, canceled) with capability gating per state
- One-time and recurring bill types, with recurring templates that auto-generate future bills
- Partial payments that track the amount paid and a live remaining balance, flipping status to
partially_paidthenpaid - Vendor credits applied against a bill to reduce the net balance due alongside cash payments
- AP aging report bucketed by vendor (Current, 1-30, 31-60, 61-90, 91+ days past due)
- Bill metrics (total due, total balance due) across all open bills
- Bank-transaction payment matching with confidence scoring, plus split one payment across many bills
- Contract comparison that stamps each bill with a contract-match status (feeds AP approval)
- Three-way match (PO ↔ receipt ↔ invoice) with quantity/price variance flags on PO-sourced bills
- Document attachments (PDF/image) kept on the bill for the audit trail
- Optional payment-method label (Wire Transfer, ACH, Check, Credit Card) for reporting
- Automatic AP approval routing when the workflow is enabled
How it works
A bill is created, optionally routed for approval, marked received (posting to AP), then paid down by one or more transactions until the balance is zero.
flowchart LR
create["Create (manual / AI / CSV / PO)"] --> draft["draft / forecasted"]
draft --> received["received (posts to AP)"]
received --> partial["partially_paid"]
partial --> paid["paid"]
received --> paid
draft --> canceled["canceled"]How to use it
- Open Bills under the Payables sidebar group (
/books/bills). - Click New Bill to enter one manually, or use the Bill Inbox to convert an emailed/AI-extracted draft.
- Pick the vendor, enter the amount, expense account (ledger), bill number, and dates (received and due).
- Save — a received bill posts its journal entry and starts showing in AP aging; a draft waits until you mark it received.
- To pay, open the bill and use Record Payment, choosing the matching bank transaction and amount. Partial amounts are allowed.
- Use the search and filter controls to narrow by vendor, status, payment method, or linked journal entry.
- Review the AP aging view regularly to catch overdue balances before late fees hit.
Pro tips
- Recording a payment requires a real bank transaction — DayZero links the bill to that transaction's journal entry rather than inventing cash movement, so reconcile your bank feed first.
- Removing a payment only un-links the transaction; it never deletes the bank transaction, and the bill's status recalculates back to
receivedorpartially_paid. - Use the payment-matching engine to auto-find likely payments (default confidence floor 0.50), then bulk-approve the high-confidence ones (≥ 0.85) instead of matching by hand.
- Split a single bank payment across several bills with the batch endpoint — it validates the total against the transaction's unallocated balance before creating any payment, so an over-allocation fails cleanly.
- The payment-method label is informational only — it never touches the ledger, so it stays editable even after a bill is paid.
- Bills that come from a purchase order carry a three-way match status; a
qty_varianceorprice_varianceflag means "ordered ≠ received ≠ billed" and is worth investigating before paying. - Keep vendor contracts current: the contract-match status stamped on each bill is what lets the AP approval workflow auto-approve or escalate it.
In-depth guide
Lifecycle & balances
- Edit / delete / cancel — allowed only while in
draft,forecasted, orreceived. - Payments — accepted only in
receivedorpartially_paid. - Remaining balance — the bill amount minus payments applied (cash side).
- Balance due — also subtracts applied vendor credits and is 0 for
paid/canceled. - Overdue — true when the bill is unpaid and its due date is in the past.
Accounting impact (double-entry)
- Mark received (or create-received with a
ledger_id): Debit the chosen expense ledger, Credit Accounts Payable. - Record payment: Debit Accounts Payable, Credit Cash. When payments reach the bill amount, status flips to
paid. - Cancel: status moves to
canceledand any associated journal entries are removed.
Journal entries are only created when the business has the ledger integration enabled.
AI bill capture (OCR / extraction)
- Inputs — AI extraction accepts pasted text, PDFs, images, Excel, or a multi-bill CSV and returns draft bills for review before anything is created.
- Auto-matching — matches an existing vendor at ≥ 80% name similarity and an expense ledger at ≥ 75% similarity to the detected category, and returns a per-item confidence score.
- File handling — files process concurrently (uploading 5 is roughly as fast as 1), cap at 20 MB each, and use a vision-capable model for PDFs/images.
- On approval — reviewed drafts are created through the create-received path so they post a journal entry immediately.
- Inbox flow — see AP Emails and AP Automation & Bill Capture.
Payment matching
- Scan — the matching engine scans unallocated outgoing bank transactions against open bills, scoring amount, date, memo, and vendor similarity.
- Thresholds — suggestions appear with a confidence score; the default minimum is 0.50, auto-match accepts ≥ 0.85, and bulk-approve clears all pending suggestions above a threshold (default 0.85).
- Accepting — creates the real payment and updates the bill.
- Payment priority — the AI payment-priority endpoint can rank which open bills to pay first.
Related features & AP approval
- Trigger — on creation and on receipt, DayZero calls the AP approval trigger.
- Routing — when automatic routing and a published workflow are present, the bill's amount and contract-match status are read to route it into auto-approve, operations, or advisor + owner tiers — see AP Approval Workflow.
- Downstream — bills also feed AP aging, cash forecasting, and (when sourced from inventory) the PO/transfer three-way match.
Edge cases
- A bill can exist without a vendor — useful for quick drafts, but contract matching and approval routing need a vendor.
- Bulk CSV import creates rows as
draft,forecasted(whenapprove=true), orreceived(withcreate_as_received, which requires a resolvable expense ledger per row). - Force-deleting a bill with payments removes the link records but not the underlying bank transactions.
Start free and take control of your payables.