> ## 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.

# Creating Workflows

> How to create, configure, test, and enable composable workflows in BuildBetter

Use **Create Composable** to build a v2 workflow from a blank graph or from a prebuilt graph template. Use **Create from Template** only when you specifically need the older legacy workflow templates.

## Create a Composable Workflow

<Steps>
  <Step title="Open Workflows" stepNumber={1}>
    Navigate to **Workflows** in the main menu.
  </Step>

  <Step title="Choose Create Composable" stepNumber={2}>
    Pick a blank workflow or select a v2 template from the template picker.
  </Step>

  <Step title="Add a Trigger" stepNumber={3}>
    Drag one trigger onto the canvas: Call Completed, Signals Extracted, Signal Created, Feedback Created, Manual Trigger, or Schedule.
  </Step>

  <Step title="Add Data and Logic" stepNumber={4}>
    Add blocks that fetch context, filter results, ask an LLM, branch, or format output.
  </Step>

  <Step title="Add an Action" stepNumber={5}>
    End with a side effect such as Send Webhook, Send to Slack, Send Email, Add to Folder, or Add Tag.
  </Step>

  <Step title="Test, Save, Enable" stepNumber={6}>
    Run a test, inspect Run History, save the graph, then switch **Enabled** on when it is ready.
  </Step>
</Steps>

## Starting From a v2 Template

V2 templates seed the graph with working nodes and edges. Current templates include:

* **Send Transcript to Webhook**
* **Send Full Call Data to Webhook**
* **Conditional Summary to Webhook**
* **Ask LLM About Call**
* **Signal Report to Slack**
* **Organize Calls into Folder**
* **Folder by Title Match**
* **Apply Tag Conditionally**

After selecting a template, BuildBetter creates a disabled draft and redirects you to `/workflows/v2/:id`. Edit the graph, point actions at the right destination, test it, then enable it.

## Building by Hand

### 1. Pick the Right Trigger

| Trigger               | Use When                                                                           |
| --------------------- | ---------------------------------------------------------------------------------- |
| **Call Completed**    | You need call metadata, transcript, summary, participants, or call-scoped signals. |
| **Signals Extracted** | You want one digest-style run for a batch of newly extracted signals.              |
| **Signal Created**    | You want one run per individual signal.                                            |
| **Feedback Created**  | You want to react when new feedback is added from a selected feedback source.      |
| **Manual Trigger**    | You want an on-demand workflow.                                                    |
| **Schedule**          | You want hourly, daily, weekly, or custom cron-based automation.                   |

### 2. Connect Blocks

Drag from one block to another to create edges. The editor prevents invalid graph structure:

* No second trigger.
* No duplicate edge.
* No self-loop.
* No cycle.

### 3. Configure Inputs

Config fields can be filled three ways:

| Input Type    | Example                                                      | Use It For                                                         |
| ------------- | ------------------------------------------------------------ | ------------------------------------------------------------------ |
| **Literal**   | `https://example.com/webhook`                                | Hardcoded values like URLs, channel selections, limits, or labels. |
| **Reference** | `trigger.callId`                                             | Passing one upstream field directly into a block.                  |
| **Template**  | `Call {{get_call.title}} ended with {{get_summary.summary}}` | Combining text with multiple upstream fields.                      |

The variable picker lists valid upstream outputs, so you do not need to memorize field paths.

### 4. Use Specialized Inputs

Some blocks expose richer controls:

* **Signal filter** uses the same filter builder as Signals.
* **Resource picker** loads connected resources, such as Slack channels.
* **Multi-select pickers** support selecting several internal recipients for email actions.
* **Item template** scopes variables to an array item, such as `{{item.context}}` inside Format List.
* **Schedule input** stores cron plus timezone for local-time scheduled runs.
* **Webhook signing secret** lets each webhook step sign outgoing requests with a per-step secret.

### Email and Attachment Actions

The **Send Email** action can notify one or more active organization members. Workflow emails render Markdown as styled HTML and can include attachments for rendered signals, signal lists, calls, or recordings.

Recipients are checked again at send time, so disabled or removed members do not receive workflow email.

### Signed Webhooks

Webhook actions can include BuildBetter signature headers. Configure the signing secret in the webhook step, then use the verification guide in the editor to validate signatures in your receiving service.

### 5. Test Safely

Click **Test** before enabling the workflow. Test runs are stored as normal run records with a **test** badge, and the drawer highlights per-node output and errors.

<Warning>
  Test runs execute real actions. A test webhook posts to the URL you configure, and a test Slack action posts to the selected channel.
</Warning>

## Managing Workflows

From the Workflows list you can:

* Open any v2 workflow under **Composable Workflows**.
* Duplicate a v2 workflow. Duplicates are created disabled.
* Open older workflows under **Template Workflows**.
* See the last updated time for v2 workflows and last run time for legacy workflows.

Inside the v2 editor you can:

* Rename the workflow inline.
* Save graph and description changes.
* Toggle **Enabled** on or off.
* Open **Run History**.
* Delete the workflow.
* Use the chat panel to build, edit, explain, or debug the graph.

## Migrating a Legacy Pattern

| Legacy Pattern               | v2 Starting Point                                                |
| ---------------------------- | ---------------------------------------------------------------- |
| Transcript to Webhook        | **Send Transcript to Webhook** template                          |
| Send Call to Webhook         | **Send Full Call Data to Webhook** template                      |
| Recording Summary to Webhook | **Conditional Summary to Webhook** or blank Call Completed graph |
| Answer Questions to Webhook  | **Ask LLM About Call** template                                  |
| Recording to Folder          | **Organize Calls into Folder** template                          |
| Recording to Folder by Title | **Folder by Title Match** template                               |
| Recording to Tag             | **Apply Tag Conditionally** template                             |
| Signal to Webhook            | Blank graph with Signals Extracted or Signal Created trigger     |
| Feedback to Slack            | Feedback Created trigger with the Feedback to Slack template     |
| Email a summary              | Trigger plus Send Email action                                   |

<Tip>
  For a first workflow, use a template and change only the destination. Once the test run succeeds, add filtering or formatting one block at a time.
</Tip>
