Skip to main content
A platform event is one row in your organization’s event log. It records that something happened: a dataset refreshed, a sync run finished, a data check refused a load, a document library was re-indexed, a schedule came due, a deploy finished in one of your systems, or anything else your own systems report through an inbound source. The log is append-only and scoped to one organization. Events are what automations react to. Platform events are a capability Nexio operates for you. Nexio turns the event log on for your organization and configures the automations that use it. There is no public API to read the log; the only public route in this area is inbound events, which lets your systems append to it. Run results are not platform events; they reach you as webhooks.

How it works

  1. 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.
  2. The event is deduplicated on its identity. Recording the same fact twice leaves one event.
  3. 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.
  4. 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’s caused_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 form family.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 nexio inbound source carry any of the types configured on that source. You name them when you ask Nexio for the source, for example crm.account_updated or vendor.contract_signed. Any name is accepted except a reserved type. The subject and body are the sender’s, and produced_by is ingest.
  • Events from an automation’s emit_event effect carry the type configured on the automation, with produced_by set to rule, caused_by set, and the matched event’s id in the body as source_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.
See Document indexing and extraction.

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 a nexio source:
  • code.deployed, from a github source (below).
  • ams360.notification_received, from an ams360_ons source: notifications from AMS360, a supported system type. Its subject is ams360_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 default success) for a repository connected as an inbound source. Nexio records it from GitHub’s deployment_status webhook. See Inbound events.

Reserved types

A nexio 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_webhook effect. See Platform event deliveries.

Automations

How events trigger work, with budgets, retries, and loop protection.

Inbound events

Send authenticated events from your systems.
Last modified on September 25, 2026