How it works
- A component inside Nexio records an event in the same database transaction as the write it describes, so a change that rolled back leaves no event.
- The event is deduplicated on its identity. Recording the same fact twice leaves one event.
- About every 5 minutes, Nexio’s dispatcher reads events recorded in the last 24 hours that it has not yet evaluated and matches them against your organization’s automations.
- Each match is recorded as a dispatch with a stable ID. A dispatch that passes the automation’s checks runs its effect. Retries reuse that ID; a webhook receiver still deduplicates, because a post can arrive twice. See Automations.
Event fields
Identity and deduplication
An event’s identity is its organization,subject, type, and dedupe_key. A second append with the same identity is dropped, and the first event stands. That is the designed result of a retry, not an error. Each of Nexio’s emitters picks a dedupe key that names one real fact, for example the run ID for a dataset refresh, so an emitter that repeats the same write after a crash does not create a second event.
Transition causes
An automation fires only for the causes it lists, and by default it lists only
world_change. A backfill therefore does not set off your automations unless Nexio configured one to accept it.
Emitters
produced_by tells you whether an event came from inside Nexio or from outside. An event with produced_by set to ingest came from an inbound source, authenticated per source kind: by signature, or, for an ams360_ons source, by a shared authentication code.
Lineage
When an automation emits a new event in reaction to another, the new event’scaused_by holds the parent’s id. The chain can be followed back to the original fact. The dispatcher uses the chain to stop loops: see Loop refusal.
Event log modes
The event log has a mode per organization. Nexio sets it.
Inbound events are recorded in every mode, including
off. While an organization is off, they are stored but not dispatched.
Event types
An event type is a name of the formfamily.name. The set is not closed: most types are chosen by the system that sends them, and the platform adds a small fixed set of its own.
Types your systems choose
This is the extension point. Two kinds of event carry a type their sender chose:- Events from a
nexioinbound source carry any of the types configured on that source. You name them when you ask Nexio for the source, for examplecrm.account_updatedorvendor.contract_signed. Any name is accepted except a reserved type. The subject and body are the sender’s, andproduced_byisingest. - Events from an automation’s
emit_eventeffect carry the type configured on the automation, withproduced_byset torule,caused_byset, and the matched event’sidin the body assource_event_id.
eval.run.requested is one such type with a platform meaning. An automation emits it to start an evaluation. For an engine evaluation its body carries eval_set_id, reason, and optional engine_slug, engine_id, commit_sha, and deployed_at.
Types the platform records
The platform’s own emitters record a fixed set of types, defined in code. Each has a fixed subject form and body.dataset.refreshed
A platform data transformation finished and loaded a new version of a dataset.sync.run_completed
A sync or transformation run finished, whatever its result.run_kind names the kind of work: book_sync is a sync of a connected system of record, materialize_sync is a document library pass, and derivation is a data transformation. See Data transformation and delivery.
check.failed
A data check on a load or a delivery did not pass. A blocking check that failed stopped the load or delivery; a non-blocking check held some rows out.records.changed
The rows of a served dataset changed. Today one dataset produces it,served_commission_terms.
document.index_changed
A document library sync added, changed, or removed indexed documents. It is not recorded when nothing changed.schedule.fired
A scheduled automation came due. It starts that automation.Types minted by verified inbound sources
Two types are recorded only from an inbound source whose kind Nexio verifies, never from anexio source:
code.deployed, from agithubsource (below).ams360.notification_received, from anams360_onssource: notifications from AMS360, a supported system type. Its subject isams360_ons/<source_id>, and its body records the delivery (among other fields, the payload’s SHA-256, size and format) and the payload with the authentication code removed; the payload is left out when it is over 64 KiB after that, or when the code cannot be removed from it.
code.deployed
A GitHub deployment reached a status the inbound source accepts (by defaultsuccess) for a repository connected as an inbound source. Nexio records it from GitHub’s deployment_status webhook. See Inbound events.
Reserved types
Anexio inbound source can never append these types, because each one asserts that Nexio itself observed something. Nexio records code.deployed and ams360.notification_received only from a verified github or ams360_ons source:
schedule.fired, eval.run.requested, book.published, dataset.refreshed, records.changed, check.failed, sync.run_completed, document.index_changed, code.deployed, ams360.notification_received.
book.published names a publish of system-of-record data. It is reserved, and no emitter records it today.
What you configure and what you call
- You configure: nothing directly. Tell Nexio which facts you want to react to. Nexio sets the event log mode and the automations for your organization.
- You call:
POST /api/v1/events/ingest/{source_key}to send your own events. See Inbound events. - You receive: platform events on one of your webhook endpoints, when Nexio configures an automation with the
deliver_webhookeffect. See Platform event deliveries.
Automations
How events trigger work, with budgets, retries, and loop protection.
Inbound events
Send authenticated events from your systems.