Adding commercial guardrails to Synthflow agents
You add commercial guardrails to Synthflow agents by inserting an API action at each commitment point in the flow: the action posts the drafted offer to EvalLayer's /authorize endpoint, the response comes back as flow variables, and the flow branches on the decision so the agent only speaks or books what passed policy. No code in the agent itself; the guardrail is one more action in the Visual Flow Designer.
Why no-code voice agents need an enforcement layer
Synthflow's pitch is speed: agencies and SMB teams ship phone agents for booking, lead qualification, and front-desk work without writing code, using flow templates, subflows, and a marketplace of prebuilt patterns. That speed has a flip side. When the builder is not a developer, the only place policy usually lives is the prompt, written in plain language, and a prompt is a suggestion the model follows most of the time. A caller who pushes back, bargains, or asks the right leading question can walk a prompt-governed agent past its limits, on a recorded line, in the client's name.
The agency angle sharpens this. One Synthflow workspace often runs agents for many clients, each with different pricing, refund rules, and claims they are allowed to make. Duplicating agents and hand-editing prompts per client does not scale and leaves no evidence of what was enforced. An external policy check does both: the rules live in a per-client policy object, and every decision returns an authorization_id you can show the client.
The interception point: an action before the say or send step
Synthflow's extension surface is its actions and integrations layer: flows can call external APIs mid-conversation, capture the response into variables, and branch on them, the same mechanism used for calendar lookups and CRM writes. The guardrail pattern uses exactly that. At the point in the flow where the agent has assembled an offer (a price, a booking with terms, a refund), add an API action that calls /authorize, then branch on the returned decision before the node that speaks or sends.
Configure the action as a POST with this body, mapping your flow variables into content and context:
POST https://api.evallayer.ai/authorize
Authorization: Bearer sk_your_key
Content-Type: application/json
{
"action_type": "send_quote",
"content": "Here is the offer text the agent intends to speak,
assembled from your flow variables.",
"context": {
"channel": "voice",
"platform": "synthflow",
"client": "acme-dental"
},
"policy": {
"max_discount_pct": 10,
"commitment_authority_usd": 300,
"forbidden_commitments": ["refund_promise", "delivery_date"],
"approved_claims": ["same_week_appointments"],
"required_disclaimers": [],
"blocked_topics": ["competitor_pricing"]
}
}
Map four response fields to variables: decision, approved_rewrite, authorization_id, and risk_score. If your Synthflow plan makes complex branching awkward, the same call slots into a Make or Zapier scenario between Synthflow and the outbound step; the architecture is identical, only the host of the HTTP step changes.
Branching on the four decisions
- allow: continue to the speak step with the original offer text.
- rewrite: speak the
approved_rewritevariable instead. The caller hears the compliant version, capped and corrected, with no refusal moment. - require_approval: branch to a callback path. The agent says the offer needs a quick sign-off and promises a follow-up; the draft and
authorization_idgo to a human queue via your CRM or a notification action. - block: branch to a redirect path, never speaking the draft, and log the
authorization_id. The violations array tells you which rule fired.
Latency in a no-code flow
Only check at commitment moments; greetings and qualification questions should never wait on a policy call. Deterministic policies (discount caps, authority limits, required text) return in milliseconds. Semantic checks take one to two seconds, which reads as a natural pause if the preceding node has the agent say something like "one moment while I confirm that." This is the same latency you already accept for a calendar availability lookup.
What to log
Keep the authorization_id with the call record your flow already writes to the CRM. For agencies, this becomes a client deliverable: a per-call ledger showing every offer the agent attempted, what policy said, and what was actually spoken. It is a materially better answer to "how do we know the AI will not overpromise" than a screenshot of a prompt.
Start with the demo
Run one offer through /demo/authorize (three free checks per day, no key) or the interactive demo before touching a live flow. Then read the authorization guide for decision semantics and policy design for setting per-client caps that match real authority.