Skip to content

Automation primitives

The automation engine is conceptually similar to Make.com (or Zapier): a flow starts with a trigger, runs through a chain of nodes, and each node produces outputs that downstream nodes can reference. If you’ve used Make before, you’ll feel at home; if not, this section is the primer.

The engine is less flexible than Make and Zapier on purpose — every block has a domain-aware shape (e.g. “Set lead state”, “Send email”) that knows about pools, calendars, and the Studio variables.

Every flow starts with exactly one trigger. There are six trigger event types:

Trigger (UI label)Event IDFires when
Neuer Lead hinzugefügttable.entry.addedA new lead is created in the Lead Pool
Leadstatus geänderttable.entry.leadState.changedA lead transitions to a different lead state
Neuer Termin gebuchtcalendar.appointment.bookedA new appointment is booked on the Calendar
Termin beginntcalendar.appointment.hasStartedAn appointment’s start time arrives
Termin endetcalendar.appointment.hasEndedAn appointment’s end time arrives
Termin gelöschtcalendar.appointment.deletedAn appointment is deleted

The trigger:

  • Defines when the flow fires.
  • Provides the initial data every downstream node can reference — typically a tableEntry (the lead), an appointment (the booking), and the surrounding table / calendar metadata.
  • Defines the scheduling of the flow:
    • Immediate (default) — fire as soon as the event happens.
    • Delayed — fire N days/hours/minutes after the event.
    • Pre-event — fire N units before the event (only meaningful on Termin beginnt / Termin endet; you can’t pre-fire on a “lead added” event because you don’t know the lead is coming).

Triggers also have a source filter — which Lead Pool or Calendar to listen on. Multi-source listening (one trigger watching multiple pools) is supported.

After the trigger, you add action nodes. The editor groups them into three tabs:

GroupUI labelHandler IDNotes
communicationE-Mail sendenemail.sendPlain email body
communicationSendgrid Vorlage versendensendgrid.template.sendUses a SendGrid dynamic template
communicationSMS sendensms.sendNative SMS via configured provider
actionLeadstatus setzentable.entry.leadState.setSet the lead’s state
actionFollow-Up terminierenfollowUpDate.setSchedule a follow-up date on the lead
actionPOST Requestwebhook.postConvenience wrapper around POST to a URL
actionHTTP RequesthttpRequestArbitrary HTTP request (any method)
helperVariable setzenvariable.setStore a value for use by downstream nodes
helperWartewaitDelay before the next node
helperRouterrouterConditional branching — see below

There is no dedicated “appointment action” node — appointments are read-only from inside a flow (you can react to them via triggers but not modify them).

The Router node evaluates one or more conditions and routes the flow down matching paths. Typical use:

  • “If the lead’s pool is Pool A → set state to ‘PT vereinbart’; else if Pool B → set state to the distinct ‘Probetraining geplant’ state.” (Only needed when locations use genuinely different states — lead states are org-global, so a shared state needs no branch.)
  • “If the lead has an email → send confirmation; else → end.”

See Lead states across locations for how lead states behave across multiple Lead Pools.

The condition editor offers comparators (equals, not equals, greater than, less than, contains, is empty) but dates are compared as strings today — there’s no native datetime comparison yet. To compare dates, format both sides as ISO-8601 strings and rely on lexical comparison.

The HTTP Request action sends an arbitrary HTTP request to an external service. Use it for:

  • Forwarding lead data to a Make / Zapier scenario for further processing.
  • Calling a third-party API directly (e.g. MATOOL, Magicline) — see the Integrations guides.
  • Triggering WhatsApp via a third-party provider — there’s no native WhatsApp action yet.

The request body supports {{...}} placeholders against any upstream node’s data, plus a “Raw dates” toggle to format ISO timestamps with or without timezone normalization.

For simpler one-way POSTs (e.g. firing a Make webhook), use the POST Request node instead — it’s a thin wrapper that drops the URL + body fields without exposing headers/method config.

Each node’s edit view has a variable panel on one side that lists every upstream node’s outputs. Click a variable and it’s copied to the clipboard; paste into any input field.

Notable categories in the panel:

  • Standort variables ($studio.*) — always available, regardless of upstream nodes; resolved dynamically at run time. See Snapshot semantics.
  • Trigger output — the table, the table entry, the appointment, etc.
  • Each upstream action’s output — e.g. the response of an HTTP Request node.

Custom Field values appear in a separate green-highlighted section because they have a different access path (customFieldData.<uuid> instead of data.<key>).

Each flow has two distinct save actions:

ActionEffect
SaveSave the draft. Doesn’t change the active version.
Save & publishSave AND make this the active version. New trigger events from this point use this version.

Flows are versioned. When a trigger event fires, the then-published version is snapshotted alongside the event’s data. Subsequent edits don’t affect already-queued runs. See Snapshot semantics for the full implications.