The Home for Magento 2 Excellence

Quality-tested Magento 2 modules. Explore. Evaluate. Elevate. #magento2

1090 Modules
628 Ready
462 Need Help
πŸ† Leaderboard
Actively Maintained v1.0.2

Byte8 Sage Accounting

byte8/magento-sage-accounting

Connects Magento 2 to Sage Business Cloud Accounting, syncing orders, invoices, credit memos, customers, and products into Sage in near real time with durable queued delivery, multi-currency handling, idempotent events, and sync-status visibility from the Magento admin.

0
Downloads
0
GitHub Stars
2mo ago
Last Release
1
Open Issues
Build Issues
0/3 checks passed

Build Tests

Composer Install
– DI Compile
– Templates

Code Quality

CS Coding Standard
– PHPStan

Tested on Magento 2.4.9

Recent Test History

Each release is tested against the latest Magento version at that time.

v1.0.2 on Magento 2.4.9
Jun 1, 2026

Looking for Contributors

Composer installation fails. Your contribution could help the entire Magento community!

Contribute

Share This Module's Status

Byte8 Sage Accounting Magento compatibility status badge

README

Loaded from GitHub

Byte8 Sage Accounting

Magento 2 connector for Sage Business Cloud Accounting. Syncs orders, invoices, credit memos, customers, and products from Magento into Sage in near real time, with full sync-status visibility from the Magento admin.

This module is the per-provider thin client. The heavy lifting (OAuth token custody, Sage API calls, retry, audit) lives in the Byte8 Ledger SaaS β€” see Architecture below.

Features

  • One-click Connect β€” pairing-code flow (no OAuth callback wrangling). Generate a code in Magento admin, paste into ledger.byte8.io, done.
  • Outbound sync observers β€” invoice.created / invoice.paid / creditmemo.created / customer.upserted / product.upserted events fire on every save and queue durably (no inline HTTP β€” checkout stays snappy).
  • Sage Status chips in the admin β€” sortable + filterable column on Sales β†’ Invoices and Sales β†’ Credit Memos grids; "Sage Accounting" info block on every invoice / credit-memo detail page. Operators see what synced without leaving Magento.
  • Multi-currency aware β€” orders raised against EUR / USD storefronts post to Sage with the correct currency_id + exchange_rate and per-currency contact dedup. Cross-border (non-GB customer) invoices route to GB_ZERO with EU goods/services routing.
  • Stock-item snapshot sync β€” opt-in sync_stock mode routes managed-stock simples onto Sage's STOCK_ITEM family with stock-movement reconciliation.
  • B2C consolidation β€” opt-in mode collapses low-ticket guest orders onto a single fallback Sage contact instead of one row per customer.
  • Idempotent everything β€” every event carries a stable idempotency key (invoice.created:{entity_id} etc); ledger dedupes via the shared entity_xref table. Observer re-fires, duplicate saves, replay all safe.
  • Operator-visible failures β€” failed deliveries surface as a banner on the admin config page (not a silent 24h drop).

Connect flow

  1. Stores β†’ Configuration β†’ Byte8 β†’ Sage Accounting β†’ click Generate pairing code (30-min TTL).
  2. Click Open Byte8 Ledger to land on ledger.byte8.io, sign in, paste the code + your Magento URL.
  3. Ledger calls back into Magento (POST /V1/byte8/setup/pair) with the api_key. The connection status block flips to "Connected" β€” you're done.

After connecting, Sales-side observers fire automatically; no per-merchant configuration required for the happy path. Per-tenant sync policy (default ledger account, payment-method map, etc.) is configured from the ledger dashboard, not Magento admin.

What syncs

Magento event Sage entity Notes
invoice.created sales_invoices (OPEN) Posts as outstanding AR; B2B / net-terms / COD flows correctly visible in Sage
invoice.paid contact_payments + contact_allocations Auto-allocates payment to the matching invoice; mapped per payment_method_map policy
creditmemo.created sales_credit_notes Reuses original-invoice contact (Sage requires matching contacts for allocation)
customer.upserted contacts Per-currency contact (M5E/M5U/...) for cross-currency merchants
product.upserted products / services / stock_items Routed by Magento product type; stock-item path is opt-in

What's intentionally NOT synced today: standalone payments without an invoice (Magento has no API for offline-payment attach — accountant reconciles in Sage), Sage→Magento writeback (Enterprise on request).

Sync visibility in Magento admin

  • Sales β†’ Invoices grid β€” "Sage Status" column with chips: βœ“ Synced / ⏳ Pending / ⏸ Skipped / βœ— Failed / β€”. Sortable + filterable. Hover for Sage entity reference, skip-reason, or error-code.
  • Sales β†’ Credit Memos grid β€” same column.
  • Invoice / Credit Memo detail pages β€” "Sage Accounting" info block beside "Order Information" with status, Sage reference, last sync timestamp, skip/error context.

Pending chips appear immediately when an observer fires (write-through to byte8_entity_sync_state at enqueue time); terminal status (synced / skipped / failed) lands within 60s once the ledger worker picks up the event.

For full per-event audit trail (with retry, error message, payload diff), use the ledger dashboard at ledger.byte8.io.

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Magento 2          │◄───►│   Byte8 Ledger       │◄───►│  Sage Business     β”‚
β”‚  (this module +     β”‚ JWT β”‚   (SaaS chassis)     β”‚OAuthβ”‚  Cloud Accounting  β”‚
β”‚   byte8/module-     β”‚     β”‚                      β”‚     β”‚                    β”‚
β”‚   client)           β”‚     β”‚   apps/ledger        β”‚     β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

This module is thin by design. It owns:

  • Magento-side observers (queue events on save)
  • Pairing-code flow + admin config blocks
  • Inbound REST endpoints under /V1/byte8/* (canonical entity getters + sync-state callback)
  • The byte8_entity_sync_state mirror table and the admin UI surfaces that read from it

It does NOT own OAuth token custody, Sage API calls, retry logic, dead-letter queues, or per-tenant rate limiting β€” those all live in the Byte8 Ledger SaaS. This split means the module can stay tiny (no PHP-side OAuth dependencies, no vendor/ bloat) and a single ledger instance services every connected merchant.

Requirements

  • PHP 8.1+ (8.4 supported)
  • Magento Open Source / Adobe Commerce 2.4.4+
  • MySQL 8.0+ / MariaDB 10.6+
  • A Byte8 Ledger account (pairing code issued from ledger.byte8.io)
  • Outbound HTTPS to ledger.byte8.io (port 443). Provider-side network access (api.accounting.sage.com) happens from the ledger SaaS β€” Magento never talks to Sage directly.

Installation

composer require byte8/magento-sage-accounting
bin/magento module:enable Byte8_Core Byte8_Client Byte8_SageAccounting
bin/magento setup:upgrade
bin/magento cache:flush

The byte8/magento-sage-accounting metapackage pulls in byte8/module-core + byte8/module-client + this module.

Console commands

bin/magento byte8:sage:invoice:sync <invoice_id>

Operator-driven sync trigger for a single invoice. Used during dev / triage when you want to bypass the cron drain. Production sync goes through the standard observer + cron path.

bin/magento byte8:client:outbox:inspect
bin/magento byte8:client:outbox:requeue <entity_id>
bin/magento byte8:client:outbox:cleanup [--days=30]

Outbox triage commands (live in byte8/module-client). See module-client/SECURITY.md for the full operator runbook.

Configuration

Stores β†’ Configuration β†’ Byte8 β†’ Sage Accounting:

  • Connection status β€” paired / not paired, dead-letter banner on failed deliveries.
  • Pairing code β€” generate / regenerate. 30-min TTL.
  • Open Byte8 Ledger β€” quick redirect to the dashboard.
  • Disconnect β€” revokes the binding both sides.

All sync policy (default tax rate, default ledger account, default bank account, payment method map, B2C consolidation, multi-currency knobs, sync filters, ...) is configured from the ledger dashboard, not Magento admin. See byte8.io docs for the full list.

License

MIT

Support

Byte8 Ltd β€” support@byte8.io

This content is fetched directly from the module's GitHub repository. We are not the authors of this content and take no responsibility for its accuracy, completeness, or any consequences arising from its use.