1) Step anatomy and data mapping
Most steps share these tabs (similar to triggers).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.

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).
- 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: 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_idvia 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
- 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 step options
- Extract Fields - structured extraction from text. Example configuration:
- Input:
{{ steps.call_contact.transcript }} - Schema:
{"email":"text","budget":"number","callback_ok":"boolean"}
- Input:
- Custom Prompt - generate a summary, label, or next action; feed into Conditions.
B) Conditions
Conditions step options
- Filter - drop records that do not qualify. Example:
budget < 100000-> drop. - If / Else - binary branch. Example:
emailmatches/.+@.+\..+/-> 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
- 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.
- Headers: include auth (for example,
- 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 aslast_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 NoteHubSpot - 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 MessageSmartSheet - 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
- Automations - Triggers - where automations start.
- Attributes vs Metadata - what to store and when.
- Automations overview - preparing data and contacts before and after calls.
- On Inbound Call trigger - logic before connecting inbound calls.