Caller Identification & Routing — How the IVR Decides

Please review this against your real process. Anything wrong is a question for you to correct.

This page is for you to validate. It describes exactly how the demo IVR identifies a caller and chooses where to route them. We modeled it on your existing flow, with a few deliberate clean-ups noted in amber. If any step doesn't match how Wedgewood actually works — or should work — tell us and we'll change it. Nothing here is fixed.

The IVR gathers identity from two things: the number the caller is calling from and, if we don't recognize it, the account number they tell us. The line they dialed sets the brand (Wedgewood vs. Blue Rabbit) — unless the customer's own record says otherwise.

Decision Identified / proceed Hand to a person

Step 1 — Recognize the caller's number

Caller calls in
We take the caller's phone number and standardize its format (e.g., 404‑609‑1991 → +14046091991).
Does this number match a customer record?
We look for a customer whose phone number equals the caller's number.
Exactly one match
Recognized. Greet them by name and continue. → Step 3
More than one match
Two people share this number — we do not guess. Hand to a person with what we know.
No match
Unknown caller. → Step 2

To validate: in the demo we match on the Contact's Phone field. Your production process matches four phone fields (Asst, Other, Phone, Primary Contact — all E.164). Confirm the exact fields and order you want us to search.

Step 2 — Unknown caller identifies themselves

Are you a pet owner or a prescriber?
The caller states their role first (this steers the rest of the conversation).
"What's the phone number on your account?"
The caller says the number. We read it back digit‑by‑digit and get a yes before looking anything up.
Does that number match exactly one account?
Exactly one
"Ok, I've got you — welcome back." Identified. → Step 3
None, or more than one
Try again — up to 3 attempts total — then hand to a person.

To validate: 3 attempts, confirm-back before searching, and "ambiguous always goes to a person." These mirror your documented rules — confirm they're still correct.

Step 3 — Decide the brand (Wedgewood vs. Blue Rabbit)

Does the customer's record name a brand/portal?
Yes — record wins
Use the brand on the record (e.g., a Blue Rabbit customer is treated as Blue Rabbit) even if they dialed the other line.
No brand on record
Use the brand of the line they dialed.

To validate: the customer's record overrides the dialed line. This matches your Portal_Type override — confirm the precedence is right (record beats line).

Step 4 — Route to the right place

The AI establishes the facts; the phone system does the routing.
The AI never picks a queue — it records who the caller is, their brand, and what they want. Fixed rules then choose the destination, so routing is predictable and auditable.
If the caller is…They go to…
A prescriber (any brand)Prescriber queue
A Blue Rabbit pet ownerBlue Rabbit queue
A Wedgewood pet ownerWedgewood support queue
Unidentified, ambiguous, or anything unclearWedgewood support queue (a person always gets it — no dead ends)

To validate: these are the demo's queues. Tell us your real queues/skills and the exact intents that should reach each, and we map them.

The rules in plain English (the part to challenge)

1. A recognized number is greeted by name with no questions asked.
2. If a number matches more than one customer, we never guess — a person takes it.
3. An unknown caller states their role, then gives an account number we read back and confirm before searching. Three tries, then a person.
4. The customer's own record decides the brand; the dialed line only decides it when the record doesn't.
5. The AI gathers facts; deterministic rules route the call. The AI never chooses a queue.
6. No dead ends — every path a caller can take ends with either a resolved answer or a person, never a hang‑up on an error.
What we cleaned up vs. the original flow (for your sign‑off): your existing process searches contacts and accounts with slightly different fields and had a couple of inconsistencies (a count that filtered on active/owner while the fetch did not; a duplicate dead branch). The demo uses one consistent lookup in both places. If you'd rather we reproduce the original behavior exactly — quirks included — we will. Your call.