Skip to main content

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_FROZEN exception can never be overridden and always blocks approval until it’s cleared.
So an open exception doesn’t categorically prevent approval: it always blocks auto-approval, and blocks manual approval unless a reviewer chooses to override (and never for carrier-pay-frozen).

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 (except CARRIER_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:
SettingEffect
EnabledMaster switch. Off by default — nothing auto-approves until you turn it on.
Maximum amountOnly invoices at or below this amount (in cents) auto-approve; anything larger waits for manual review. Leave unset for no limit.
Exclude Quick PayWhen on, Quick Pay carriers are held for manual review even if otherwise eligible.
Exclude LTLWhen on, LTL shipments are held for manual review.
Auto-approval never bypasses the exception gate. An invoice with an open or in-progress exception is not auto-approved, regardless of your settings — the auto-approval job leaves it alone until the exception is resolved. (A manual reviewer can still override it and approve — except CARRIER_PAY_FROZEN.) Auto-approval only ever acts on already-clean, fully-matched invoices.

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 (and CARRIER_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

1

Ingest & audit

A carrier invoice arrives, is matched to its bill and carrier, and is audited. Any mismatch becomes an exception.
2

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

Approve

The invoice is approved — by a reviewer, by your auto-approval rules, or by your integration resolving an approval request — and moves to APPROVED.
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.