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

# Account statement webhooks

> Statement changes, reconciliation and sync outcomes across marketplaces.

Account statement events use the same names in developer webhook subscriptions,
AOP event triggers and Project event triggers. Subscribe with `POST /api/v1/webhooks`
or select **Account Statements** in webhook settings. All marketplace connections
use the same event contract.

| Event | Emitted when |
| - | - |
| `account_statement.created` | A statement is first observed by the event service |
| `account_statement.updated` | Persisted statement facts or transaction totals change |
| `account_statement.status.changed` | The statement's payment status changes |
| `account_statement.reconciliation.changed` | Its reconciliation result changes |
| `account_statement.transactions.synced` | A new complete transaction snapshot is committed |
| `account_statement.transactions.failed` | Transaction refresh enters a failed state |
| `account_statement.sync.queued` | A store's statement sync is queued |
| `account_statement.sync.started` | That sync starts |
| `account_statement.sync.completed` | Every page finishes without failed statements |
| `account_statement.sync.failed` | The sync finishes with partial failures or exhausts retries |
| `account_statement.sync.unavailable` | The marketplace connection lacks the required capability or access |

A statement change can emit several specific events. Each has its own `id` and
an increasing `resourceVersion`, scoped to the statement or sync run. Deduplicate
with `X-Omni-Event-Id`. An unchanged header emits no update, and a replay of the
same transaction snapshot emits no second completion. A fresh successful refresh
can emit `transactions.synced` even when its amounts have not changed.

The first refresh after event support is enabled establishes an initial event
snapshot for existing statements. Payment changes use `status.changed` instead
of `updated`. Reconciliation events include a changed difference or amount
basis even if the reconciliation status remains the same.

Statement events contain `data.statement`, `changedFields`,
`previousPaymentStatus` and `previousReconciliationStatus`. Store sync events
contain `data.sync` and `previousStatus`. Sync counts represent successful or
failed statement refreshes, including overlapping discovery windows; they are
not distinct statement counts.

Monetary fields are decimal strings with four decimal places, in the accompanying
`currency`. A null currency is unresolved; do not combine amounts across
currencies. `expectedAmount`, `linesNet` and `gap` use the same reconciliation
calculation as the Account Statements page. Shopee `amountBasis: "released_income"`
means income released to the seller wallet, not a confirmed bank withdrawal.

Events contain no native PDF, download URL, marketplace token or raw provider
payload. The delivery envelope includes `schemaVersion`, `id`, `type`,
`organizationId`, `occurredAt`, `publishedAt`, `resourceVersion`, `source` and
`subject`. Verify the standard [webhook signature](/webhooks/overview#verify-signatures).

In AOPs and Projects, event variables include the statement/run ID, marketplace,
store account, currency, payment/reconciliation status, totals and sync counts.
Conditions can select a marketplace or store, detect a reconciliation gap, or
filter failed refreshes. Pair monetary conditions with a currency condition.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.