# Runbook — zero bookings (or a sudden drop)

> **Symptom.** *"tengo cero agendas esta semana"* · *"bajaron mucho las reservas"* · *"el link de
> agendamiento no se manda nunca"* · *"nobody is booking"*.
>
> This one starts with a measurement check, not a config check. A meaningful share of "zero
> bookings" reports are a counting problem, and every hour spent tuning the prompt before you have
> confirmed the number is real is wasted.

## What you need first

- The agent id, and the window the operator means ("this week" is usually 7 days, ask).
- Whether it is **zero** or **fewer**. Zero from a previously working agent is a break; fewer is a
  funnel question and hypotheses 4–6 are where it lives.

---

### H0 — Is the number real?

- **Test:** `list_schedules` for the window, and `get_agent_metrics` for the same period. Compare
  against the previous equivalent window.
- **Stop condition:** bookings exist but the operator's dashboard shows none → **you're done**, this
  is attribution, not conversion. Go to H1.
- **Trap:** if the metric dropped to zero across **several** agents at once, stop looking at any one
  agent. Simultaneous zeroing is almost always a shared cause — a rotated link, a changed landing
  page, a content change upstream — not something that happened inside each agent independently.

### H1 — Bookings happen but are not attributed

Conversions that come back through an integration are attributed by whatever key that integration
sends. If the lead books with a different email or phone than the one on the conversation, the
booking exists and the agent gets no credit.

- **Test:** take a known booking and check whether it is linked to the conversation.
- **Stop condition:** the booking exists unlinked → **you're done**.
- **Fix:** integration mapping, not the agent. Also worth telling the operator plainly, because they
  are usually measuring the agent by this number.
- **Note:** a terminal conversion property must come from the integration, never from an evaluator
  reading the transcript. A lead saying "ya agendé" is not a booking.

### H2 — The booking link is dead or obsolete

The single most boring cause and a repeat offender. The link is usually correct in the prompt and
stale somewhere else — the objections file, a keyword's literal response, a resource entry.

- **Test:** open the link the agent actually sends. Then search **every** SDK file for booking URLs
  and contact details, not just the prompt.
- **Stop condition:** the link 404s, or two files carry different links → **you're done**.
- **Fix:** update every occurrence in one change.

*Evidence: a marketing-agency agent — a dead Calendly URL surviving in the examples. A
training-program agent — a link pointing at a Typeform the creator had stopped using. A
local-services account — rescheduling instructions still routing leads to an email and phone number
retired months earlier, in two separate agents.*

### H3 — The agent promises the link and never sends it

A distinctive failure: the agent asks "shall I send you the link?", the lead says yes, nothing is
sent, and the agent then asks whether they saw it. Reads as a broken integration; is a flow bug.

- **Test:** read three conversations that reached the booking moment and check whether an actual
  link appears.
- **Stop condition:** the link is discussed but never present → **you're done**.
- **Fix:** the booking step needs to send the link in the same turn it announces it. Demonstrate it
  in examples rather than adding a rule about it.

*Evidence: a high-ticket coaching agent — the lead said "Dale dale", the agent never sent the link,
then asked if they had seen it. Found in a real conversation, not in synthetics.*

### H4 — A contact limit or property is cutting leads before the booking

If a gating property fires early, the agent goes quiet mid-funnel and those leads can never book.
This shows up as a booking rate that fell without the conversation quality changing.

- **Test:** `list_contact_limits`, then check how many conversations in the window hit one before
  reaching the booking step.
- **Stop condition:** a meaningful share of conversations are cut pre-booking → **you're done**.
- **Fix:** narrow the gating property. See `agent-not-answering.md` H6 — the same over-broad-property
  failure, measured at the funnel instead of at one lead.

*Evidence: a three-agent fleet sharing one property set, 2026-08 — an over-broad disqualification
property cutting roughly a fifth of sampled leads outside its own stated scope.*

### H5 — The qualification gate is stricter than the operator thinks

Examples that demonstrate turning business away teach the model to turn away leads the operator
wants. Because it is taught by example rather than by rule, nobody finds it by reading the rules.

- **Test:** read the examples for any case where the agent declines or defers a lead. Check that
  against who the operator actually wants to talk to.
- **Stop condition:** an example declines a lead the operator would take → **you're done**.
- **Fix:** replace the example. Do not add a rule saying "don't decline" — the example outvotes it.

*Evidence: a B2B services agent, 2026-07-17 — one example taught the agent to refuse a small business
even when it asked for the call, and another disqualified by stage. Real leads pattern-matched to
them despite the flow explicitly allowing a soft floor.*

### H6 — The booking moment has no handling for hesitation

If the lead asks what the call is, or hesitates after the link, and there is no scripted path for
it, the agent falls back to generic flow and the moment passes.

- **Test:** search the examples for a lead who asks "what is the call about?" or stalls after the
  link.
- **Fix:** add the missing scenario as an example.

*Evidence: a clinic booking agent — no specific script for post-link resistance, so the agent fell
back into generic booking examples; and a separate fix for a one-turn dry close with no framing.*

---

## When to stop

If bookings are genuinely zero, the link works, the flow reaches it, and nothing is cutting leads
early, then check how many conversations started at all in the window. A handful is not evidence
either way — it is too small a sample to call the agent healthy **or** broken, so read those
conversations individually rather than reasoning from the rate. If the volume is low and the
conversations themselves look right, say so plainly: this is a traffic or targeting problem, not an
agent defect.

If it is none of these, file it with the window, the conversation count, the booking count, and two
conversation ids that reached the booking moment and did not convert.
