v1.0.0 — initial release
· 4 min read
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_allocationagainst 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 viaentity_xref). - Products (
product.upserted, opt-in) — simple → Sageproduct, virtual / downloadable →service. Composite types skipped intentionally. - Stock (opt-in) — managed-stock simples route to Sage
STOCK_ITEM+/stock_movementsreconciliation.
Multi-currency
- Auto-detected from Magento order currency. Per-currency contact keying (
M5Efor EUR,M5Ufor USD,M5for 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_ZEROshipping 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:inspecttriage 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}/settingswith 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/syncwith full per-event audit + per-row retry button.
Distribution
byte8/magento-sage-accountingon 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 sendsnulltoday. v1.1+ — needs a getter on the provider trait sodisplayed_asrides 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.capturedfor 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_referenceend-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)