How carrier invoices get approved
Approving a carrier invoice is the sign-off that it’s correct and cleared to pay. This page covers what makes an invoice ready to approve, and the three paths it can take to get there.This is about carrier invoices (accounts payable — money out). The customer/AR side has its own “approve & send” step that queues an invoice for delivery — see Accounts receivable management. If the AP/AR distinction is fuzzy, start with the data model.
Exceptions and approval
Upwell audits every carrier invoice against its bill and raises exceptions for anything that doesn’t line up. How an open exception affects approval depends on the path:- Auto-approval acts only on clean invoices. An invoice with any open or in-progress exception is excluded outright — as are invoices not yet matched to a bill and a carrier, or missing a total amount. There is no override.
- Manual approval can override open exceptions. A reviewer may approve despite open exceptions by explicitly overriding them — with one hard limit: a
CARRIER_PAY_FROZENexception can never be overridden and always blocks approval until it’s cleared.
The three ways an invoice gets approved
Manual
A person reviews the invoice and approves it.
Auto-approval
Eligible invoices are approved automatically by rules you configure.
External request
Upwell hands the decision to your integration to resolve.
1. Manual approval
The default. A reviewer looks at the invoice — its amount, its matched bill, and any exceptions — and approves it. If the invoice still has open exceptions, the reviewer can override them to approve anyway (exceptCARRIER_PAY_FROZEN, which must be cleared first). In most tenants, approving moves the invoice’s status straight to APPROVED, which is what kicks off the downstream payables work (see the carrier-invoice lifecycle).
If your tenant hands the final decision to an external system (path 3 below), clicking Approve is not immediate: instead of setting
APPROVED, it opens an approval request and the invoice waits for that system to resolve it. The manual review and the external request are two stages of the same action, not separate paths.2. Auto-approval
If you enable auto-approval in your payables settings, Upwell approves invoices that are clean — no open or in-progress exceptions, matched to a bill and a carrier, and with a total amount — and that fall inside the guardrails you set, no clicking required. Auto-approval runs automatically on a regular basis, not the instant an invoice arrives. The guardrails:| Setting | Effect |
|---|---|
| Enabled | Master switch. Off by default — nothing auto-approves until you turn it on. |
| Maximum amount | Only invoices at or below this amount (in cents) auto-approve; anything larger waits for manual review. Leave unset for no limit. |
| Exclude Quick Pay | When on, Quick Pay carriers are held for manual review even if otherwise eligible. |
| Exclude LTL | When on, LTL shipments are held for manual review. |
3. External request for approval
For integrations that own the approve/reject decision in their own system, the Approve action doesn’t finalize the invoice in Upwell — it opens an approval request and hands the decision off. This isn’t a separate button: in tenants with an external approval integration enabled, it’s exactly what clicking Approve does. The same readiness checks run first, so the request is governed by the same gate as any other approval: the invoice must be matched to a bill, and an open or in-progress exception still blocks it unless the reviewer explicitly overrides it (andCARRIER_PAY_FROZEN blocks it outright, override or not). Only then is the request created — a request never bypasses the exception gate.
Your integration then reads the pending request and resolves it: SUCCEEDED moves the invoice to APPROVED; FAILED rejects it. Until it resolves, the invoice stays in its pre-approval state and the Approve action shows as in progress. See the developer guide: Responding to a carrier-invoice approval request.
Putting it together
Ingest & audit
A carrier invoice arrives, is matched to its bill and carrier, and is audited. Any mismatch becomes an exception.
Clear (or override) exceptions
Open exceptions are resolved (manually or as the data catches up). Auto-approval waits until they’re gone; a manual reviewer can override open exceptions to approve anyway — except
CARRIER_PAY_FROZEN, which must be cleared first.To watch these transitions programmatically, use the signals and webhooks in Knowing when a carrier invoice is processed. For the objects referenced here — bill, carrier invoice, exception, approval request — see the data model.

