Anatomy of an Automation
An automation is a named container. Each automation holds one or more versions, and each version holds:- exactly one trigger — what starts a run
- a set of steps — what the run does
- the paths between steps, each optionally guarded by a condition
Trigger Types
Every trigger is one of two types.
Both types accept an optional condition and an execution policy. See Trigger filtering below.
Event Trigger Types
There are twelve event trigger types.These are not the same as webhook events. Webhook subscriptions use a separate, larger catalogue of events (
invoice.paid, subscription.activated, and so on) and cannot be used as automation triggers. Automation triggers use the snake_case identifiers above.Event payloads
The fields below are the trigger’s event data. Reference them from a step as{{trigger.inputs.<field>}}, and from a trigger condition by their bare field name.
payment_failed
card_expiring
invoice_status_updated
status is one of: draft, upcoming, pending_approval, scheduled, processing, issued, void, paid, canceled, overdue.
prepaid_usage_update
credits_depleted
subscription_sent_for_signature
quote_signed
subscription_status_updated
status is one of: draft, sent, accepted, active, canceled, paused, pending_approval, rejected, withdrawn, expired.
subscription_renewal_window_entered
flow_session_completed
salesforce_opportunity_changed
hubspot_deal_changed
Each entry in
changedFields is keyed by the CRM field name and holds a before/after pair, so a condition can read changedFields.Amount.after.
Trigger Filtering
A trigger has no separate filter language. Narrowing happens in two places.Condition
An optional condition attached to the trigger. It is a set of expr expressions combined withand, or, or not, evaluated directly against the event payload’s top-level fields.
Execution policy
With
once, you also pick an event field key — a field from the event payload, either a top-level key (accountId) or a dot path into a nested object (changedFields.Amount.after). The first event carrying a given value runs the automation; later events carrying the same value are suppressed.
Suppression is scoped to the automation, not to the version, so editing an automation does not reset its history and re-fire values it has already handled. Some event types refine the slot further — prepaid_usage_update scopes suppression to the commitment period and the prepaid price, so a customer can be alerted again in the next period.
Schedule Triggers
A schedule trigger carries one of two shapes.Calendar
The shape the builder writes. Each field is a list of{ start, end, step } ranges; the schedule fires at every point matching all of them.
Interval
Duration units are
seconds, minutes, hours, days, weeks, months, quarters, years.
Step Types
The automation builder currently offers action, condition, and delay steps.
for_each and do_until are executed by the engine and appear in automations that use them, but are not yet offered as choices in the builder.
Delay steps
A delay carries a duration and a unit —seconds, minutes, hours, days, weeks, months, years in the builder.
Condition steps
A condition step has no “then” and “else” fields of its own. Instead it fans out into branches, and each outgoing path carries its own condition expression. A path with no condition is the fall-through.for_each steps
do_until steps
Actions
There are twenty-six actions, grouped by category. The list is a closed set — you cannot register a custom action; usesend_webhook to reach anything Alguna does not cover. Every action’s parameters, with types and descriptions, are documented once on the Actions page; this table is the index, with the outputs each action makes available to later steps as {{<stepId>.outputs.<field>}}.
Parameter names are exactly as the engine serializes them. A few CRM parameters end in a capitalised ID (recordID, integrationID, planID); the rest use Id.
Where an action lists “one of” several parameters, provide exactly one.
integrationID is only meaningful together with recordID and defaults to the organization’s connected CRM.
Object Shapes
The lookup and bulk actions pass around reduced invoice and subscription shapes. These are the fields available on step outputs.Invoice shape
id, accountId, subscriptionId, currency, status, amount, amountPaid, amountDue, issueDate, dueDate, overdueDays, dueInDays, autoPay, paidDate, voidDate, tagIds.
Subscription shape
id, name, accountId, status, currency, contractPeriodType, contractDuration, contractStartDate, contractEndDate, activatedAt, endedAt, autoRenew, renewalPeriodType, renewalDuration, cancelationReason, daysUntilRenewal, signedByCustomer, customerName, acv, arr, mrr, tagIds.
Template Syntax
Action inputs and path conditions can reference values produced earlier in the run. A reference is a dotted path in double braces, and it always has at least three segments: the source,inputs or outputs, and the field.
A value that is entirely one reference resolves to that value with its type preserved — an array stays an array, a number stays a number. A reference embedded inside a longer string is substituted into the string:
cta object on send_email.
There is no filter pipeline.
{{ amount | currency }}, {{ now }}, and {{ secrets.KEY }} are not supported — a reference is a path into the run’s data and nothing else. Secrets belong in the connected integration, not in an automation input.Condition Syntax
Conditions use the expr expression language. A condition is a list of expressions plus a logical operator that joins them.
Trigger conditions are evaluated against the event payload, so fields are referenced by bare name. Path conditions are evaluated after template references are resolved, so they reference step data with
{{...}} paths.
Comparison operators
The builder also offers
is null / is not null for scalar fields, and contains, does not contain, is empty, is not empty for array fields.
Logical operators inside an expression
Collections and null
changedFields.Amount.after safe to write against CRM change events that carry only the fields that changed. An expression that cannot be evaluated against the payload is treated as not satisfied.
Execution Outcome Reasons
Actions that may legitimately write nothing report areason on their output instead of failing. Reading these in the execution log tells you why a run did less than you expected.
already_active, already_automated, no_linked_opportunity, no_crm_integration, already_created, already_signed, already_void, already_expired, already_rejected, subscription_active, not_a_renewal_opportunity, already_cancelled, cancellation_already_scheduled, already_renewed, expansion_already_open, no_active_subscription, ambiguous_subscription, no_opportunity_link, stage_already_set, stage_owned_inbound.
Failure Handling
Automations have no per-step retry or fallback configuration. Behavior on failure is fixed:- Invalid inputs — a required parameter missing, or a template reference that cannot be resolved — fail the step permanently. There is no retry.
- Execution failures — a downstream service being briefly unavailable, for instance — are retried automatically by the workflow engine.
- Outcome reasons are not failures. An action that reports
skippedwith a reason has succeeded; the run continues.
Next Steps
Automation Overview
Getting started with automations.
Triggers
Learn about trigger types.
Actions
Explore available actions.
Conditions
Build conditional logic.