Voice call-center workflow
Let realtime voice agents converse while Synapsor records durable customer evidence, CRM proposals, side effects, and replay.
Realtime voice systems optimize for conversation, but business audit often loses which data was used, what was promised, and which CRM change was approved.
Call transcripts, CRM updates, follow-up emails, summaries, and approvals often live in separate tools with weak replay.
Synapsor records call run steps, account evidence, summaries, CRM proposals, approval requirements, and email/CRM external actions.
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 guideSupport 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.
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
);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;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,
)