All docs
Examples
Hosted workflow

Voice call-center workflow

Let realtime voice agents converse while Synapsor records durable customer evidence, CRM proposals, side effects, and replay.

Problem

Realtime voice systems optimize for conversation, but business audit often loses which data was used, what was promised, and which CRM change was approved.

Why app glue gets messy

Call transcripts, CRM updates, follow-up emails, summaries, and approvals often live in separate tools with weak replay.

How Synapsor helps

Synapsor records call run steps, account evidence, summaries, CRM proposals, approval requirements, and email/CRM external actions.

Value sources

Example names and seed ids are developer-defined. SESSION values are set by your backend. ARG values come from the SDK/HTTP call. Handles such as wrp://..., evidence://..., and agent-run://... are returned by Synapsor and should be stored for audit/replay.

Read the value-source guide
Expected outcome

Support teams can inspect the run graph instead of reconstructing the call from raw transcripts and provider logs.

Production checks

  • Realtime framework handles conversation; Synapsor handles durable trust state.
  • CRM updates are proposals until approval allows the external action.
  • Follow-up email is idempotent through the external-action outbox.
  • Run graph preserves account evidence, summary, handoff, proposal, and confirmation.
schema.sql
CREATE TABLE calls (
  id TEXT PRIMARY KEY,
  tenant_id TEXT NOT NULL,
  customer_id TEXT NOT NULL,
  started_at TIMESTAMP NOT NULL,
  status TEXT NOT NULL
);
agent.ddl.sql
CREATE AGENT WORKFLOW voice.customer_call_flow
SESSION REQUIRE tenant_id, principal, call_id, customer_id
ALLOWED CAPABILITIES (
  voice.answer_account_question,
  voice.summarize_call,
  support.create_followup_task,
  crm.propose_customer_update
)
ALLOWED EXTERNAL ACTIONS (
  crm.update_contact,
  resend.send_followup_email
)
CHECKPOINT EVERY STEP
ON RISK medium REQUIRE APPROVAL ROLE 'support_lead'
RETENTION RUNS 730 DAYS;
python
run = db.agent_runs.start(
    workflow="voice.customer_call_flow",
    input={"call_id": "CALL-7001", "channel": "voice"},
)

summary = run.invoke_capability(
    "voice.summarize_call",
    step_key="summarize_call",
    arguments={"call_id": "CALL-7001"},
    response_envelope=True,
)

crm_change = run.invoke_capability(
    "crm.propose_customer_update",
    step_key="propose_crm_update",
    mode="propose_only",
    arguments={"field": "followup_needed", "value": True},
    response_envelope=True,
)