AI-Powered Voice Agents for Proactive Hotel Payment Verification

perk · Tech · 2024 · source Agentic: yes · promotional bias: low · source-backed · extracted with prompt 0.5.4 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: Business travel payment operations

Perk needed to prevent travelers from arriving at hotels whose virtual credit cards had not been charged, a rare but highly painful failure that required thousands of proactive hotel calls every week.

Constraints:

Architecture

Perk built a voice-agent workflow that began as a Make.com prototype and went to production before migration into internal infrastructure. The system reads Zendesk tickets that already contain hotel-call instructions, extracts phone number, hotel, guest, and payment-form context, and launches calls through voice AI integrations. The team split the call into staged prompts for IVR navigation, booking confirmation, and payment handling, with context carried between stages. Calls are transcribed, classified by an LLM against success/failure criteria, reviewed in spreadsheets and daily failure sessions, and iterated through prompt and evaluation changes.

Diagram confidence: reconstructed (reconstructed from prose).

flowchart LR
  payment-risk-detector["payment-risk-detector"] --> zendesk-ticket-source["zendesk-ticket-source"]
  zendesk-ticket-source["zendesk-ticket-source"] --> make-workflow-orchestrator["make-workflow-orchestrator"]
  make-workflow-orchestrator["make-workflow-orchestrator"] --> voice-call-agent["voice-call-agent"]
  make-workflow-orchestrator["make-workflow-orchestrator"] --> call-review-store["call-review-store"]
  voice-call-agent["voice-call-agent"] --> ivr-stage-agent["ivr-stage-agent"]
  voice-call-agent["voice-call-agent"] --> booking-confirmation-stage["booking-confirmation-stage"]
  voice-call-agent["voice-call-agent"] --> payment-stage-agent["payment-stage-agent"]
  voice-call-agent["voice-call-agent"] --> call-transcript-capture["call-transcript-capture"]
  ivr-stage-agent["ivr-stage-agent"] --> booking-confirmation-stage["booking-confirmation-stage"]
  booking-confirmation-stage["booking-confirmation-stage"] --> payment-stage-agent["payment-stage-agent"]
  payment-stage-agent["payment-stage-agent"] --> call-transcript-capture["call-transcript-capture"]
  call-transcript-capture["call-transcript-capture"] --> llm-call-classifier["llm-call-classifier"]
  llm-call-classifier["llm-call-classifier"] --> call-review-store["call-review-store"]
  call-review-store["call-review-store"] --> human-ops-review["human-ops-review"]
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
payment-risk-detector Identifies upcoming check-ins where the virtual credit card has not yet been charged. zendesk-ticket-source
zendesk-ticket-source Existing operational ticket queue containing hotel phone number, guest, hotel, and payment-form context. payment-risk-detector, make-workflow-orchestrator
make-workflow-orchestrator No-code production workflow that reads tickets, controls rollout volume, launches calls, and stores results. zendesk-ticket-source, voice-call-agent, call-review-store
voice-call-agent AI voice caller that executes staged hotel conversations about reservation and VCC charging. ivr-stage-agent, booking-confirmation-stage, payment-stage-agent, call-transcript-capture
ivr-stage-agent Prompt stage focused on getting through hotel IVR menus to the front desk. voice-call-agent, booking-confirmation-stage
booking-confirmation-stage Prompt stage that verifies the hotel and reservation before discussing payment. voice-call-agent, payment-stage-agent
payment-stage-agent Prompt stage that asks whether the VCC was received and requests charging now, at check-in, or at checkout as allowed. voice-call-agent, call-transcript-capture
call-transcript-capture Records call transcripts for classification, review, and prompt iteration. voice-call-agent, llm-call-classifier
llm-call-classifier LLM judge that classifies call success/failure and scores axes such as politeness and frustration. call-transcript-capture, call-review-store
call-review-store Spreadsheet and review workflow where humans inspect call transcripts, mark outcomes, and identify failure reasons. make-workflow-orchestrator, llm-call-classifier, human-ops-review
human-ops-review Customer care/product/engineering review loop for failed calls, prompt changes, and rollout confidence. call-review-store

Data flow

Perk detects reservations checking in within 48 hours whose virtual credit card has not been charged. Zendesk tickets supply call data to the Make workflow. The voice agent calls the hotel, handles IVR, confirms the booking, asks whether the VCC was received, requests immediate or check-in/check-out charging, and ends or escalates based on the response. The transcript is saved, an LLM classifies success/failure and quality axes, and the team reviews failures to improve prompts, evals, and rollout controls.

4 supporting quotes
“the traveler is going to check in less than 48 hours. The virtual credit card still doesn't have any charge on it. Let's call the hotel”transcript, stated
“connect to our sendes instance where we have the tickets that tell the customer care agent which hotel they needed to talk to call”transcript, stated
“the first one is the IVR so if there is an AVR you should handle that otherwise you move to the next one”transcript, stated
“we use an LLM to classify we don't have a machine”transcript, stated

Why this architecture

Perk used the existing Zendesk call-ticket queue and Make.com so the team could prototype and scale without touching backend code. The conversation was split into stages because one broad prompt behaved too aggressively and failed to handle IVR, reservation confirmation, and payment nuance. LLM transcript classification and human listening gave the team confidence to roll out without trusting a black-box success label.

4 supporting quotes
“we didn't want to start touching our back end because if we started to touch that it was going to take longer.”transcript, stated
“we actually released it to production with make because like we wanted to do it fast.”transcript, stated
“we separate the call in different moments”transcript, stated
“We were as a team everyone listening to the calls one by one and adding comments about what was the what the reason at the fader here.”transcript, stated

Models used: OpenAI · LLM · text-to-speech · speech-to-text · Make.com · Zendesk · Twilio · ElevenLabs · Deepgram

Scale

yes beginning of Q3 or" — transcript, stated

Alternatives considered (roads not taken)

Continue manual proactive hotel calls

Rejected because: The team had to call every hotel because they could not reliably predict which VCC would fail, creating around 10,000 calls per week.

“it's difficult to pinpoint which is the hotel or which is the BCC that's going to fail.”transcript, stated
“we have to call everybody like every hotel to make sure that the charges are made.”transcript, stated

Backend-integrated prototype first

Rejected because: Touching the backend would have slowed validation, while Zendesk tickets already contained enough call data.

“if we started to touch that it was going to take longer.”transcript, stated
“if we connect we can easily connect to sendesk extract all that information and start like running the prompt and making the calls”transcript, stated

Single mission-focused voice prompt

Rejected because: It became too verbose and pushy, lacked offramps, and kept pressing hotels even when they could not charge the card.

“our prompt and for the agent was very basic. It didn't have any like offramp.”transcript, stated
“So, it was focus on complete its mission at all costs or like never hang up.”transcript, stated

Patterns

prompt-chaining (conversation design)

The call is divided into IVR, booking-confirmation, and payment stages rather than handled by one broad prompt.

“we separate the call in different moments”transcript, stated
“we have one on IVR specifically like an agent that's only job is to get past the IVR of the hotel.”transcript, stated

llm-as-judge (evaluation)

An LLM evaluates call transcripts for success/failure and qualitative axes like politeness or frustration.

“the line is going to look to the transcript and it's going to judge and give a score.”transcript, stated
“for every axis of politeness, frustrations, you're going to give a score”transcript, stated

eval-driven-development (quality)

The team listens to failed calls, classifies outcomes, iterates evals, and uses daily review to guide prompt changes.

“we would listen for these kind of failure scenario and then determine if that was an area that we really needed to focus a specific prompt on.”transcript, stated

human-in-the-loop-gate (operations)

Humans review call transcripts and failed outcomes before trusting changes, especially because false positives can leave travelers stranded.

“Anything else is a failure because as well what we didn't want is false positives

cuz then we'll again be leaving guests with unpaid hotels.”transcript, stated

“none of those replace like you checking a bunch of calls for example after you do a change.”transcript, stated

Tradeoffs

Ship the Make.com workflow to production.

Chose Fast no-code production rollout with controlled ticket volume over Waiting for a fully internal backend implementation.

Rationale: The Make workflow already worked, could read Zendesk tickets, and let the team control rollout volume while they migrated later.

“make this prototype actually become the product.”transcript, stated
“We could easily control okay how many tickets we were reading at the same time and launching and as Phil say we had this spreadsheet we were with Google spreadsheet where we save everything and we can go there and mark like with that check mark okay was good was etc listen to everything.”transcript, stated

Start with strict success criteria.

Chose Low false-positive tolerance over Broadly accepting ambiguous hotel responses as success.

Rationale: False positives would leave guests arriving to unpaid hotels, so the team initially accepted more false failures and relaxed criteria through listening.

“our initial version was extremely strict like only if the hotel says as this exact words like I am going to charge the card for you now.”transcript, stated
“what we didn't want is false positives”transcript, stated

Use AI voice for a narrow high-volume operational call.

Chose Automated proactive hotel payment verification over Broad general customer-care automation.

Rationale: The VCC call had a clear mission, high volume, and existing structured ticket data, making it a good first production voice use case.

“we have a actual problem that pretty much the only way it can be solved is by this.”transcript, stated

Gotchas (what bit them)

A mission-at-all-costs voice prompt behaves badly with real hotel staff.

Root cause: The first prompt lacked offramps and kept trying to complete the payment mission even when the hotel could not comply.

Resolution: Add staged prompts, explicit handoff/offramp behavior, and failure scenario-specific prompt handling.

“It was very much a Karen as well at the beginning because our prompt and for the agent was very basic.”transcript, stated
“Can I speak to a manager if you cannot do it?”transcript, stated

Voice formatting matters for operational identifiers.

Root cause: Booking reference numbers and words like zero/O can be unintelligible if text-to-speech reads them naturally.

Resolution: Use text-to-speech markup, spacing, and pronunciation tweaks learned from call review.

“a booking reference number could be seven digits long number and it will describe this on the phone”transcript, stated
“We had to learn a lot of these early calls of kind of this texttospech markdown and putting spacing in between letters and numbers”transcript, stated

English prompts degraded German-call results.

Root cause: The LLM was effectively translating English to German and back, losing expressions and accuracy.

Resolution: Write prompts in the native target language, with help from a German-speaking data engineer.

“when we launch it in Germany we use Sherman the language but we left the prompt in English and we noticed that the data wasn't like what we expected”transcript, stated
“changing the prompt to German and we got help from one of our data engineer That's the German changing the prompt make us like get better results”transcript, stated

Evaluation

Perk evaluates the system from transcripts with LLM classifiers, strict success criteria agreed with accommodations teams, qualitative scores for politeness/frustration, Google-spreadsheet trace review, daily failure reviews, ground-truth human listening, and localized prompt checks after changes.

Metrics: successful card charge now · charge at check-in · charge at check-out · false positives · politeness · frustration · IVR failures · booking-confirmation failures · language-specific quality

4 supporting quotes
“we determined some kind of success criteria with our accommodations team”transcript, stated
“They will charge it when the guest arrive or when the guest checks out.”transcript, stated
“we still get together almost every day and we like let's check this data.”transcript, stated
“The ground truth are the best ones because best through a human so you know that you can trust but as a judge it's the metric but none of those replace like you checking a bunch of calls for example after you do a change.”transcript, stated

Outcomes

Perk moved from around 10,000 proactive manual calls per week to tens of thousands of AI-assisted calls weekly, with rollout controlled through ticket volume.

4 supporting quotes
“make this prototype actually become the product.”transcript, stated
“now we are at a much bigger scale making in the tens of thousands of calls every single week.”transcript, stated
“with this structure and stage moments that the performance increased a lot like was way way more reliable”transcript, stated
“having the prompt in the native language that you want to get the output it's something improves the results”transcript, stated