A smart restaurant pattern is trapped inside unsafe, source-specific configuration.
The snapshot demonstrates useful Votel-native architecture: an order/reservation router, callable global handoffs, structured extraction, contact upsert, multi-agent order normalization and Stripe payment-link creation. But the connected path uses test-mode payment nodes, reusable credentials are embedded in the workflow, installed webhook URLs are invalid, and first-time contacts fall off both primary paths.
Core pattern
Conversation → order or reservation → structured capture → contact → fulfillment.
Payment path
Test mode is connected; live mode is disconnected; both installed payment webhooks are stale.
Credential safety
Test and live payment credentials ship inside reusable API nodes.
One inactive agent contains one large, commerce-oriented workflow.
GPT-5.6, Katie by Cartesia, multi-language, zero active channels, 2,182-word prompt.
Order and reservation intake, ten extracted variables, contact lookup, four LLM nodes, two Stripe APIs, two webhook triggers, email, SMS and hangups.
The library did not disclose a manifest; the observed delta was one agent placed in an Archive folder.
The connected order branch uses test-mode mapping and the test Stripe API; the live branch is disconnected.
Votel reports that both generated URLs point to triggers that no longer exist.
No email channel or SMS number is selected; the connected payment email targets a fixed external address.
No calendar, availability, capacity, booking, modification or cancellation node is installed.
No knowledge base, custom tool or enabled built-in tool. The main prompt’s menu section is empty.
Text version of this diagram
Installed by the snapshot: 1 agent (inactive, 0 active channels); 1 workflow with 28 functional nodes, 19 connected edges and 12 open outputs; 3 triggers (conversation started plus two stale payment webhooks); 10 extraction variables (5 order, 5 reservation). Referenced but not installed: 3 global variables (hours, city, delivery areas) and no selected shared knowledge (the prompt holds a menu placeholder). Not part of this snapshot: pipelines, stages, tags, forms, calendars, booking nodes, message templates, websites, funnels and every AI Assistant asset type.
Text version of this diagram
The agent (GPT-5.6, Cartesia voice, 2,182-word prompt) runs the DA Sea Food Agent workflow. The workflow is entered by a conversation-started trigger for chat, voice or SMS and by two payment-webhook triggers whose URLs are stale. It extracts ten variables that feed contact lookup or creation, creates Stripe payment links through test and live API nodes with embedded credentials, sends email with no sender selected, and has SMS nodes that are disconnected with no number. The agent prompt reads three restaurant global variables that are not installed and expects a menu knowledge base that is not selected. No calendar or table system exists although booking is promised. The opening-greeting channel is present with a blank greeting and no channel is active.
The intended handoff is sophisticated; the connected execution is not.
Workflow
RESTAURANT FULFILLMENTAgent
Prompt BuilderTools & IntegrationsShared Knowledge1 · Order
Only existing-contact Match continues. The no-match contact-creation output is open. The final email has no sender and targets a fixed external address, not the extracted customer.
2 · Reservation
The “restaurant owner” email is sent to the customer. No table availability or booking action exists.
Text version of this diagram
The conversation-started trigger (chat, voice or SMS) leads to the router. Place Order leads to the order conversation, an AI node with a one-sentence instruction and Auto-Continue off; Reservation leads to the reservation conversation. Neither conversation has a deterministic outgoing edge; each is meant to invoke a global static-response node once intake completes: the order handoff says a Stripe link was sent by SMS, the reservation handoff says the restaurant will call. Both conversation default outputs are open. The handoffs continue into subflows 2 and 3.
Text version of this diagram
The order handoff leads to the five-field extraction (name, phone, order, address, email), then to contact lookup or create matching on phone and email. Only Match continues, into the normalize-order subagent with a hard-coded menu; No match / created is open. Normalize leads to the test-mode price mapper with hard-coded Stripe price IDs, then to the LLM that merges metadata and line items, whose sample JSON is malformed, then to the Test events API that creates a Stripe payment link with an embedded test credential. Its Success output leads to the payment-link email, which has no sender and a fixed external recipient, then to hang up; its Error output is open. The live-mode price mapper, the live Stripe API with an embedded live secret, and the SMS nodes are disconnected.
Text version of this diagram
The reservation handoff leads to the five-field extraction (first name, date and time, phone, guests, email), then to contact lookup or create, whose First Name field reads the order extractor's name instead of the reservation extractor's first_name. Only Match continues, to the reservation email, which has no sender, a subject that calls it a notification to the restaurant owner, and the customer's extracted email as recipient; then hang up. No match / created is open. There is no calendar, capacity or booking action although table booking is promised.
Text version of this diagram
The Test events trigger leads to a customer confirmation email and then to a terminal restaurant order email; the Live events trigger leads to its own customer confirmation email and terminal restaurant order email. Both trigger URLs are stale after installation and neither has an event filter, a captured sample or a signature check.
The most important side effect has no safe environment boundary.
The connected order path generates a test-mode payment link. A separate live-mode path contains a live credential but is disconnected. Both payment webhooks are invalid after installation, and neither filters for a signed, successful payment event.
Understands free sides, premium add-ons and modifiers, but receives no deterministic schema validation.
Large hard-coded merchant catalog; unknown products are silently omitted.
The prompt’s sample JSON omits required quotes and commas before sending data to Stripe.
Test and live credentials are stored in reusable API nodes; only test mode is connected.
The payment-link email targets a fixed address and has no sender; SMS delivery is claimed but not connected.
Both installed webhook endpoints point to triggers that no longer exist and accept no validated event schema.
Text version of this diagram
The order conversation extracts name, phone_number, order, address and email. Name, phone and address are written to the contact record and used in the payment metadata and email body; order goes to the metadata and feeds the payment payload chain; email is used for contact lookup and creation but is not used as the payment-link recipient, which is a fixed external address.
Text version of this diagram
The extracted order text goes to the normalize-order LLM, which produces normalize_order as JSON. That goes to the test-mode price mapper, which produces Json with hard-coded Stripe price IDs and silently drops unknown products. That goes to the metadata-merge LLM, whose example JSON is malformed, producing merged_output with no schema validation. That goes to the Stripe payment-link API with a test credential, which returns payment / url, which goes to the payment-link email with a fixed external recipient; the SMS nodes are disconnected.
Text version of this diagram
The reservation conversation extracts first_name, customer_reservation_time, phone_number, number_of_guests and email. All five go to the reservation email; phone and email also go to the contact record; email is the recipient of an email whose subject calls it an owner notification. The contact creator's First Name reads the order extractor's name rather than first_name. The reservation time is not validated against any calendar and the guest count has no capacity check.
Twenty-two findings, led by exposed credentials and broken fulfillment.
Test and live payment credentials are embedded in workflow API nodes.
Votel says both installed URLs point to triggers that no longer exist.
The connected email does not use the extracted customer recipient.
Live nodes are disconnected while test mapping and API execution continue to fulfillment.
Both No match / Created outputs are open.
Internal operational instructions are emailed to the diner, not the restaurant.
The library promises table booking, but no calendar, capacity or booking node exists.
Email and SMS cannot execute as installed.
The agent says an SMS link was sent before link generation; the connected action is email.
The main agent must answer menu/pricing questions without a menu or knowledge base.
The food workflow has no governed safety response or staff escalation.
Identity, menu and merchant price IDs do not travel safely to a new restaurant.
No sample, payment-success filter, signature check or idempotency behavior is configured.
The generated payment can omit requested food without stopping the order.
Three LLM steps pass commerce data onward; the merge example is syntactically invalid.
Non-voice sessions can enter hangup-oriented paths.
Vague AI instructions and no simulator evidence leave intake completion nondeterministic.
Hours, city, delivery, timing and restaurant claims require one validated configuration.
Same-day rejection and callback promises are not backed by availability state.
The installed receptionist has no verified entry experience.
Typos and inconsistent restaurant naming weaken customer trust.
Completion and failure behavior remain unproven.
Secure the money path before polishing the restaurant persona.
-
1
Revoke and remove embedded credentialsImmediate
Rotate every exposed test/live key and move credentials into environment-scoped connection storage.
-
2
Rebuild the payment boundaryRequired
Select one environment, validate typed payloads, regenerate webhooks, verify signatures and deduplicate event IDs.
-
3
Repair first-time-contact pathsRequired
Connect both Created/No match outputs and test new and returning diners independently.
-
4
Separate customer and restaurant messagingRequired
Use verified recipients, channels and truthful delivery-state copy.
-
5
Install real reservation infrastructureRequired
Add availability, capacity, booking, confirmation, modification, cancellation and fallback.
-
6
Package restaurant configurationPortability
Parameterize identity, menu, pricing, modifiers, hours, delivery areas, destinations and merchant mapping.
-
7
Add food-safety governanceSafety
Install allergy/dietary boundaries, staff escalation and a prohibition on unverified safety guarantees.
-
8
Make commerce deterministicRequired
Validate product matches, quantity, modifier pricing, unknown items, amount and currency before side effects.
-
9
Configure and separate channelsRequired
Add greeting, email and SMS channels, then restrict voice-only nodes or branch by channel.
-
10
Run synthetic end-to-end testsTest
Prove new/existing customer, pickup/delivery, reservation conflict, unknown item, API error and signed payment-success cases.
Restaurant snapshot pre-audit complete.
This page preserves the installed-state findings. Corrections and saved proof are tracked separately so the original evidence is never overwritten.
Follow the remediation record →Text version of this diagram
Included in the snapshot: the agent prompt and routing, the order and reservation workflow branches, ten extraction variables, contact lookup and create, the payment-link chain with test and live nodes, and two payment-webhook triggers. Normal account setup the owner supplies: an email sender, an SMS number with consent rules, the restaurant identity with hours, city and delivery areas, a verified menu with prices and modifiers, a Stripe account and price catalog, a reservation calendar or table system, and a staff notification destination with escalation. Snapshot defects, kept separate: credentials embedded in reusable nodes (REST-001), webhook URLs stale after install (REST-002), a fixed external recipient on the payment email (REST-003), and the test-mode branch connected while live is disconnected (REST-004). Inherited account state, not attributed: an agency-level Social account.