Sage Status grid columns
A sortable + filterable Sage Status column on:
- Sales → Invoices (
/admin/sales/invoice/index) - Sales → Credit Memos (
/admin/sales/creditmemo/index)
The chip tells you, at a glance, whether each row reached Sage — without leaving the Magento admin you already live in.
The five chip variants
| Chip | Meaning |
|---|---|
| ✓ Synced | Reached Sage successfully. Hover for the Sage entity id. |
| ⏳ Pending | In flight — outbox row enqueued, not yet drained or not yet round-tripped. Typically clears within 60 s. |
| ⏸ Skipped | Filtered out by sync policy. Hover for the skip-reason code (e.g. payment_method_not_mapped, outside_sync_since, zero_value_invoice). |
| ✗ Failed | Hard failure in the chassis — auth issue, validation error, Sage 4xx. Hover for the error-code class (e.g. provider, validation, http). Investigate via the ledger dashboard's sync history. |
| — | No sync attempted. Either the row pre-dates the install, the binding wasn't connected when this row was created, or the row falls outside the sync filters in a way that didn't even produce a skipped_by_policy row. |
Sorting + filtering
Click the Sage Status column header to sort. Use the column's filter dropdown to narrow the grid to one chip variant — useful for "show me everything that failed in the last 24h."
Why pending appears immediately
The chip flips to ⏳ Pending the moment the merchant clicks Submit Invoice — not 60 s later when the cron drain finally picks it up. This is the PR7 write-through behaviour:
ByteClient::enqueueEventwrites the outbox row AND apendingrow inbyte8_entity_sync_statesynchronously.- The grid LEFT JOINs against
byte8_entity_sync_stateper row → chip renders pending immediately.
When the chassis terminal callback lands (typically 5-60 s later), the same row is UPSERTed with the terminal status (synced / skipped / failed). Refresh the grid to see the chip update.
Hover tooltip
The chip's title attribute carries useful context per row:
- Synced → Sage entity id (Sage's UUID — opaque to humans but useful in support tickets)
- Skipped → skip-reason code (
payment_method_not_mapped,outside_sync_since, etc — see Sync behaviour for the full list) - Failed → error-code class (one of:
auth,not_found,validation,rate_limited,provider,http,database,serde,internal)
For the human-readable Sage reference (SI-27, CN-5), see the next page — the detail-page info block shows it explicitly.
What if I see — on an invoice that should have synced?
Three common causes:
- The invoice pre-dates the install. The chassis only writes mirror rows for terminal
mark_*calls after PR7 deployed. Historical invoices (synced before PR7) have no mirror row. Either retry from the ledger dashboard (re-fires the callback and populates the row), or backfill via SQL — see Troubleshooting → Backfill pre-PR7 rows. - Binding wasn't connected when the invoice was raised. Check the chassis dashboard — was the binding
connectedat the time? Reconnect + retry. - Cron isn't running. Verify
bin/magento cron:run --group=defaultworks manually. If your install relies on system cron, check it's calling Magento's cron entry point on the minute.
No chip on Sales → Orders
Intentional. Orders aren't synced directly — we sync invoices, of which an order can have 0..N. A row-level chip on the Orders grid would either need a synthetic rollup (obscuring multi-invoice partial-sync state) or arbitrarily pick one invoice. Operators drill into the Invoices tab from the order to see per-invoice status.
This may change in v1.1 if a design partner asks for an Orders-grid roll-up — let us know if you'd find it useful.
No chip on Customers grid
Same reasoning. Per-currency contact dedup (see Multi-currency) means one Magento customer maps to N Sage contacts. A single row-level chip would either need an aggregate (which obscures per-currency state) or pick one currency arbitrarily. Customer detail-page block with all per-currency references is the planned v1.1+ surface.