Data flows
The hub sits in the centre. Each module owns its own records and tells the hub when something happens; the hub passes the event to every module that needs it. No module is wired directly to another.
Modules on the hub
14
Plus 14 outside systems through connectors
Flows running
12
2 more drafted, not switched on
Events passed today
1,146
Median hand-over 0.4 seconds
Events waiting or failed
3
All in the accounting connector
Hub and modules
Reads and writes through the hubPath of "Order paid", shown below
AI layer reads through the hub with staff permissions and writes only drafts and suggestions. AI overview
Outside systems WordPress, payment gateway, video platform, email and WhatsApp, accounting, calendar, sign-in. Connectors
| Source | Event, then what happens in order | Modules touched | 30 days | State | On |
|---|
Each step is a hub event that other modules or outside systems can also subscribe to. See the event catalogue. Steps with conditions are managed as automation rules.
One flow in detail: order paid
Last run today 10:14, 1.2 s- Order paidCommerce, O-5128
- Enrolment createdLearners, Hassan Reda
- Added to rosterScheduling, B-2612, seat 11 of 24
- Invoice createdCommerce, INV-2086
- Deal updatedCRM, marked won
- Posted to accountingWaiting: customer missing
| Step | Module that acts | Record written | Fields passed | If it fails |
|---|---|---|---|---|
| Order paid | Commerce | Payment PAY-5209 on order O-5128 | order_id, learner_id, batch_id, amount | Order stays "awaiting payment" |
| Create enrolment | Learners | Enrolment E-7741 | learner_id, course_code, batch_id | Retry 3 times, then task for operations |
| Add to batch roster | Scheduling | Seat on B-2612 | batch_id, enrolment_id | If full: waitlist and tell the learner |
| Create invoice | Commerce | INV-2086 | order_id, tax_profile | Task for finance |
| Update deal | CRM | Deal stage: won | account_id, order_id, amount | Skipped when no deal exists |
| Post to accounting | Accounting connector | Ledger entry for INV-2086, order O-5128: not posted, customer missing. See the export queue (simulated, DEC-01) | invoice_id, customer_ref | Queued; shown under sync errors |
Insight. "Order paid" touches five modules in 1.2 seconds. Before the hub this was four manual steps and a spreadsheet; the one remaining manual step is creating the customer in accounting. Fix it in the connector
Events by module, today
Single source of truth. Each kind of record has exactly one owner. Other modules hold a reference, never a copy they can edit. When two systems disagree, the owner is right.
| Entity | Owned by (source of truth) | Who can change it | Read by | Key | Legacy source |
|---|
ASME program content is owned by ASME. The catalog stores it read-only with the date it was last taken from the ASME source.
Single source of truth
One owner per entity. A learner's name is changed in one place and every invoice, roster and certificate follows.
See ownershipAPI-first
Everything the screens do goes through the same documented API that outside systems use.
API and keysModular
A module or provider can be replaced as long as it keeps emitting and accepting the same events.
ConnectorsRole-based access
The hub checks the role on every read and write, for people, API keys and the AI layer alike.
Roles and permissionsExpandable
A new product, region or delivery mode is a new record type or connector, not a new system.
Roadmap