Product

Automate complex work for
RevOps

Describe what you want to happen across your systems. Ballet builds the workflow as real code that runs the same way every time, and uses AI only where the work needs a judgment call. Your engineers can open it, check it and change it — but nothing waits on them.

What do you want to build?

Get started with some examples

Automate a recurring task Build a weekly digest Track follow-ups
Sales Slack Answer Drafter Play

Manual run

Edit Trigger

Runs when you click Play

Read new messages

Read recent #sales messages and drop anything already handled

If → Triage questionsIf → Summarise run

Slack/slack Read Ch…

Triage questions

Pick the messages that are real knowledge questions worth answering

If → Research and draftIf → Summarise run

Research and draft

Answer each question from Brainfish knowledge and draft a Slack reply

If → Deliver drafts

brainfish docs/search

Summarise run

Close out a run that found nothing to answer

Deliver drafts

DM the reviewer each draft and log it for the audit trail

Slack/slack Send M…

Run complete

Go from a sentence to production in a day

Most of the six weeks a workflow gets quoted at is plumbing. Ballet writes it, and your engineers still get the diff.

  1. 01

    Describe it

    Say what you want to happen, which systems it touches, and the rules it has to follow.

  2. 02

    Review the build

    Ballet writes it as code your team can read. A model reads the ticket; plain code moves the money.

  3. 03

    Connect the systems

    The integration is written as part of the build — your internal billing service as readily as Salesforce.

  4. 04

    Run it end to end

    Every step runs the same way each time, and checks its own assumptions as it goes.

  5. 05

    Keep the controls

    Choose which steps wait for a person. The gate lives in the workflow, so nothing can route around it.

Open any run and read what happened

Every step, how long it took, who held the gate, and the check that spotted a schema change before anyone filed a ticket about it.

Play Code Connectors Runs 7d30d90d

Total runs

16

Successful runs

10

Per run

US$0.0001

Build cost

US$41.29

Total cost

US$41.29
Status Run ID Triggered by Version Started Duration
Completed 9cd57f0d-2bf9-4188-aaf1-e58637f324be sandbox:agent:[email protected] Sandbox 3h ago 5.5s
Completed 80f82978-93dc-4335-b904-01b3bb35d06c sandbox:agent:[email protected] Sandbox 3h ago 6.3s
Completed 591f536c-81c7-46c0-ac51-c779164f63db resumed:agent 3h ago 2m 34s
Completed f4fd2f4c-24a9-4b6e-910f-e8cde4368c71 sandbox:agent:[email protected] Sandbox 3h ago 5.7s
Completed 0d86e138-0da5-4028-8c10-88e65a43bc00 sandbox:agent:[email protected] Sandbox 4h ago 29s
Failed 48e2f4e8-969f-4efc-9f97-5e1ef773c803 sandbox:agent:[email protected] Sandbox 4h ago 31s
Previous Page 1 of 2 Next

Completed ec56e7e3-463e-4b01-ac0e-92218782689f

Started 4h ago · 36s · sandbox:agent:[email protected]

Steps (5)

mint-session 1410ms

brainfish-lookup 15149ms

judge-confidence 5212ms

{
  "reason": "No matching KB article or instructions
   were provided for resetting the password.",
  "question": "How do I reset my password?",
  "confident": false
}

log-escalation 3151ms

respond 3ms

Reach the system nobody has documented

Every step is real code Ballet wrote and can refactor or debug on request. That's why the hard workflows are possible: anything you can reach with an API, a database, or an MCP server, a step can do.

Play Code Connectors Runs
read-new-messages.js package.json { } Format
const DEFAULTS = { channelId: 'C09GTBBR248', lookbackHours: 24 };
const channelId = pick(input_data.channelId, DEFAULTS.channelId);
const TABLE = '46521173-4b06-4862-8d38-44f5d05fe221';

function parseMessages(blob) {
  const parts = String(blob).split('=== Message from ');
  for (let i = 1; i < parts.length; i++) {
    const isBot = BOT_HINTS.some(h => header.indexOf(h) !== -1);
    if (isBot) continue;
  }
  return out;
}

Logs

Ask it to change something

Generate a step from a description, refactor the one you're looking at, or hand it a bug.

Reach anything

APIs, databases, MCP servers, off-the-shelf connectors, and the internal service with no docs.

Simulate before you ship

Run one step against sample input and read its output and logs without touching the rest.

Leave a workflow running for a week

Ballet has its own data tables, so a playbook can run for days, pick up where it left off, and leave behind a record the next playbook reads.

Data tables : Voice Support Escalations
id T sessionId T question T reason # confidence T citations T status
test-session-escalate-1789158039441 test-session-esc… My invoice from L… no_knowledge 0 Empty open
test-session-escalate-2-178915819 test-session-esc… My invoice from L… out_of_scope 0.15 Managing subscri… open
no-session-1789159820748 Empty How do I reset m… No matching KB a… Null Null open
sess_test-1789159851801 sess_test How do I reset m… No matching KB a… Null Null open
no-session-1789160117228 Empty How do I reset m… No matching KB a… Null Null open
Data Structure + Row Filters Columns 1–5 of 5

Long-running work survives

A workflow that runs for days keeps its state in a table rather than in one process's memory.

Shared between playbooks

What the escalation playbook recorded is what the weekly summary reads. No export step in between.

A record you can query

Every run leaves rows behind, so the history is something you can filter rather than reconstruct.

You can read it before it runs

Workflows ship as code, so your engineers can review a diff when they want to and put a gate in front of the steps that warrant one. Every run is logged and replayable either way. Ballet is covered by Brainfish's SOC 2 Type II and ISO 27001 compliance.

Security & governance

What would you hand to Ballet?

Pick one workflow your team still does by hand. We'll build it and show you it running on your systems.