Inspiration

An AI workflow that can dial a real person is different from other automation. A bad database write can be rolled back. A phone call cannot: someone's phone rang and a synthetic voice spoke to them. CALL-E even flags placing a call as irreversible and hands out a one-time confirmation token so a human can approve first. But in a real workflow that token gets passed straight from one step to the next in milliseconds. Nobody is actually in the loop. The safety check exists and gets skipped by default.

What it does

Switchboard is a control layer that sits in front of every CALL-E call. It takes custody of the confirmation token and refuses to release it until a person approves in a console. On top of that it adds host-owned scheduling, per-campaign call budgets, and policy checks: blocked regions, quiet hours, per-recipient rate limits, and a kill switch. One gate, three controls. It ships as an n8n community node plus a local operator console.

How we built it

Plain Node, no dependencies, no framework. A small core module holds the job store, policy engine, CALL-E adapter and runner; the n8n node and the console are thin layers on top. Everything routes through CALL-E's MCP tools (plan_call, run_call, get_call_run) via the CLI. The node was verified loading and executing on n8n 2.38. 27 tests, and a dry-run mode that lets you build an entire workflow without spending a single call.

Challenges we ran into

CALL-E is a new platform, and building against it surfaced four real gaps, each of which shaped the design. There is no cancel tool, so we schedule by holding the job rather than handing CALL-E a future time. result.extracted always returns a fixed run envelope rather than a caller-defined schema, so we validate what comes back and report the mismatch instead of claiming structured output we did not get. get_call_run can request a human with nowhere to send them, so the console became that inbox. And the supported-region list is documentation, not data, so our region check is an overridable dated snapshot.

What we learned

That the interesting problem with agentic phone calls is not making the call, it is deciding whether it should happen. Almost every other approach automates the dialing. The value is in the pause.

What's next for Switchboard

Porting the same control layer to Dify, Zapier, Make and HubSpot, since the policy, scheduling and budget logic is a plain Node module with no n8n dependency. Full transcript masking and a distinct unconfirmed state that halts a batch for manual review.

Built With

Share this project:

Updates

Submission history