> ## Documentation Index
> Fetch the complete documentation index at: https://docs.upwell.com/llms.txt
> Use this file to discover all available pages before exploring further.

# How carrier invoices get approved

> The three ways a carrier invoice is approved — manual review, auto-approval rules, and external request-for-approval — and the exception gate that governs all of them.

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

<Note>
  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](/accounts-receivable/receivables). If the AP/AR distinction is fuzzy, start with the [data model](/concepts/data-model).
</Note>

## Exceptions and approval

Upwell audits every carrier invoice against its [bill](/concepts/data-model) and raises [exceptions](/concepts/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

<CardGroup cols={3}>
  <Card title="Manual" icon="hand">
    A person reviews the invoice and approves it.
  </Card>

  <Card title="Auto-approval" icon="robot">
    Eligible invoices are approved automatically by rules you configure.
  </Card>

  <Card title="External request" icon="arrows-left-right">
    Upwell hands the decision to your integration to resolve.
  </Card>
</CardGroup>

### 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](/api-guides/carrier-invoice-status)).

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

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

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

### 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](/api-guides/carrier-invoice-approval).

## Putting it together

<Steps>
  <Step title="Ingest & audit">
    A carrier invoice arrives, is matched to its bill and carrier, and is audited. Any mismatch becomes an [exception](/accounts-payable/carrier-invoice-audit).
  </Step>

  <Step title="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.
  </Step>

  <Step title="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`.
  </Step>
</Steps>

<Note>
  To watch these transitions programmatically, use the signals and webhooks in [Knowing when a carrier invoice is processed](/api-guides/carrier-invoice-status). For the objects referenced here — bill, carrier invoice, exception, approval request — see the [data model](/concepts/data-model).
</Note>
