How phone calls reach Clara
Explainer for the Situs kickoff · sources as of Oct 14, 2026
The question · Situs Group

How does a phone call reach Clara?

Caller Situs main line(303) 789-3030lives at Crexendo Staff phonesoffice hours Claranights, weekends The Phase 1 plan. Today the night branch goes to a call center.

Situs's tenants and prospects dial one number.

The plan: in the day nothing changes. At night and on weekends, that same number rings Clara.

Situs's phone company decides where the call goes. Our side decides what Clara does with it.

This deck explains every word in that sentence, then shows the four ways to wire it, the loop that dropped calls in September, and what is left to do.

situs-phone-wiring-2026-10 (Recommendation) · situs-kickoff-routing-talk-track (the pitch in one line)
Sources for this slide

The number: Situs's main line (303) 789-3030 and the Phase 1 recommendation come from artifacts/situs-phone-wiring-2026-10.html, "Recommendation" and the opening line.

The one-line pitch is the talk track's own: "Situs's own phone system decides the hours. At night and on weekends, Crexendo sends calls to Clara's number. In the day, nothing changes and we are never in the path." (artifacts/situs-kickoff-routing-talk-track.html).

The short answer

It is three settings in three places.
Situs owns one. We own two.

1 · Crexendo's ruleWhere Situs's number rings, and whenchanged bySitus's admin 2 · Our Twilio numberWhich Clara agent picks upchanged bya code merge 3 · Our rulesWho Clara may hand a caller tochanged bya code merge
  • Is it code?Partly. Layers 2 and 3 are files in our code. A merge puts them live.
  • Is it a proxy?Not in Phase 1. A proxy is a middleman every call passes through; in Phase 1 daytime calls never touch us. The next step, Clara first, does put us in the path, with a fallback.
  • Is it a permission at the carrier?No. It is a setting on Situs's own account, like call forwarding on your cell. Their admin clicks it, or Crexendo support does.
situs-phone-wiring-2026-10 · config/elevenlabs-phone-numbers.json · config/phone-registry.json
Sources for this slide

Layer 1 (Crexendo Time Frames on the main number, clicked by Situs's admin): situs-phone-wiring-2026-10, "Asks for Situs's Crexendo admin" and "What Crexendo can do". The admin role is an add-on seat feature; if nobody at Situs holds it, Dani at Crexendo makes the change (open question 4 on that page).

Layer 2: config/elevenlabs-phone-numbers.json in propflowai, "Source of truth for which line exists in the workspace and which agent it rings. Auto-synced on push to main via .github/workflows/sync-phone-numbers.yml."

Layer 3: config/phone-registry.json plus src/lib/domain/properties/clara-line-loop.ts and src/lib/domain/escalation/loops-back-to-clara.ts.

Not a proxy: under option (a) "Daytime calls never touch us" (wiring page, Recommendation).

The cast

Two phone companies, one voice brain,
and our code.

Callertenant or prospect CrexendoSitus's phone company Twilioour phone company ElevenLabsClara's voice Our codePropflow's server AppFolioSitus's PMS
Phone company (carrier)Owns a phone number and decides where it rings. Situs uses Crexendo. We use Twilio.
Phone numberThe digits people dial. It lives at the phone company as a setting, not inside a phone.
Clara's agentThe setup at ElevenLabs that listens, talks, and asks our code for facts and actions.
PMSProperty management system: the landlord's record of units, tenants, work orders. Situs uses AppFolio.
MCCAppFolio's Maintenance Contact Center: the call center Situs uses at night today.
situs-phone-wiring-2026-10 (Crexendo section; verification pass: vendor name, MCC) · docs/architecture/multi-channel-architecture.md (Voice)
Sources for this slide

Crexendo: Eileen said "Crescendo" on the call (speech-to-text). The wiring page's verification pass concludes Crexendo is "very likely, confirmed only by Situs's invoice or the domain on Dani's email". Crexendo runs on NetSapiens.

Twilio and ElevenLabs: propflowai docs/architecture/multi-channel-architecture.md, "Voice (ElevenLabs + Twilio)": Twilio connects to ElevenLabs Conversational AI; ElevenLabs handles the call and calls our tools endpoint.

AppFolio: wiring page, Phase 2: "routine tickets go into AppFolio for Beryl". MCC: verification pass row "What the after-hours slot points at today": MCC is AppFolio's Maintenance Contact Center.

One call today

Today, every Situs call stays inside Situs's phone system.

Caller Main lineat Crexendo Staffoffice hours MCC(720) 459-5986 dashed = most likely; not yet seen

In the day, the main number rings the team.

After hours it most likely forwards to MCC, AppFolio's call center. That is the 24/7 number tenants are given.

Phase 1 swaps one destination: MCC's number becomes Clara's.

Nobody has shown us that after-hours setting yet. Writing it down is Situs's first step, because it is also the undo. MCC leaves when Situs cancels it, so the on-call chain replaces it.

situs-phone-wiring-2026-10, verification pass ("What the after-hours slot points at today") · situs-crexendo-setup-steps step 1
Sources for this slide

"The 24/7 maintenance number tenants are given, (720) 459-5986, is MCC's line and is hosted on Twilio (carrier lookup). MCC is AppFolio's Maintenance Contact Center … The main number's after-hours slot almost certainly forwards there now. When Eileen shows us the slot, expect that number; Phase 1 swaps it for Clara's." (wiring page, verification pass, Oct 13).

"Write down where the main number's after-hours calls go today. That is your undo." (setup steps, step 1).

Glossary, part 1 · moving a call

A forward happens before anyone answers. A transfer happens after.

Forward Phonecompany B the call is moved before it rings Transfer Claraanswers Staff someone who answered passes it on
WordWhat it meansEveryday version
Forward (always)The number sends every call to another number.Mail forwarding after you move.
Time-of-day forwardForward only in set hours. Our Phase 1 plan."After 6, call our other store."
No-answer forwardRing here first. Nobody picks up in time, then forward.Voicemail, but a person answers.
Time frameCrexendo's name for a saved schedule: office hours, holidays.Opening hours on the door.
Ring groupSeveral phones that ring together for one number.Everyone at the front desk hears the bell.
TransferSomeone who answered (Clara) dials another number and passes the caller on.A receptionist walks you to a desk.
Crexendo KB 3883003, 3799671 (Time Frames, Answering Rules), 3933000 (Ring Group) as summarised in situs-phone-wiring-2026-10
Sources for this slide

Definitions follow the wiring page's "What Crexendo can do (sourced)" table: Time Frames (Always, Days of the Week, Specific Dates, Holidays, Custom; "does nothing until a number or user rule uses it"); User Answering Rules (Call Forwarding to voicemail, an outside number, or another user); Ring Group (per-user ring time, a Ring Timeout, then a next destination).

Everyday analogies are this deck's own teaching aids, not source claims.

Glossary, part 2 · the plumbing

How the pieces talk: caller ID, SIP, webhooks, menus, ringing.

Caller ID after a forward caller Mainline Clara Clara sees… caller's numberknows the tenant (303) 789-3030doesn't Which one? Open question for Crexendo.
WordWhat it meansEveryday version
Caller IDThe number shown as "who's calling". After a forward it may be the caller's, or the line that forwarded.A return address the forwarder might overwrite.
SIP trunkA direct internet pipe between two phone systems. No phone number is dialed.A private road instead of the public street.
WebhookA web address one system calls, automatically, to tell or ask another.A doorbell that wakes our code.
IVR / auto-attendantThe robot menu: "press 1 for leasing".The directory board in a lobby.
Ringback vs announcementWhat a forwarded caller hears: plain ringing, or Crexendo's "your call is now being forwarded".Ringing vs "please hold".
Night ModeA desk-phone button that sends calls to the after-hours destination right now.The "back in 10 minutes" sign.
Crexendo KB 3833512 (SIP trunk), 3833726 (forward announcement), 3762782 (Night Mode) · situs-crexendo-setup-steps (caller ID ask)
Sources for this slide

SIP trunk: "Made for customer PBXs. Needs a portal flag; super-user and reseller scopes have it by default." Forward announcement: "Forwards play 'your call is now being forwarded' by default. It can be swapped for Music On Ring or ringback, but only in the Admin UI (a Crexendo support job)." Night Mode: "an Always time frame toggled from a phone key." (wiring page, Crexendo table). An Auto Attendant menu option can route to an external number (verification pass).

Caller ID: setup steps, "Asks for Dani": "does the original caller's number come through, or does (303) 789-3030 show? Clara needs the real caller's number to recognise residents."

Webhook: this deck's plain definition; slide 9 shows the three webhooks ElevenLabs calls on our side.

Where does the wiring live?

Follow one night call through the three layers.

1 · Crexendo rule"after hours → Clara"theirs · Situs's admin clicks forward 2 · Twilio → ElevenLabs(720) 740-4240 → Claraours · one row in our code "a person?" 3 · Our ruleswho Clara may transfer toours · phone registry
Caller 1 · Crexendo ruleMain line, time frame"after hours → Clara"Situs's admin clicks forward 2 · Twilio → ElevenLabs(720) 740-4240 will ringClara's agentone row in our code, live on merge "a person?" 3 · Our rulesWho Clara maytransfer tophone registry, in our code TheirsOurs

Layer 1 is theirs.

A setting on Situs's Crexendo account. We cannot log in and change it. That is a feature: if we break, their daytime phones don't.

Layers 2 and 3 are ours.

Both are files in our code. Nothing is clicked by hand: a merge to main updates Twilio, ElevenLabs and Clara's rules.

situs-phone-wiring-2026-10 · scripts/sync-phone-numbers.ts header · config/phone-registry.json
Sources for this slide

Layer 2 deploys on merge: scripts/sync-phone-numbers.ts, "Reassigning a line is a one-line edit to that file + PR + merge — not a manual EL PATCH", "sync — Import any declared-but-absent number, then PATCH … Runs on push to main."

Layer 3: loops-back-to-clara.ts is "the SAVE-TIME loop guard, shared by every door that stores a number Clara will ring"; clara-line-loop.ts guards the call-time transfer.

"If we go down: after-hours only" for option (a): wiring page comparison table.

Layer 1 · the carrier setting

A rule at Crexendo decides where Situs's number rings, and when.

(303) 789-3030Time Frames:on Office hoursunchanged · rings the team HolidaysPSTN Number → Clara Default (nights, weekends)PSTN Number → Clara

Situs's admin opens the Crexendo portal and saves two schedules: office hours and holidays.

Then on the main number: turn time frames on, and point the after-hours slots at an outside number, ours.

"PSTN Number" is Crexendo's word for an ordinary outside phone number.

Crexendo documents this exact setup for its own AI receptionist. About 15 minutes of clicks. Any time not covered by a time frame falls to the Default slot.

Crexendo KB 3883003, 3801235, 3926840 · situs-crexendo-setup-steps steps 2, 4, 5
Sources for this slide

Setup steps: "Time Frames → Add Time Frame. Make 'Office hours' (Days of the Week, Mountain time) and 'Holidays' (Holidays, recurring)" (KB 3883003, 3799671); "Inventory → (303) 789-3030 → Enable Time Frames: Yes. Office hours: leave the destination as it is today" (KB 3801235); "Holidays and Default slots: Treatment 'PSTN Number', Destination +1 (720) 740-4240 … The Default slot covers nights and weekends" (KB 3926840).

"Unmatched times fall to an automatic Default slot" and "Crexendo's own AI receptionist guide: Treatment 'PSTN Number', Destination = the AI's number" (wiring page, Crexendo table). "About 15 minutes": talk track and wiring page.

PSTN (public switched telephone network) is the ordinary phone network; the gloss is this deck's.

Layer 2 · our number

Our Twilio number hands the call to Clara at ElevenLabs.

Twilio(720) 740-4240ours, bought Sep 30 ElevenLabs · Claratalks with the caller startduringend who is it?toolstranscript Our serverlook up tenant, file work order, … Our server is notin the voice path.It answers questions.

The number lives in our Twilio account. It is imported into ElevenLabs and tied to Clara's agent.

That tie is one row in a file in our code. A merge to main applies it automatically, so nobody types it in a dashboard.

Situs's number exists, but no Clara agent is tied to it yet.

Once tied, ElevenLabs runs the conversation and rings our server's webhooks for facts and actions.

config/elevenlabs-phone-numbers.json · scripts/sync-phone-numbers.ts · config/phone-registry.json (+17207404240) · src/app/api/voice/{personalization,tools,call-ended}
Sources for this slide

The binding: scripts/sync-phone-numbers.ts: a row's agent_id is "a BINDING … The sync PATCHes the live number until it rings that agent"; an "import": {"provider": "twilio"} block means "this number exists at the carrier but not in the ElevenLabs workspace; create it there on the next merge".

Situs's number: config/phone-registry.json, +17207404240: "in PropFlow's Twilio account (friendly name 'Situs Group — prod', bought 2026-09-30) with no voice or SMS webhook, not imported into ElevenLabs, and no property behind it". It is not yet a row in elevenlabs-phone-numbers.json.

Webhooks: routes src/app/api/voice/personalization (call start), /tools (mid-call tool calls), /call-ended (transcript). docs/architecture/multi-channel-architecture.md: "ElevenLabs makes tool calls to our /api/voice/tools endpoint during the call … When call ends, ElevenLabs sends a webhook with the full transcript."

Layer 3 · our rules

Our rules decide who Clara may hand a caller to.

Clara"a person?" Loop guardreads the registry Staff celldirect line: allowed Main lineforwards to Clararefused

The phone registry is our address book of every phone number we know. Each one has a kind.

property-lineA number Clara answers.
prototypeOurs, not live yet. Situs's 720 number today.
customer-forwardedA customer's line that forwards into Clara. Situs's main line.

Any number of those three kinds is refused as a transfer, a catch-all, or an on-call entry, because dialing it lands back on Clara.

config/phone-registry.json (_kinds) · src/lib/domain/properties/clara-line-loop.ts (CLARA_ANSWERED_KINDS) · src/lib/domain/escalation/loops-back-to-clara.ts
Sources for this slide

clara-line-loop.ts: "Both now refuse the same three registry kinds: property-line, prototype, and customer-forwarded." "FAIL CLOSED … When the answer is no, the answer is NO NUMBER … An empty pm_phone_number is a state the prompts already handle ('someone will follow up', then end the call)."

loops-back-to-clara.ts: the save-time guard "shared by every door that stores a number Clara will ring: the call-routing card (catch-all line, ring lists) and the emergency on-call list."

Kind definitions: config/phone-registry.json _kinds. Situs's 720 number was reclassified to prototype on 2026-10-14; it graduates to property-line when wired.

Is it a proxy?

We only become the middleman if Situs forwards every call to us.

ACrexendo day: staffClaranight only BCrexendo every callUs daytime calls sent back CCrexendo SIP pipe, no phone numberOur stack

A proxy is a middleman every call must pass through.

  • A · after-hours forwardWe only see the calls Crexendo sends at night. Not a proxy.
  • B · forward the whole lineEvery call passes through us, including daytime calls we send back. This one is a proxy.
  • C · SIPA direct pipe instead of a dialed number. Still only the calls Crexendo sends us.
situs-phone-wiring-2026-10, "The four options compared" · str-debrief transcript (Fede and Gera on forwarding the whole line)
Sources for this slide

Option rows, from the wiring page: (a) "office-hours slot unchanged, after-hours slot 'PSTN Number' → Clara's Twilio number"; (b) "Main number forwards 24/7 to Clara; our office-hours logic sends daytime callers back to a Situs number"; (c) "Crexendo sends calls over a SIP trunk to our stack instead of dialing a phone number".

Debrief, Federico: "forward the whole line, and we have logic that we just pick up certain times, or if there's something native on their phone line, that might be cleaner … Because the risk is, like, if we're down or something happens on our side, their whole phone line is down."

Option A · our pick for Phase 1

Crexendo sends only after-hours calls to Clara.

Crexendo Staffday: never touches us Claranight: one forward
Extra delay
One forward. Likely 1–3 seconds, plus Crexendo's announcement unless it is swapped for ringing.
Loop risk
None by design, as long as Clara never dials the main line.
If we go down
After-hours calls only. Twilio's fallback sends them to a human line.
Situs clicks
Time frames plus one setting on the main number. Self-serve if they hold the admin role.

Phase 1

Gera's 5-second budget fits it comfortably.

situs-phone-wiring-2026-10, comparison column (a) and the paragraph under it
Sources for this slide

Column (a): "Extra delay: One forward, likely 1–3 s plus Crexendo's forward announcement unless it's swapped for ringback. Measure on the first test call." "Loop risk: None by design, as long as Clara's own transfers never dial the main line." "If we go down: After-hours only. Twilio fallback sends calls to a human line." "Our build: S." "Verdict: Phase 1." Under the table: "Gera's 5-second budget fits (a) comfortably."

The Twilio fallback to a human line is listed as a Phase 1 build item ("Situs Clara number + ElevenLabs agent + Twilio fallback to a human line"), so it exists once the number is wired, not today.

Option B · forward everything

Forward the whole line to us, and we send daytime calls back.

Crexendo 24/7 Ushours logic Claranight day: sent back to a Situs number if that number forwards to us → loop
Extra delay
Night: same as A. Day: two extra hops on every staff call, the delay Eileen refused.
Loop risk
High. The Western Slope shape. Safe only if "back" is a number that doesn't forward to us.
If we go down
Situs's daytime phones go down too.
Why it's tempting
We control the hours. Fede's first preference for that reason.

Next step · being built

Chosen Oct 14 as the step after Phase 1, made safe with a fallback and the loop guard. See "Next step".

situs-phone-wiring-2026-10, column (b) · str-debrief transcript ("my preferred approach … that infinite loop issue")
Sources for this slide

Column (b): "Night: same as (a). Day: two extra hops on every staff call, the delay Eileen refused." "High: the Western Slope shape. Safe only if 'back' is a number that doesn't forward to us." "Situs's daytime phones go down too." "Verdict: Fallback only if Situs can't edit time frames."

Under the table: "Fede's preference was (b), 'forward the whole line with our own business-hours logic.' It gives us control over hours, but daytime reliability then depends on us, Eileen's no-delay ask fails during the day, and it is the exact shape that looped at Western Slope."

Verdict changed Oct 14: Gera chose this shape as the next step after Phase 1 ("Nights Sat, build wrap now"). The "Next step" slides show the version being built: daytime calls ring a staff number at once instead of going back to a Situs number that could forward to us.

Debrief, Federico: "So one is forward the whole line, which is my preferred approach … And then have logic on our side that says, okay, it's business hours, I'll just forward back. But then … You just get into that infinite loop issue. That's what I'm afraid of."

Option C · SIP, the "direct plugin"

A private pipe from Crexendo into our stack, with no number dialed.

Crexendoneeds support flag SIP trunk New way inwe'd have to build it Clara
Extra delay
Possibly a second faster than A. Unproven.
Loop risk
Low.
If we go down
After-hours calls only.
Cost
Crexendo support must enable it. A large build for us; SIP mode was ruled out in September.

Ask Dani, later

Only worth it if the delay is still a complaint after the ringing swap.

situs-phone-wiring-2026-10, column (c) and build list ("SIP way in · Later · L") · Crexendo KB 3833512
Sources for this slide

Column (c): "Possibly a second faster than (a); unproven." "Low." "After-hours only." "Needs Crexendo support: SIP trunks are reseller/super-user scope." "Our build: L: new way into the call (SIP domain or trunk) in front of the ElevenLabs/Twilio path; SIP mode was ruled out in Sep ('no whisper', July incident)." "Verdict: Ask Dani, later."

Build list: "SIP way in · Later · L · Only if delay is still a complaint after the ringback swap." The "direct plugin" is Eileen's phrase, quoted on the wiring page.

Option D · Phase 2

In the day, Clara catches the calls nobody picks up.

Ring grouprings ~20–25 s no answer Forwarding user"always forward" Clara "a person?" → same ringgroup → slow loop
Extra delay
The ring time Situs picks, plus one forward.
Loop risk
A slow loop if Clara's "talk to a person" dials the same ring group.
If we go down
Missed calls only.
Who wants it
Hugo, for when agents are out at showings. Gera and Fede are cooler on it.

Phase 2

Needs its own loop check: Clara's daytime transfers must dial direct staff numbers, never the ring group.

situs-phone-wiring-2026-10, column (d) and "Phase 2: missed daytime calls" · standup transcript (Fede: "a missed call agent")
Sources for this slide

Column (d): "Daytime ring group's no-answer destination ends at Clara's number." "Ring timeout (Situs picks) plus one forward." "Slow loop if Clara's 'talk to a person' dials the same ring group." "Missed calls only." "Verdict: Phase 2."

Phase 2 section: "daytime ring group → Ring Timeout (say 20–25 s) → a system user whose Answering Rule is 'Call Forwarding, Always' → Clara's number … Verify it in Situs's portal." "Hugo wants Clara to catch calls while agents are out at showings (Gera and Fede are cooler on it)."

Standup, Federico: "if no one answers the phone, you could route it to Clara and handle it … Like a missed call agent."

The four options side by side

A is the only option that is quick, loop-free and cheap to build.

OptionHow it worksExtra delayLoop riskIf we go downVerdict
A · after-hours forwardCrexendo's night and holiday slots dial Clara's numberOne forward, ~1–3 s + announcementNone by designAfter-hours onlyPhase 1
B · whole lineEverything forwards to us; we send daytime calls backDay: two extra hopsHigh (Western Slope shape)Situs's daytime phones tooNext step, being built
C · SIP pipeDirect pipe into a new entry point we'd buildMaybe a second less than ALowAfter-hours onlyAsk Dani, later
D · no-answerUnanswered daytime calls go to ClaraRing time + one forwardSlow loop via ring groupMissed calls onlyPhase 2
Recording for training works the same in A, C and D: Clara's calls are recorded on our side, staff calls on Crexendo. Only B puts everything through us.
situs-phone-wiring-2026-10, "The four options compared"
Sources for this slide

Every cell is a shortening of the wiring page's comparison table, except B's verdict: the wiring page says "Fallback only"; Gera chose B, with guards, as the step after Phase 1 on Oct 14. "Recording for training" row: (a) "Clara's calls recorded on our side; staff calls on Crexendo"; (b) "Everything passes through us"; (c) and (d) "Same as (a)".

The death loop · Western Slope, September 22

Two numbers that each send the call to the other.

caller Western Slopemain line Clara'snumber forwardsevery call transfers"a person" calldies
  1. Western Slope forwarded its whole main line to Clara.
  2. A caller asked Clara for a person.
  3. Clara's transfer dialed that same main line.
  4. The main line forwarded straight back to Clara.
  5. Round again. The caller heard ringing, or "an application error", then nothing.
On September 22, real calls dropped this way. Our write-ups count three.

Fede had approved dialing the main line on Sep 19, from traffic before the forward was switched on. The forward went live on Sep 21. The loop showed up the next day.

situs-phone-wiring-2026-10, "What happened at Western Slope" · clara-line-loop.ts header (2026-09-22 call log) · phone-registry.json customer-forwarded history
Sources for this slide

Wiring page: "Western Slope forwarded its whole RingCentral main line to Clara (Sep 7 decision). Clara's 'something else' transfer pointed at that same main line. The main line forwarded straight back to Clara, so on Sep 22 three real calls bounced and dropped (calls CA765a4f88, CA14680d90)." Talk track and PR #19591 also say three.

Count discrepancy, stated plainly: the code's own history in clara-line-loop.ts logs two loop-backs by call ID on 2026-09-22 (15:28:21Z: Clara dialled the main line, 1 s later an inbound call hit Clara's line with ForwardedFrom = Clara's own number, caller heard "an application error has occurred"; 15:53:43Z: same, caller heard ringing then the call died). This deck uses "three" as the write-ups do and flags that only two are documented by call ID in the sources read.

Timeline: clara-line-loop.ts, 2026-09-19 ruling, 2026-09-21 forwarding turned on, 2026-09-22 loop.

Why it happens

Phone companies forward blindly. They never ask "have I seen this call?"

A forwarding rule IF a call arrivesTHEN send it to (number) No memorydoesn't know who called before No hop limit foundnothing public at Crexendo

"That's on the telecom layer of the phone provider that you don't control, because they will blindly… if you set it up to always forward, no matter what."

Fede, Situs debrief

We searched Crexendo's documentation for loop detection or a forward limit. Nothing. So we assume there is none.

The only safe place to stop a loop is our side.
str-debrief transcript (Federico) · situs-phone-wiring-2026-10, verification pass ("Loop detection on the phone system")
Sources for this slide

Debrief, Gera proposed smart routing on our end ("if we've seen this before within the past … 20 seconds … now we absorb it"); Federico: "But that's not… that's on the telecom layer of the phone provider that you don't control, because they will blindly… if you set it up to always forward, no matter what … He'll come back, and then he'll forward. Come back, he'll forward."

Wiring page, verification pass: "Nothing public on NetSapiens loop detection or a forward hop limit. Assume none: the loop guard on our side stays the only protection." (searched cxdo.helpjuice.com and docs.ns-api.com, Oct 13).

The fix

Clara never transfers to a number that forwards to Clara.

Registry Loopguard Live transferSep 22 Ring lists#18002, Oct 8 On-call list#18002, Oct 8
  • Fix 1 · Sep 22A number the customer forwards into Clara is never a valid transfer target. Clara takes a message instead.
  • Fix 2 · Oct 8Saving a ring list or on-call list with a number that loops back is refused, by name, at save time.
  • Not built yet · part 2Spotting a forward automatically from Twilio's "forwarded from" data. Until then the list is kept by hand, so every forwarded line must be entered.
situs-phone-wiring-2026-10 (Fix 1, Fix 2, Not built) · loops-back-to-clara.ts (#18002) · clara-line-loop.ts
Sources for this slide

Wiring page: "Fix 1 (Sep 22): a number the customer forwards into Clara is never a valid transfer target. Clara takes a message instead." "Fix 2 (propflowai #18002, Oct 8): the call-center leg and ring-list saves run through the same guard. A teammate whose number loops back is refused by name when saved." "Not built (part 2): the guard reads a hand-kept list of forwarded lines. It does not yet detect a forward from Twilio's ForwardedFrom."

loops-back-to-clara.ts: "the call-routing card (catch-all line, ring lists) and the emergency on-call list … refusing at save tells the person saving it instead."

Where Situs stands · Oct 14

The safety pieces are nearly in. Connecting Clara is next.

Number boughtSep 30 On-call testedGera, then Fede …Main-line guardPR #19591, in review …Clara connectedwiring in progress ?Crexendo switchSitus, on our go
Done

On-call stand-ins

Gera, then Fede, until Situs sends its rotation. A live test proved both phones ring and get the texts.

In progress

Number and guard

Clara's Situs number, +1 720-740-4240, is in our Twilio but not connected yet. The main line's loop-guard entry is PR #19591, open and in review.

Off until Fede

Emergency switch

Situs's emergency switch stays off. Fede turns it on.

situs-kickoff-routing-talk-track ("What we've already done") · config/phone-registry.json (+17207404240) · gh pr view 19591 (state OPEN, Oct 14)
Sources for this slide

Talk track, "What we've already done": "In progress: Clara's Situs number, (720) 740-4240, is ours. It is not connected to Clara yet; that is being wired now." "In progress: Situs's main line, (303) 789-3030, is being registered so Clara can never transfer a caller back to it." "Tested: Emergency on-call list: Gera, then Fede, as stand-ins until Situs sends its rotation. A live test proved both phones ring and get the texts." "Off: Situs's emergency switch. Fede turns it on."

Correction to the brief this deck was written from: the main-line loop guard, PR #19591 ("register Situs's main line as forwarding into Clara"), was OPEN, not merged, when checked on Oct 14. It is shown here as in review.

Bought date: config/phone-registry.json note on +17207404240.

Situs's clicks

About 15 minutes of clicks, switched on only when we say go.

  1. Write down where after-hours calls go today. That is the undo.
  2. Create time frames for office hours and holidays, Mountain time.
  3. Stop and wait for our go. Steps 1 and 2 change nothing.
  4. Turn time frames on for the main number. Leave office hours as they are.
  5. Point Holidays and Default at (720) 740-4240. Save 4 and 5 together.
  6. Test call together from a cell, at night and in the day.

Through Dani at Crexendo: ringing instead of the forward message, call recording with download access for us, and an answer on caller ID.

The go-live test your cell Main line Clara Clara answers A few seconds of delay, at most You hear ringing, not a message Clara sees your cell, not the main line
situs-crexendo-setup-steps (steps 1–6, asks for Dani, go-live test) · Crexendo KB 3883003, 3801235, 3926840, 3833726
Sources for this slide

All steps are from artifacts/situs-crexendo-setup-steps.html, the page meant for Eileen and Dani: "Stop here until Propflow says go. Clara's number is still being connected. Steps 1 and 2 change nothing; steps 4 and 5 switch routing, so do them together on our go."

Go-live test: "During the after-hours window, call (303) 789-3030 from a cell phone that is not a Situs line. Check: Clara answers, the delay is a few seconds at most, and you hear ringing, not a forwarding message. Propflow checks that the call shows your cell number, not the main number. Call once during office hours too."

The off switch: set the Default and Holidays slots back to step 1's notes, or press Night Mode.

Still open · ask on Friday

Three answers we need from Situs before we switch it on.

Caller IDreal number, orthe main line? 2 ?Mysterynumbersring through to main Office hoursto the minute,holidays, weekend start Plus: whose direct number Clara givesa caller who insists on a person at night. Never the main line.
  • Caller ID passthroughWhen Crexendo forwards, does Clara see the caller's own number, or (303) 789-3030? She needs the real one to recognise residents.
  • The two other numbersSitus says two more numbers ring through to the main line. What are they, and should Clara cover them? Each one also goes into the loop guard by hand.
  • Office hoursOur hours must match Crexendo's to the minute, Mountain time.
situs-kickoff-routing-talk-track ("Questions to ask in the room") · situs-crexendo-setup-steps ("Asks for Dani") · situs-phone-wiring-2026-10 ("Open questions")
Sources for this slide

Caller ID: setup steps, "Asks for Dani at Crexendo". Two numbers: wiring page open question 3, "What are the two other numbers that route to the main line, and should Clara cover them?", and "Not built (part 2) … So for Situs, (303) 789-3030 and the two numbers that route to it must be entered by hand." Office hours: open question 1, "Our hours must match Crexendo's to the minute, Mountain time." After-hours person: talk track question 4, "It must be a direct line, never the main number."

Next step · after Phase 1 · being built, not live

Next: Clara first for every call.
Staff still pick up in the day.

caller Main lineforwards all Clara'snumberevery call Staffday: rings at oncecaller hears ringing Clara answersnights, weekends Recorded on our side: Clara's calls and staff calls

Phase 1, from Sat Oct 17, covers nights and weekends. Next, Clara's number becomes the front door for every call.

  • DayWe ring a staff number straight away. The caller hears ringing, nothing else.
  • NightClara answers, exactly as in Phase 1.
  • WhyEverything is recorded on our side, so we see what Clara said and what staff said.
Being built, not live. Fede turns it on.
Gera's decision, Oct 14 ("Nights Sat, build wrap now") · Situs meeting, Oct 13 (Gera, Hugo, Eileen) · situs-phone-wiring-2026-10, option (b)
Sources for this slide

The decision: Gera, Oct 14: "Nights Sat, build wrap now." Phase 1 (Crexendo time-of-day routing to Clara for nights and weekends) starts Sat Oct 17; Clara first for every call is built dark in the meantime.

Why, in Situs's own meeting (Oct 13): Gera: "if we get to the point where every single call is forwarded to us first and we can record everything, then we will have the whole picture of what the human said on the transfer, what Clara said." Hugo (speaker inferred from the transcript): "working towards it being on full-time as the first answerer for everything." Eileen, on the staff lines (DIDs) Situs paid for: "I'll let you in, you can train your model on all of my raw data."

This is option (b), changed. The Oct 13 wiring page ranked (b) "Fallback only if Situs can't edit time frames", and slides 13 and 16 of this deck carried that verdict until Oct 14. Gera chose it as the step after Phase 1, with three guards: a staff number that does not forward back, the loop guard enforcing that, and Twilio's fallback to staff.

Next step · the honest trade-offs

If we go down, Twilio rings staff directly.
Daytime calls pay one extra hop.

Clara'snumberat Twilio Our serverdown fallback Staffrings directly Loop guardstaff numbernever loops back Covers our server failing. A Twilio outage is not covered.
Extra delay
Day: one extra hop, likely 1–3 seconds, ringing only. Measured on a test call first.
If we go down
Daytime phones are affected. Twilio's fallback rings staff.
Loop risk
None while the daytime number does not forward into Clara. The guard refuses one that does.
Still to check
Caller ID on staff phones. Recording notice: Colorado is one-party consent; Situs may still want staff told.

Being built · Fede switches it on

Eileen asked for no "3-second delay". If one hop is still too slow, her "direct plugin" is option C.

situs-phone-wiring-2026-10, option (b) and the Twilio fallback build item · Situs meeting, Oct 13 (Eileen) · loops-back-to-clara.ts
Sources for this slide

Eileen, Oct 13: "I wouldn't wanna like have a hitch where it's like taking a 3-second delay to like basically patch you back in. I'd rather have you … like a direct plugin to our Crescendo system so you can pull out all the files and you have all the raw data." ("Crescendo" is the speech-to-text spelling of Crexendo.)

Delay, one hop vs two: the wiring page's column (b) says "Day: two extra hops on every staff call", written for a design that sends the caller back to a Situs number. In this design our side rings a staff number at once with ringback only, which is one added leg: the forward into Clara's number. Likely 1–3 s (the wiring page's estimate for one forward); to be measured on a test call before anyone turns it on.

If we go down: column (b): "Situs's daytime phones go down too." Mitigation: Twilio's fallback to a human line, a Phase 1 build item on the wiring page ("Situs Clara number + ElevenLabs agent + Twilio fallback to a human line"). It runs at Twilio, so it covers our server failing, not a Twilio outage.

Loop: column (b): "Safe only if 'back' is a number that doesn't forward to us." The save-time loop guard (loops-back-to-clara.ts) refuses any number registered as forwarding into Clara; Situs's main line is being registered that way (PR #19591, still open on Oct 14), so once it merges the main line can never be the daytime number.

Recording notice: Colorado requires one party's consent to record a call. Whether to tell staff anyway is Situs's choice. Caller ID: whether the caller's own number shows on staff phones after our hop is unverified; check it on the test call.

Recap

Situs's phone company picks the hours.
We pick who Clara may call.

Main lineCrexendo · theirs Staffday: untouched Claranight · ours never back to main
  • Layer 1, theirsA Crexendo time-frame rule sends nights and weekends to Clara's number.
  • Layers 2 and 3, oursOne row in our code ties the number to Clara (not done yet). The loop guard stops her dialing any number that forwards back.
  • Phase 1, Sat Oct 17In the day we are never in the path. If we break, only night calls are affected.
  • Next step, being builtClara first for every call, all recorded. Staff ring at once by day. Fede switches it on.
Slides 2, 7–10, 12, 19, 23 and 24 · situs-phone-wiring-2026-10 · situs-kickoff-routing-talk-track
Sources for this slide

Each line restates an earlier slide; see that slide's sources. Full research: docs.propflowai.co/a/situs-phone-wiring-2026-10. Talk track: /a/situs-kickoff-routing-talk-track. Customer-facing steps: /a/situs-crexendo-setup-steps.

Slide sources and interpretation

Sources

PropFlow Docs