Knowing when a carrier invoice is processed
After you submit a carrier invoice, Upwell works on it asynchronously. This page explains how to learn when that work is done.There’s no single “processed” flag. You read the existing fields on the invoice — its
status, its exceptions, and the matched shipmentId — plus the type on each attached document. You can read them by polling the GET endpoints or by receiving webhooks. Most production integrations use webhooks for timeliness and polling as a reconciliation backstop.Two phases of processing
It helps to separate two things:- Ingestion (automatic, seconds after create). Upwell stamps provenance (
source_system = "API"), matches the invoice to a shipment/carrier/bill from your references, and runs the exception audit. Thestatususually staysRECEIVEDthrough this phase — ingestion populatesshipmentId/billId/carrierIdand updatesexceptions, it doesn’t move the status. - Review & approval (later; may involve your rules or a human). The invoice moves toward
APPROVEDor an exception state. This is wherestatuschanges.
The signals
Status values
Approach 1 — Polling
Read the invoice and its documents on an interval. Wait for ingestion (the row’supdatedAt advances past createdAt), then read the outcome.
Approach 2 — Webhooks
Subscribe once and let Upwell push the changes to you. Configure subscriptions in the Upwell dashboard (see Outbound webhooks for the model, payload shape, and auth).Which should I use?
Webhooks
Best when you can host an HTTPS endpoint. Near-real-time, no polling load.
Polling
Best when you can’t receive inbound requests, or as a backstop. Read
GET /carrier_invoices/{id} (+ /documents) with backoff.Webhook delivery retries on
5xx and can be delayed under load. A robust integration uses webhooks for timeliness and reconciles with a periodic poll so a missed delivery never leaves an invoice stuck in your system. The demo TMS app implements both.
