Skip to main content
After you choose a Trigger, Steps are where your automation does the work: branching, looping, calling people, writing to CRMs, scheduling, sending webhooks, and more. Open an automation and add a Step.

1) Step anatomy and data mapping

Most steps share these tabs (similar to triggers).
Account / Configure
Output
Next step

Connect the account (if required) and configure step-specific options.

Step configuration tabs

  • Account / Configure - Connect the account (if required) and set step-specific options.
  • Output - Preview the result schema this step produces (or expects). Click Refresh after a Draft run to update it.
  • Next step - Choose the next node in the flow.
Referencing earlier data
Automation data picker

Field picker for mapping data

  • Click the lightning icon to open the data tree.
  • Pick the Trigger or any previous Step as the source, then click fields to insert them.
  • Click the + next to a branch to insert an entire sub-object (for example, the full contact).
Examples
  • Map phone: {{ trigger.payload.contact.phone }}
  • Map contact ID from an upsert step: {{ steps.create_or_update_contact.contact_id }}
  • Map booking slot: {{ steps.calendly_get_available_times.slots[0].start }}
Draft vs Live
  • Draft: run safely with test payloads; Output -> Refresh updates schemas.
  • Live: runs on real events. Only switch to Live after your test pass.

2) Thoughtly steps (core)

These power calls, contacts, and internal data flow. They are the backbone of most automations.

A) Call Phone Number

Call any phone number with a selected Agent.
  • Inputs
    • Agent - choose which agent places the call.
    • Phone number - map from Trigger/Step (for example, {{ trigger.payload.contact.phone }}).
    • Genius (optional) - attach a specific knowledge base for this call. You can now select a single Genius source, which prevents context hallucinations and helps manage RAG database sizes.
    • Language / Voice (optional) - override the agent defaults per call.
    • Metadata (optional) - JSON key-values injected into the agent for this call only (see Attributes vs Metadata).
      Example: {"campaign":"q4","lead_source":"typeform","priority":2}
  • Output - call_id, status, timestamps, duration, provider metadata.
  • Warnings - Refreshing Output places a real call to the mapped number. Test with internal numbers.
  • Typical uses - ad-hoc callbacks, small pilot campaigns.

B) Call Contact

Call a Thoughtly Contact by ID so you can track history and write Attributes.
  • Why this vs Call Phone Number? Lets you persist traits as Attributes and reuse them across future calls.
  • Prerequisite - obtain a contact_id via Create or Update Contact or Get Contact by Phone Number.
  • Inputs - contact_id, optional Genius (can select a single source to prevent context hallucinations and manage RAG database sizes), Language/Voice, Metadata.
  • Output - same call telemetry plus contact linkage.
Contact utility steps

Contact utility steps

  • Create or Update Contact - upsert a contact; returns contact_id.
  • Get Contact by Phone Number - fetch to avoid duplicates or enrich calls.
  • Add Attributes to Contact - set persistent key-values (plan, region, lifetime_value).
  • Add Tags to Contact - apply lightweight labels (vip, pilot).
  • Add Disposition - write a post-call label or result for analytics.

D) Messaging and inbound

  • Send SMS - confirmations, links, follow-ups (map to, body).
  • Connect Inbound Call - complete the inbound connection after On Inbound Call pre-checks.

E) Genius source tools

Maintain the knowledge base your agents use:
  • Add Genius Source
  • Edit Genius Source
  • Delete Genius Source
  • Get Genius Source Content

3) AI and logic steps

A) AI

AI
✨
Extract Fields
✨
Custom Prompt

AI step options

  • Extract Fields - structured extraction from text. Example configuration:
    • Input: {{ steps.call_contact.transcript }}
    • Schema: {"email":"text","budget":"number","callback_ok":"boolean"}
  • Custom Prompt - generate a summary, label, or next action; feed into Conditions.

B) Conditions

Condition
πŸ”€
Filter
πŸ”€
If Else
πŸ”€
Switch
πŸ”€
Random Outcome

Conditions step options

Deterministic branching and filtering.
  • Filter - drop records that do not qualify. Example: budget < 100000 -> drop.
  • If / Else - binary branch. Example: email matches /.+@.+\..+/ -> valid path; else ask to re-spell.
  • Switch - multi-way branch. Example: plan in [basic, pro, enterprise].
  • Random Outcome - split traffic for experiments (for example, 80% A and 20% B).

C) Loop

Loop step

Loop step

Iterate over a list (for example, CRM rows) and execute nested steps per item.
  • Inputs: array path (for example, {{ steps.salesforce_query.records }}), optional batch size, max items.
  • Loop variables: {{ loop.index }} (zero-based), {{ loop.item }} (current object).
  • Example: loop contacts -> Call Contact each -> Add Disposition on result.
When the source app supports server-side filters (such as SOQL in Salesforce), filter upstream and keep automation logic simple.

4) Time utilities

  • Delay For - wait a duration (for example, PT10M = 10 minutes).
  • Delay Until - wait until a specific datetime (map a field or compute).
  • Get Current Time / Date / Date and Time - timestamp helpers.
  • Convert Timezone - normalize to the agent’s timezone.
  • Convert Date and Time Format - ISO to custom formats and back.

5) Webhook and utility

  • Send Webhook - POST data to external systems.
    • Headers: include auth (for example, X-API-Token).
    • Idempotency: send an event_id; make downstream receivers idempotent.
    • Retries: design your receiver for retries/backoff.
  • Get Website Content - fetch and parse HTML or JSON for enrichment.

6) Scheduling and booking integrations

Pick the tool your team uses; patterns are similar (availability -> choose slot -> schedule -> confirm). Acuity / Acuity Enterprise - Create, update, cancel, reschedule, search appointments; fetch forms, calendars, availability. Calendly - Get available times, schedule appointments, fetch event type availability. GoHighLevel (scheduling) - Get available times; schedule appointment. Mindbody / Zoho Bookings - Bookable times; create, reschedule, cancel appointments. Recipe: lookup availability -> present or auto-select -> schedule -> Send SMS confirmation -> write Attributes such as last_booking_at.

7) CRM and marketing integrations

Manage contacts, leads, and deals across systems. Typical pattern: search -> create/update -> note -> follow-up. GoHighLevel - Create / Retrieve / Update / Delete / Search Contact; Create Note
HubSpot - Create / Retrieve / Update / Delete / Search Contact; Get / Update Deal
Keap - Create / List / Retrieve / Update / Delete Contact
Salesforce / Salesforce Sandbox - Execute SOQL query; Create / Update / Delete Object
Pipedrive - Create / Update / Delete / Get Lead
Zoho CRM - Search / Create / Update / Delete Record
Recipe: trigger on new or changed record -> normalize fields -> Conditions route -> if qualified -> Call Contact with metadata {"campaign":"q4"} -> Add Disposition -> update the CRM.

8) Collaboration, sheets, and ops

Slack - Send Message; Send Direct Message; Delete Message
SmartSheet - Get Sheets/Sheet/Row; Search; Add/Update Row
Trello - Create/Update Card
Zoom - Create/Delete Meeting; Get Meetings/Recordings
Zendesk - Create Ticket
Recipe: on error or high intent, notify Slack, open a Zendesk ticket, add a SmartSheet row for audit.

9) Error handling and resilience

  • Happy path: check explicit success flags (for example, action_status == "ok").
  • Retryable: if transient error and retries < 2 -> Delay For PT30S -> retry the step.
  • Fallback: after max retries -> Send SMS apology or leverage a Transfer node in the voice flow; create a ticket.
  • Timeouts: if an action exceeds the SLA, branch to a graceful path and continue.
  • Idempotency: ensure webhook and CRM writes are safe on retry.

10) Best practices

  • Prefer Call Contact when you need persistent history and Attributes; use Call Phone Number for ad-hoc calls.
  • Use Metadata for per-call context (temporary); use Attributes for persistent facts. See Attributes vs Metadata.
  • Keep expressions simple; move heavy logic into upstream queries or dedicated Conditions.
  • Add explicit Else/Default branches to avoid dead ends.
  • Test in Draft with safe numbers. Remember: Refreshing Output on call steps places real calls.

See also