> ## Documentation Index
> Fetch the complete documentation index at: https://docs.buildbetter.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow Automation

> Automate calls, signals, schedules, Slack posts, webhooks, folders, and tags with composable workflows

Composable Workflows are BuildBetter's v2 automation engine. They run as directed graphs of blocks and store execution history for both real runs and editor test runs.

## Runtime Model

| Part                    | What It Does                                                                                                 |
| ----------------------- | ------------------------------------------------------------------------------------------------------------ |
| **Workflow definition** | A JSON graph of nodes and edges saved on the workflow row.                                                   |
| **Field value**         | A config input stored as a literal, an upstream reference, or a template string.                             |
| **Run**                 | A persisted execution record with trigger payload, definition snapshot, status, per-node output, and errors. |
| **Block registry**      | The server-side catalog of valid triggers, data blocks, logic blocks, and actions.                           |

The engine validates block configs at execution time. Unknown block types, invalid references, invalid schedules, failed actions, or malformed configs fail the run with node-level detail in Run History.

## Trigger Types

<AccordionGroup>
  <Accordion title="Call Completed" icon="phone">
    Starts after a call has finished processing. Use this when downstream blocks need call metadata, transcript, summary, participants, or call-scoped signals.
  </Accordion>

  <Accordion title="Signals Extracted" icon="sparkles">
    Starts once per extraction batch and exposes an array of signal IDs. Use this for digest-style workflows that summarize multiple signals together.
  </Accordion>

  <Accordion title="Signal Created" icon="lightbulb">
    Starts once per individual signal. If one call creates 20 signals, the workflow runs 20 times.
  </Accordion>

  <Accordion title="Manual Trigger" icon="play">
    Starts when a user manually runs or tests the workflow. Useful for one-off workflows and editor tests.
  </Accordion>

  <Accordion title="Schedule" icon="calendar">
    Starts from a cron schedule in the selected IANA timezone, such as `America/Los_Angeles`. The dispatcher stores the next fire time in UTC and handles daylight-saving changes through the timezone-aware cron parser.
  </Accordion>
</AccordionGroup>

<Info>
  Each workflow can have one trigger block. Remove the existing trigger before adding a different one.
</Info>

## Data and Search Blocks

Data blocks pull context into the graph:

* **Get Call**: call title, duration, start time, asset URL.
* **Get Transcript**: speaker-labeled transcript, speaker count, attendee emails.
* **Get Call Summary**: active AI-generated summary.
* **Get Signal**: signal context, type, quote, related call.
* **Get Participants**: formatted attendee data.
* **Get Call Signals**: call-scoped signals with optional signal filter.
* **Search Calls** and **Search Signals**: recent or filtered result sets for digests and scheduled jobs.
* **HTTP Request**: fetch data from an external API.
* **Exa Search** and **Firecrawl Scrape**: web research and page scraping blocks where enabled.

## Logic Blocks

Logic blocks shape the graph before actions run:

* **Condition** uses an LLM to return true or false and route the matching branch.
* **Has Content** skips empty inputs.
* **String Match** checks text against a pattern.
* **Ask LLM** generates an answer from prompt context.
* **Format Output** converts values into JSON, text, or markdown.
* **Format List** turns arrays into readable text, with item-level templates such as `{{item.context}}`.

Condition blocks use branch handles. The engine skips the branch that does not match, so downstream actions on the false path do not run when the result is true.

## Action Blocks

Action blocks produce side effects:

| Action            | Use It For                                     |
| ----------------- | ---------------------------------------------- |
| **Send Webhook**  | POST a JSON payload to an HTTPS endpoint.      |
| **Send to Slack** | Post a message into a connected Slack channel. |
| **Add to Folder** | Add a call to a BuildBetter folder.            |
| **Add Tag**       | Apply a tag to a call.                         |

<Warning>
  Test runs execute real action blocks. Use a safe webhook URL, test Slack channel, or test folder while validating a workflow.
</Warning>

## Run History

The editor's **Run History** drawer shows recent runs for a workflow. Each run includes:

* Status: pending, running, completed, or failed.
* Whether the run was a test.
* Trigger event payload.
* Definition snapshot from the graph that actually ran.
* Per-node status, resolved config, output, timing, and error.

If a run fails, use **Fix with agent** from the run or node error to send the failure context to the workflow AI assistant.

## Legacy Template Workflows

Legacy template workflows still exist in the same Workflows area. They are useful for older automations such as:

* Recording to Folder by Title
* Recording to Folder
* Recording to Tag
* Recording Summary to Webhook
* Send Call to Webhook
* Transcript to Webhook
* Answer Questions to Webhook
* Signal to Webhook
* Send Signal to Webhook

For new automation, use **Create Composable**. Many v2 templates mirror these legacy patterns while giving you graph editing, run history, scheduling, Slack, and multi-step logic.

## Current Limits

<Warning>
  * A workflow can have only one trigger block.
  * The graph must be acyclic. The editor rejects self-loops, duplicate edges, and cycles.
  * The AI assistant is catalog-bound. It can only use blocks exposed by the block registry.
  * Scheduled workflows need a valid cron expression and timezone.
  * Action blocks depend on configured credentials or reachable endpoints.
  * There is no arbitrary JavaScript execution block.
  * Test runs have real side effects.
</Warning>

For native app integrations that are not in the block catalog yet, use **Send Webhook**, **HTTP Request**, Zapier, Make, or the BuildBetter API.
