Skip to main content
This article explains why Export Items can stay in the Queued tab even though you sent successful item updates and a completed job event. In some cases the items also return in a new pending Export Job when you export them again. The article also shows how to resolve the problem.

The Symptom

You processed an Export Job, and Pleo accepted every call:
  • PUT /v3/export-jobs/{jobId}/items returned 200 with "errors": [], and every item was successful.
  • POST /v3/export-job-events with completed returned 204.
  • GET /v3/export-jobs/{jobId} shows the job as completed.
However, in the Pleo Web App the expenses are still in the Queued tab and not in the Exported tab. If you export them again from the UI, a new pending Export Job appears in GET /v3/export-jobs. It contains the same accounting entries.

Why This Happens

An Export Job and its items must move through the full sequence, in order. If you skip a step, the entries can stay in the Export queue. The step that is skipped most often is marking each item in_progress before you mark it successful.

How to Reproduce on Staging

  1. In the Pleo Web App, export two expenses.
  2. Send POST /v3/export-job-events with "event": "started" for the new pending job.
  3. Send PUT /v3/export-jobs/{jobId}/items with "status": "successful" for both items. Do not send in_progress first.
  4. Send POST /v3/export-job-events with "event": "completed".
  5. In the Pleo Web App, the expenses stay in the Queued tab.

How to Resolve It

Process each Export Job in this order. Do not skip step 2. If you do, the expenses stay in the Queued tab, even though Pleo accepts every call. Send step 4 only after Pleo has acknowledged every item update from step 3.

1. Mark the Job In Progress

API Endpoint: POST /v3/export-job-events
The response is 204, and the job’s status becomes in_progress.

2. Mark Every Item In Progress

API Endpoint: PUT /v3/export-jobs/{jobId}/items Send every accounting entry in the job with "status": "in_progress", in batches of up to 100 items. Each item needs only accountingEntryId and status.

3. Mark Each Item Successful or Failed

API Endpoint: PUT /v3/export-jobs/{jobId}/items After your AS/ERP has processed the items, report the result for each one. For the full payloads, including failures, see How to Update Export Items.

4. Complete the Job

API Endpoint: POST /v3/export-job-events Send completed if all items succeeded, completed_with_errors if some items failed, or failed if all items failed. For more detail, see How to Update and Complete an Export Job.

After Resolving

Check the job and its items:
  • GET /v3/export-jobs/{jobId} shows "status": "completed".
  • GET /v3/export-jobs/{jobId}/items shows each item as successful, with exportedAt set.
  • Refresh the Export page in the Pleo Web App. The expenses move from the Queued tab to the Exported tab.