Skip to main content

v1.0.0 — initial release

· 4 min read
Magento + commerce specialists

The first public release of Byte8 Sage Accounting is out. SaaS connector for Magento 2 → Sage Business Cloud Accounting — invoices, credit notes, customers, products, and payments syncing within minutes, multi-currency aware, with full sync-status visibility from the Magento admin.

What's in v1.0.0

Connect flow

  • Pairing-code Connect — generate a 30-min code in Magento admin, paste into ledger.byte8.io, the chassis handshakes back. No OAuth client secret on disk, no callback URL wrangling.
  • Sage OAuth — fully chassis-side. Tokens encrypted at rest (AES-GCM), refreshed transparently, never seen in PHP. Multi-region support (UK / US / IE / CA / FR / ES / DE).

Outbound sync (Magento → Sage)

  • Invoices (invoice.created) — outstanding AR with full line items, addresses, currency, exchange rate, per-line discounts, dedicated shipping panel.
  • Payments (invoice.paid) — contact_payment + contact_allocation against the matching Sage invoice, routed per the per-tenant payment-method map.
  • Credit notes (creditmemo.created) — refunds routed to the same contact as the original invoice, with shipping refund line and original-invoice date for accountant reporting.
  • Customers (customer.upserted) — Magento customer → Sage contact with per-currency dedup (one customer in three currencies = three Sage contacts, deduped via entity_xref).
  • Products (product.upserted, opt-in) — simple → Sage product, virtual / downloadable → service. Composite types skipped intentionally.
  • Stock (opt-in) — managed-stock simples route to Sage STOCK_ITEM + /stock_movements reconciliation.

Multi-currency

  • Auto-detected from Magento order currency. Per-currency contact keying (M5E for EUR, M5U for USD, M5 for GBP).
  • Cross-border tax routing — non-GB customers force tax_rate_id = "GB_ZERO" (post-Brexit reverse charge), with EU goods/services type resolution per Magento product type.
  • Sage v3.1 quirk §32 worked around: shipping VAT auto-recompute forces GB_ZERO shipping rate when Magento ships untaxed — no more phantom outstanding balances.

B2C consolidation (opt-in)

  • Collapse low-ticket guest orders onto a single fallback Sage contact ("Magento Web Sales") instead of one row per customer.
  • Routing rule: B2B (company present) + repeat customers + high-value first-timers all route individual; the rest consolidate.
  • Per-currency fallback contacts (one per currency).

Magento admin visibility (PR7)

  • Sage Status column on Sales → Invoices and Sales → Credit Memos grids. Sortable + filterable. Chips: ✓ Synced / ⏳ Pending / ⏸ Skipped / ✗ Failed / —. Hover for Sage entity id, skip-reason, or error code.
  • Sage Accounting info block on every Invoice + Credit Memo detail page — chip, Sage reference, last sync timestamp, skip / error context.
  • Write-through pending mirror — chip appears the moment the merchant clicks Submit Invoice, not 60 s later when the cron drain catches up.
  • Dead-letter banner on the config page surfaces failed deliveries + links to the byte8:sage:outbox:inspect triage CLI.

Operator surfaces

  • Console commands for outbox triage: byte8:sage:outbox:{inspect,requeue,cleanup}.
  • Dev command to force-sync a single invoice: byte8:sage:invoice:sync <id>.
  • Settings dashboard at ledger.byte8.io/dashboard/bindings/{id}/settings with seven cards: Sync Behaviour, Default Mappings, Payment-method Map, Tax-rate Map, Commercial Knobs, Multi-currency, B2C Consolidation. Server-side validation against the live Sage reference cache; red-underline field errors before save.
  • Sync history dashboard at ledger.byte8.io/dashboard/sync with full per-event audit + per-row retry button.

Distribution

  • byte8/magento-sage-accounting on Cargoman (Byte8 private Composer registry) for the closed-beta cohort. Public Packagist + Magento Marketplace listing follow.

Intentionally NOT in v1

  • No Sage Status chip on Sales → Orders or Customers grids. Orders aren't synced directly (we sync invoices, 0..N per order); customers map to N Sage contacts (per-currency). A row-level chip would either obscure partial-sync state or arbitrarily pick one. Order-rollup info block + per-currency customer block are planned v1.1+.
  • No "Open in Sage" deep link. Sage's business URL slug isn't deterministic across regions and isn't returned in OAuth. Probe once we have a US or IE design partner.
  • No provider_reference (e.g. SI-27) populated on the chip yet. Column exists in the schema; chassis sends null today. v1.1+ — needs a getter on the provider trait so displayed_as rides back with the Sage create response.
  • No manual "Resync now" button on Magento detail pages. Operators use the chassis dashboard's per-row retry; no need to duplicate the surface yet.
  • No standalone payment.captured for offline payments. Magento has no API to attach an offline payment to an existing invoice — accountants reconcile manually in Sage when the cheque / bank transfer lands.
  • No Sage → Magento writeback. Enterprise on request — needs Sage webhook surface + Magento write endpoints + conflict-resolution policy. Build only on a custom contract.

What's next (v1.1+)

If you have specific asks, email helo@byte8.io. We'll prioritise based on the design-partner cohort feedback. Likely first hits:

  • provider_reference end-to-end (the SI-27 / CN-5 labels)
  • Customer detail-page block (per-currency contact references)
  • Order detail-page rollup block (per-invoice statuses on the order)
  • Backfill CLI for pre-PR7 invoices
  • "Open in Sage" deep link (once we know the URL slug pattern)