> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.chrt.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.chrt.com/_mcp/server.

# Proof of Delivery

> How drivers capture proof artifacts in the chrt mobile app — photos, signatures, and barcode/QR scans — plus how Android queues unsent proof when the driver is offline.

Most stops on a task group have one or more required **proof artifacts** —
the photo, signature, or barcode scan that confirms what happened. This page
covers each capture type and how the Android app handles proof when you're
out of signal.

## Before you start

* You're working an order in **In Progress**. Proof artifacts appear on
  tasks within each stop; they're not available before you start a task
  group.
* You granted camera permission on first launch. If you skipped it, the
  capture screen prompts again — see [Settings](/app/settings) if you need
  to re-grant it.

## Artifact types

The app shows a different capture UI for each type:

| Type             | What you do                                                              | When you'll see it                           |
| ---------------- | ------------------------------------------------------------------------ | -------------------------------------------- |
| **Image**        | Take one or more photos with the camera, or pick from the photo library. | Cargo proof, dock photos, paperwork.         |
| **Signature**    | Get the point of contact to sign on the device screen.                   | Pickup or delivery sign-off.                 |
| **Barcode scan** | Scan a 1D barcode with the camera.                                       | Tracking labels, MAWB, package IDs.          |
| **QR code scan** | Scan a QR code with the camera.                                          | Some shipper / consignee handoffs.           |
| **Other**        | A required acknowledgement with no specific capture format.              | Cases the order builder configured manually. |

The order builder decides which artifacts each stop requires — see
[Creating orders](/couriers/creating-orders#proof-and-artifacts) for the
configurator side.

## 1. Open the task

On the In Progress task group, tap the task on the stop you're at. Each
required artifact is listed under the task with its type and a **Capture**
or **Add** action.

## 2. Capture a photo

Tap an **Image** artifact.

1. The camera opens. Frame the shot.
2. Tap the shutter to capture. The app downsamples the image to keep upload
   sizes reasonable.
3. Confirm the photo, or retake. You can add more photos to the same
   artifact if the stop needs several.
4. Tap **Done** to attach.

> **Tip**
>
> Hold the phone steady and let autofocus settle before tapping the
> shutter. Blurry proof photos are the most common rework request from
> dispatch.

## 3. Capture a signature

Tap a **Signature** artifact.

1. Hand the phone to the point of contact on-site.
2. They sign on the screen with a finger or stylus.
3. They (or you) tap **Clear** to retry, or **Done** to attach.

## 4. Scan a barcode or QR code

Tap a **Barcode Scan** or **QR Code Scan** artifact.

1. The scanner opens and shows a viewfinder. Point it at the code.
2. The app captures on first successful read and shows you the decoded
   value.
3. Confirm to attach, or rescan if the value looks wrong.

## 5. Complete the task

Once every required artifact on a task is attached, the task's
**Complete** action enables. Tap it to mark the task done. The next task on
the stop, or on the next stop, becomes the focus.

> **Note**
>
> Optional artifacts don't block task completion — you can complete a task
> even if an optional photo is missing. Required artifacts do block.
> Required ones have a red asterisk or a clear required indicator on the
> artifact row.

## Android: POD offline queue

On Android, proof capture works fully offline. iOS proof capture requires a
live connection to upload — if iOS proof capture fails on a weak signal,
retry once you're back on a strong network.

When Android is offline and you capture a proof artifact:

1. The photo, signature image, or scanned code is saved to the app's local
   storage immediately.
2. A queue entry is written for the upload + completion. The offline banner
   at the top of the app reflects the pending count.
3. You can keep capturing and completing tasks. Each capture queues
   independently — proof for stop 1 doesn't block proof for stop 2.
4. When you regain signal, the queue replays in order:
   * First, the binary upload (the actual photo or signature image) goes to
     storage.
   * Then the task artifact completion call runs against the API.
   * Finally, the local file is cleaned up.

If a step fails on replay (for example, a transient server error), it
retries with backoff. If it fails permanently, dispatch will see the task
still incomplete on their side — message them and re-capture.

> **Warning**
>
> Newly captured offline proof files are durable across app restarts on
> Android — even if your phone reboots, the proof and the queue entry
> survive. But if you uninstall the app or sign out before the queue
> drains, unsent proof is lost.

## How to know it worked

* Every required artifact on a task has a checkmark or attached state.
* The task moves to a completed state and the next task becomes available.
* On the web app, dispatch sees the artifact appear under the task with a
  thumbnail (for images / signatures) or decoded value (for scans).
* On Android: after capture, the offline banner clears (if it was the only
  pending change) or the pending count drops by one.

## If something looks different

* **Camera shows a black screen.** You denied camera permission. Open
  [Settings](/app/settings) and re-grant it — on iOS this jumps you to the
  iOS Settings app, on Android the system app info page.
* **Signature canvas won't accept input.** Often a screen-protector or
  case issue — try with a different finger and pressure. The canvas
  doesn't need a stylus.
* **Scanner won't recognize a code.** Try better lighting and a steadier
  framing. Glossy and damaged labels are the usual culprits. If scanning
  truly isn't possible, capture a photo of the label as a fallback and
  message dispatch.
* **Upload keeps failing on iOS.** Check signal strength — proof uploads
  can be larger than a typical API call. Try again on Wi-Fi or stronger
  cell signal.
* Contact [hi@chrt.com](mailto:hi@chrt.com) if proof attaches in the app
  but never appears for dispatch.

## Related guides

* [Accepting orders](/app/accepting-orders) — the flow that gets you to a
  task group ready for proof capture.
* [Live location](/app/location) — what's running in parallel while you're
  capturing proof.
* [Creating orders](/couriers/creating-orders#proof-and-artifacts) — how
  dispatch configures the required artifacts.
* [Troubleshooting](/app/troubleshooting#proof-upload-failed) — POD upload
  failures.