--- title: Invoice statuses description: The thirteen statuses a document can hold, what moves it into each one, what moves it out again, and which of them count against your monthly allowance section: Reference order: 20 --- # Invoice statuses Every document in InletAP holds exactly one status, and that status is the honest answer to "what is happening to this invoice". This page is the reference for all thirteen: what each means, what puts a document there, what takes it out, and whether it has been counted against your plan. ![The inbox listing every document with vendor, invoice number, due date, amount, property, status and confidence.](/screens/inbox.png "Every document, whatever its state. The status column is the same vocabulary used throughout this guide.") Read it when a document has stopped somewhere you did not expect, or before you write a rule that depends on where invoices end up. ## The thirteen statuses | Status | What it means | Enters when | Leaves to | Counts against your allowance | | -------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------- | | `new` | The message has been received and the raw mail is stored. Nothing has been read yet. | An email arrives at one of your intake addresses. | `parsed`, or straight to `needs_review`, `filtered` or `quarantined`. | No | | `parsed` | Attachments and body text have been pulled out of the MIME structure. | The parser finishes with the message. | `extracted`, `held_quota`, `needs_review`, `filtered`, `quarantined`. | No | | `held_quota` | Parsed, ready, and waiting because the plan allowance is spent. | The allowance is exhausted at the moment extraction would run. | `extracted` once released, or back to `parsed`. | Not yet — it is counted when it is released and extracted | | `extracted` | Fields have been read from the document, each with a confidence score. | The extraction step completes. | `needs_review` or `ready_for_approval`. | Yes, counted here | | `needs_review` | A person is needed before this can go further. | Confidence below the threshold, an escalation, a rejected approval, or an extraction that failed outright. | `ready_for_approval`, `duplicate`, `filtered`, `quarantined`. | Yes, at the latest when a reviewer finishes it | | `ready_for_approval` | Coded and waiting for a decision. | Extraction is confident enough, a rule auto-approves, or a reviewer sends it on. | `approved`, back to `needs_review` on a rejection, or `quarantined`. | Yes | | `approved` | The approval quorum for its tier has been met. | The last required approver signs. | `exported`. | Yes | | `exported` | Delivered to your ledger or written into an export file. | The export batch succeeds. | Nowhere. This is the end of the line. | Yes | | `partially_exported` | Part of a split invoice reached your ledger and part did not. | A document posting to several QuickBooks companies succeeds in some and is parked in others. | `exported`, once the remaining companies post. | Yes | | `failed_export` | The export was attempted and did not complete. | An export batch fails, or the item is parked before posting. | Back to `approved` so it can be retried. | Yes | | `duplicate` | Confirmed as a copy of a document you already have. | Duplicate detection at ingest, or a reviewer confirming a candidate original. | `needs_review`, if the judgment was wrong. | Only if it was extracted before being identified | | `filtered` | Judged not to be an invoice at all. | Triage recognizes a newsletter, an auto-reply, a bounce, a calendar invitation, or a body-only email with nothing financial in it. | `parsed`, by restoring it. | No, and this is the point of it | | `quarantined` | A security hold. | A rule with a quarantine action matches, or somebody puts it there. | `needs_review`, once a person has looked. | Depends on how far it had already traveled | The document is never deleted at any of these stops. The original message, the attachments and the extracted text are all retained, including for the statuses that read like a dead end. ## Filtered, quarantined and held: the three that get confused These three all mean "this is not going any further right now", and they are deliberately kept apart, because conflating them would make all three harder to reason about. `filtered` is a routing decision. Something arrived that is not an invoice, and it was diverted **before** extraction — so it costs nothing, consumes no allowance, and can be put back with one action. Restoring it returns the document to `parsed` and re-queues it, which is exactly where it would have been had it never been diverted. The filter errs towards letting things through. A message that carries both invoice wording and an amount is never filtered on a statistical rule, however much its envelope looks like marketing, because a false positive costs you a support ticket and a false negative costs a few cents of processing. `quarantined` is an incident. It means a rule you wrote said "hold this one", and the document is waiting for a person with the authority to look at it. It is not a judgment about the file's contents; it is a judgment about the sender, the amount or the wording that you encoded yourself. `held_quota` is neither. The document is a perfectly good invoice and the month's allowance is spent, so it stops immediately before the extraction step — the step that costs money. The parsed source text is already stored, so releasing a held document only has to run extraction; nothing is fetched or parsed twice. ## `partially_exported`, and why it is its own status Most invoices become one bill. An invoice split across ownership entities that keep separate QuickBooks companies becomes one bill per company, and those posts can succeed and fail independently: two bills in, one parked. Calling that `exported` would claim money is in your ledger that is not. Calling it `failed_export` would claim the opposite, and would invite a retry of bills that already posted. So it has its own status, the export screen shows one row per company with its own outcome, and the retry is aimed at the company that failed. See [multi-entity QuickBooks](/docs/multi-entity-quickbooks). ## What counts against your allowance A processed invoice is one document that InletAP extracted fields from. The counter is stamped on the document exactly once, and never twice, whatever route the document takes afterwards. There are two places it can be stamped: - Extraction. The usual one, and the reason `filtered` and `held_quota` cost nothing: both stop before it. - A person finishing review on a document the extractor could not read — a photographed handwritten bill, for instance — and sending it for approval. The work has been done and the invoice is real, so it counts. A document that bounces back through review, gets re-extracted, or is rejected and approved again is still counted once. Re-running the pipeline does not re-bill you. See [plans and limits](/docs/plans-and-limits) for what happens when the allowance runs out on each plan. ## Which moves are allowed Statuses do not move freely. The transitions in the table above are the whole set, enforced server-side, and a move that is not on the list is refused rather than quietly performed. Three of those transitions are worth knowing about because people look for them: | You want to | The move | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | Undo a filter | `filtered` to `parsed`. Restoring is the only move out of `filtered`, and it re-queues extraction. | | Undo a duplicate | `duplicate` to `needs_review`. The link to the original is kept in the audit trail. | | Retry a failed export | `failed_export` back to `approved`, which makes the document eligible for the next batch. | | Finish a partial export | `partially_exported` to `exported`, by retrying only the company that was parked. The bills that already posted are left alone. | `exported` has no outward transitions at all. Once a bill exists in your ledger, the correction belongs in the ledger — InletAP will not pretend the posting never happened, and the [audit trail](/docs/audit-trail) records the external ID it received. ## Where to go next - [How it works](/docs/how-it-works) — the pipeline these statuses describe. - [Extraction confidence](/docs/extraction-confidence) — what decides between `needs_review` and `ready_for_approval`. - [Exports reference](/docs/exports-reference) — what `exported` and `failed_export` mean in practice. - [Multi-entity QuickBooks](/docs/multi-entity-quickbooks) — where `partially_exported` comes from. - [Why hasn't my invoice appeared?](/docs/invoice-not-appearing) — for documents that never reached a status at all.