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.
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

The names below are the values the API and this guide use. Three of them share one label in the inbox: new, parsed and extracted all read as New, because from a reader's point of view a document that has arrived and not yet reached a person is one thing. held_quota reads as Held: it does not clear itself, so it gets its own label. Where the label differs from the name, the "Shown as" column gives it.

StatusShown asWhat it meansEnters whenLeaves toCounts against your allowance
newNewThe default value of the status column. In practice you will not see it: the parser creates every document already parsed or needs_review.Nothing in the pipeline writes it.n/aNo
parsedNewAttachments 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_quotaHeldParsed, 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
extractedNewFields 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_reviewNeeds reviewA 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_approvalAwaiting approvalCoded 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
approvedApprovedThe approval quorum for its tier has been met.The last required approver signs.exported.Yes
exportedExportedDelivered to your ledger or written into an export file.The export batch succeeds.Nowhere you can trigger. See below.Yes
partially_exportedPartly exportedPart of a split invoice reached your ledger and part did not.A document posting to several ledger companies succeeds in some and is parked in others.Back to exported when a later run of the same batch settles every company. Exports names which company is outstanding.Yes
failed_exportExport failedThe export was attempted and did not complete.An export batch fails, or the item is parked before posting.Retrying the export batch re-attempts the item. The document status is not moved back by hand.Yes
duplicateDuplicateA person has confirmed this is a copy of a document you already have.A reviewer presses Mark duplicate on the document and chooses the original. Never automatic.Nowhere today. There is no un-duplicate action; the document keeps the status and the link.Only if it was extracted before being marked
filteredFilteredJudged 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
quarantinedQuarantinedA security hold.A rule with a quarantine action matches, or somebody puts it there.Nowhere today. A quarantined document stays quarantined; there is no release action yet.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.

Marking a document a duplicate is not reversible in the app today. Nothing is lost by it: the document keeps its link to the original and its whole audit history, the invoice can still be read, and exported evidence still names it. If you need the status itself changed, contact support with the document number.

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. There is no release action today: a quarantined document stays where it is, visible, with its rule named.

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 ledger 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 Exports screen shows one row per company with its own outcome, and the retry is aimed at the company that failed. See posting to several companies.

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 for what happens when the allowance runs out on each plan.

Which moves are allowed

Statuses do not move freely, but the constraint is the code path rather than a general-purpose gate: each step of the pipeline writes only the statuses it is responsible for, and the table above lists what each step can produce. There is no separate state-machine service that refuses an arbitrary move, so read this table as a description of what happens rather than as a validation rule you can lean on.

Three moves are worth knowing about because people look for them:

You want toThe move
Undo a filterfiltered to parsed. Restoring is the only move out of filtered, and it re-queues extraction.
Retry a failed exportRetry the export batch. The batch goes from failed back to pending and the item is attempted again. There is no per-document "put it back to approved" action.
Finish a partial exportRetry the batch. Only the company that was parked is attempted again; the bills that already posted are left alone. Watch Exports, not the inbox badge.

exported has no outward transition you can trigger. The one exception is internal: while a multi-company batch is still settling, a document can move between exported and partially_exported as the remaining companies report back. 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 records the external ID it received.

What "an exception" means when you read a report

On a status list, needs_review and quarantined describe where an invoice is now. On Reports the word exception means something narrower and more useful: an invoice that ever held one of those two statuses, counted against the invoices that arrived in the same range.

The difference matters because the two answers move in opposite directions. A count of who is waiting right now falls as the team works through the queue, so a fast team looks better than a slow team holding the same invoices — that is a workload reading, not a quality one. The reported figure is fixed once the range has passed.

One consequence you can see: an invoice routed to review, read, and approved without a character being changed is an exception and it is auto-processed. The two figures on the reports page are not opposites, and the metrics reference gives the full definition of each.

Where to go next