When to use an Event
Use an Event when work should begin because state changed, not because a person called an Endpoint or a clock reached a particular time.Create an Event in the UI
Open Jobs → Events, select Add, and configure the definition.
For a Job target, the selected template carries the Component, execution principal, input defaults, limits, concurrency, and retry policy. For an Agent target, delivery uses the current Agent definition.
Operate configured Events
The Jobs → Events grid is the inventory of current and deleted definitions. It exposes name, category, description, active state, event type, target type, target ID, metadata, creation/update ownership, version, and deletion state. Every visible column can be used as an operator filter where its data type allows it. Open a row to review the effective target, delivery mode, metadata, and filter before changing lifecycle state. The header links directly to History, so the definition and its observed deliveries remain separate:
Instance settings govern the total and active Event-definition quotas. An active definition whose target was deleted, disabled, or is no longer authorized cannot be admitted until that dependency is corrected.
Create a custom business event
Choose Type → Custom when the signal belongs to your application rather than a RevoEngine resource lifecycle. In the Custom type field enter the business suffix, for exampleORDER_APPROVED; the durable/API type becomes CUSTOM_ORDER_APPROVED.
Use a stable namespace and past-tense business fact. A custom event should announce something that already happened, not hide a command such as CUSTOM_SEND_EMAIL_NOW.
Example: approved high-value order
Create a Job template first, then register one filtered Event definition:operationId and evidence IDs.
The Event message is routing context, not financial truth. The target must reload balance, order status, and prior transaction state under its own principal before it commits a side effect.
Filter event messages
The visual filter builder supports all, any, and none matching. Enter message paths without themessage. prefix; use dot notation for nested properties.
message. For example, enter name, mimeType, or metadata.kind; the editor persists the safe query path as message.name, message.mimeType, or message.metadata.kind. Do not type the message. prefix into the visual field.
For a CSV ingestion subscription, configure all conditions:
* is normalized to the query wildcard used by the stored filter. Property paths are limited to safe dot notation; prototype-related segments and prefixed paths are rejected.
Filter operators
The visual builder supports up to six safe message-path segments and deliberately writes only
message.* filters. The Platform API accepts a validated filter tree over message.*, searchable metadata.*, or the event type, with nested and, or, and not groups and at most twelve field-path segments. Unsafe keys such as __proto__, prototype, and constructor are rejected on both surfaces.
Trigger a controlled test
Saved active Events expose Run toAUTOMATION_RUNNER and AUTOMATION_ADMIN.
- Open the Event and select Run.
- Enter a JSON
messagerepresentative of production traffic. - Optionally delay delivery with exactly one scheduling field:
inSecondskeeps the existing relative-seconds contract;scheduleForsets an absolute ISO 8601 date-time or Unix timestamp in milliseconds. Both forms accept only a time from now through 30 days ahead.
- Submit and retain the returned Event history identifier.
- Open Event History and confirm which targets were scheduled or skipped.
scheduleFor when the caller already owns an absolute business deadline:
Built-in event families
The current catalogue includes lifecycle events for:- Storage create, update, synchronize, archive, restore, and delete;
- legacy File finalize, archive, and delete;
- User and Service Account create, update, activate, deactivate, restore, and delete;
- account API-key create, update, and delete.
CUSTOM_* events for business vocabulary owned by your application. Do not reuse an identity or Storage event to carry an unrelated domain message. The selector presents CUSTOM plus a suffix field, while the stored and API-visible type is the combined CUSTOM_<SUFFIX> value.
Storage lifecycle cookbook
STORAGE_CREATED is emitted after the Storage record is durable and an upload is finalized. With computeStats: 'async', it can arrive before text statistics; subscribe to STORAGE_SYNCHRONIZED if the first Job must read cached batches immediately. Reports workspace lifecycle messages are not published as customer Storage events.
Legacy FILE_FINALIZED, FILE_ARCHIVED, and FILE_DELETED exist only for integrations still using the old Files model. Do not select them for a new Storage workflow.
Incoming file → Event → Job → output
- An operator, SDK, or Component uploads a file into the Storage Files workspace and finalization creates a
storageEntryId. STORAGE_CREATEDrecords the entry projection as the Event message. A filter admits only the intended MIME type, folder policy, or user metadata.- The selected Job template starts its Component under the template’s service account. The Job input contains
{ type, metadata, message }. - The Component reads
api.input()?.message.storageEntryId, validates authoritative entry metadata and content, and uses boundedstorage.getFileData()batches. - It writes a result with
storage.putObject()or a finalized upload session, then returns the operation ID and both Storage entry IDs. - Event History proves admission and target scheduling; Job History, logs, and the output Storage entry prove processing.
Grant the Job service account read access to the input’s complete ancestor ACL chain and write access to the output folder. An Event matching successfully does not bypass Storage authorization at execution time.
Roles and lifecycle
Updates use a version field for optimistic concurrency. Deleting is recoverable; restoring returns the definition but does not imply that it should immediately be active. Review its target and filter first.
Delivery and failure semantics
eventHistoryId + targetId.
Diagnose by boundary
The Event never appears in History
The Event never appears in History
Confirm the producer used the expected type, the trigger request was accepted, and any delayed
inSeconds window has elapsed. For Storage workflows, also inspect the durable Storage entry because a committed file remains authoritative if post-commit event enqueueing fails.History exists but the target was skipped
History exists but the target was skipped
Compare the saved normalized message with the definition filter. Check data types as well as values: the number
10000 is not the string "10000" for exact equality.The target was scheduled but failed
The target was scheduled but failed
Continue in Job History or the Agent run. Event History owns admission and fan-out, while target history owns execution, permissions, retries, and result.
A custom event matches too many definitions
A custom event matches too many definitions
Use a more specific
CUSTOM_* type or add message/metadata filters. Keep each definition responsible for one target so unwanted fan-out can be disabled independently.Production checklist
- Give custom types stable
CUSTOM_*names. - Filter before starting expensive work.
- Validate the payload again inside the target.
- Use a dedicated service account on Job templates.
- Correlate Event history with downstream operation IDs.
- Make every external side effect replay-safe.
- Disable the definition before changing a production target.
- Review configured definitions and active quotas periodically; remove obsolete subscribers instead of leaving ambiguous filters active.

