Groundbase
Start free trial

Workflows are "when X happens → do Y automatically" rules. They run in the background whenever something happens in your CRM and execute a chain of actions on your behalf. Think auto-tagging new leads, follow-up reminders after a deal closes, auto-notes when a contact is created — anything you'd otherwise do by hand every time.

Find them in Settings → Workflows.

Starter templates (fastest way in)

Click Browse templates next to "New workflow" to pick from six pre-built automations. Each one opens the editor pre-populated — you tweak the bits that mention "CHANGE-ME" (or just review the steps), then save.

Templates that ship today:

If a template doesn't fit, start with the closest one and edit it — that's usually faster than starting from scratch.

Anatomy of a workflow

Every workflow has three parts:

  1. Trigger — what fires it. Options:

    • When something happens (entity event) — see the full list of supported events below
    • On a schedule — once / hourly / daily / weekly in your local timezone
    • When an inbound webhook arrives — chained off Settings → Webhooks → Inbound
    • When I run it manually — a Run button on the workflow row
  2. Condition (optional) — gates execution. "Only run if all of these are true": a list of field/operator/value rules. Supported operators:

    • equals, not_equals
    • contains, not_contains, starts_with
    • is_set, is_empty
    • includes_tag (only on contact/company/deal triggers)

    Field paths reference the trigger context:

    • entity.first_name, entity.email, entity.source, etc. — direct columns on the triggered entity
    • entity.tags — the entity's tag list (used with includes_tag)
    • trigger.payload.<field> — anything in the event payload
  3. Actions — what to run, in order. Each action has a type + a config:

    • Apply tag / Remove tag{ tag_name }. Defaults to the trigger entity.
    • Create task{ title, description?, due_in_days? }. Auto-links to the contact when one's in the trigger. Title supports template variables like Follow up with {{first_name}}.
    • Create note{ body }. Drops on the trigger entity. Template variables supported.
    • Update field{ entity_type, field, value }. Safe-column allowlist enforced per entity (can't rewrite system columns like user_id).
    • Send SMS{ body, to?, contact_id? }. Sends through your default Twilio number. If you leave to blank, it uses the contact from the trigger. US/CA destinations only. Honors STOP opt-outs and account suspension.
    • Send email{ to, subject, body_html?, body_text?, from_name? }. Sends through your default email account (Settings → Email integration). Template variables work in every field.
    • Fire webhook{ url, method?, body? }. Custom POST to a URL of your choice. Default body is { trigger, entity }. 15-second timeout per call.

Scheduled triggers

Pick "On a schedule" and choose a recurrence:

The editor shows a "Next runs: …" preview as you set things up — you see the next 4 fire times before you save. Timezone defaults to your browser's IANA tz so "daily 9 AM" means 9 AM where you are, not UTC.

Scheduled workflows fire WITHOUT an entity in context — so steps like "apply tag" or "update field" will skip (no entity to apply to). The actions that work for scheduled are:

Template variables

Action configs that take text can reference fields from the trigger entity:

Unknown variables render as empty strings so a missing first_name doesn't break a bulk-run on 50 contacts.

Example: auto-tag new leads from Facebook

  1. Name: "Auto-tag FB leads"
  2. Trigger: When something happens → contact.created
  3. Condition: entity.source equals facebook-lead-ads (only when the inbound webhook tagged the source)
  4. Actions:
    • Apply tag → lead
    • Create task → "Call {{first_name}} within 24h" — due_in_days = 1
  5. Save → it's live. Next FB lead that comes in via your inbound webhook gets tagged AND becomes a follow-up task automatically.

Example: auto-note when a deal closes won

  1. Name: "Won deal logger"
  2. Trigger: deal.stage_changed
  3. Condition: trigger.payload.is_won equals true
  4. Action: Create note → "🎉 Closed-won on {{entity.title}}. {{trigger.payload.to_stage_name}}."
  5. Now every won deal auto-drops a note on the deal record. Audit trail forever.

Run history

Click any workflow row to expand its run history — every time it fired, what status (completed / skipped / failed), which step did what, and any error messages. Useful for debugging when a workflow doesn't seem to do what you expect.

Reliability

Currently supported triggers

These entity events fire workflows today:

For comms events (SMS / email / call / voicemail) the engine auto-resolves the related contact into the entity context — so you can write conditions like "if contact has tag 'VIP' AND it's an inbound SMS" without any extra wiring.

Limits

Tips: editing + duplicating

Each workflow row has:

Inside the editor, the step list has up/down arrows next to each step so you can reorder without rebuilding.

Editing a running workflow

Edits take effect immediately for the next run. In-flight runs that triggered before you saved keep using the previous definition. Run history records the state at fire time, so you'll always be able to see what definition each run used.