← Project plan
Spec for review · v3 · not locked

Lead & comms architecture, sequenced

Two channels: Ownership (the Foothold AI agent, sales + brand + the owner relationship) and PM operations (Liberty, native in Entrata, owns service + SLA). Every ownership message is signed – Foothold so the guest always knows who they're hearing from.

1. Where guests come in, and who answers

All text-based contact goes to the Foothold AI agent (one brain across web form, chatbot, email, SMS). Live phone calls forward to LAG.

→ Foothold AI agent (ownership)

  • Apartments.com / Zillow inquiries (lead email routed to agent)
  • footholdboise.com/[property] inquiry form
  • Website chatbot (same agent)
  • Email to the ownership address
  • SMS to the ownership number
One number + one brain. Acquisition, brand, first-touch, escalation. NPI controls its personality + context.

→ Liberty / LAG (operations)

  • All live phone calls (sales or service) forward to LAG, a human answers
  • Listing maintenance (Apartments.com / Zillow, in Entrata)
  • All service / maintenance / rent / lease contact
LAG lives entirely in Entrata. A forwarded call gets logged by LAG natively.
Voice, v1: all calls forward to LAG. After any forwarded call, the agent texts ~15 min later: "Just want to make sure you connected with someone and got your issue resolved, any feedback? – Foothold". Simpler than detecting missed-vs-answered, and it's on-brand. AI voice stays parked for v1, a sequencing call (see section 9).

2. The sequence

Left to right is time. The red line is the handoff. Entrata is the record underneath the whole thing; GHL (ownership's marketing brain) gets fed in parallel.

Stage →
1. Discover
2. First contact
3. Capture
4. Qualify & book
5. Operations
6. Retention
Ownership
(AI agent)
Brand site + the AI scorecard that grades the listings & feeds the PM
Agent answers form / chat / email / SMS instantly, 24/7
Qualifies + captures the minimum, then creates the guest card
Answers questions, books the tour or sends the application link
Mostly handed off. One post-tour feedback text (~1-2 hrs after): "questions, or where can we improve?"
Recognition touches + monitors escalations and the PM's SLA
PM / LAG
(Entrata)
Maintains the Apartments.com / Zillow listings (in Entrata)
Live phone calls forward here
Sees the guest card appear in Entrata
Watches the thread in Entrata
Runs the tour, leasing, move-in, all service, natively
Day-to-day service, maintenance, renewals
ENTRATA
(the record)
Listings + availability live here → syndicated to the ILSs
(native guest-card feed from Apartments.com)
Guest card created · sendLeads
Every message logged · updateLeads
LAG works natively · full thread visible
Service history + recognition tasks (floating work orders)
▲ HANDOFF: tour scheduled OR application submitted
Ownership active LAG active Entrata record grey = idle that stage
The minimum-info gate (stage 3): we don't create a guest card until we've captured first name + one contact method (email or phone). (Entrata's sendLeads only hard-requires the property ID, but a card with no way to reach them is garbage. The legacy ILS/MITS feed also wants a last name.) Until then the chat lives in NPI's stack only.
GHL gets everything. Every lead from every source (Apartments.com, chatbot, site, email, Entrata) is pulled into GHL too, that's the NPI-owned marketing brain running drip sequences, property updates, and recognition. Entrata is LAG's operational record; GHL is ownership's marketing record. Both get fed, the agent keeps them in sync.
Hard rule, full PM visibility: every one-to-one touch with a contact, a recognition card, a personal text, an escalation reply, anything we say to them directly, is logged to the Entrata thread (updateLeads), so Liberty sees exactly that Foothold reached out and what we said. Nothing happens with a contact that the PM can't see. The only exception is bulk marketing (drips/broadcasts), which don't log per-contact.
Pre-leasing on turn time: the moment a unit gets notice to vacate, the system reads the vacate date, adds Liberty's agreed turn SLA (say 3-4 days), and markets the computed available date to the waitlist: "available [vacate + turn], priority to applicants who can move in closest to that date." Fair housing: yes, this is fine. Move-in timing isn't a protected class, it's a neutral vacancy-minimizing rule. Keep it a written policy, screen everyone by the same criteria first and apply the timing rule among the qualified, and stay open to a reasonable accommodation (a family or disabled applicant who needs a few extra days). Just don't set the window so tight it predictably excludes families/disabled, that's the only disparate-impact risk.

3. Who owns what

ChannelOwnsHard line
Ownership
Foothold AI agent
Sales + acquisition + brand. First-touch, qualifying, booking, the listing scorecard, the owner relationship, recognition, and catching escalations (then handing them to Liberty, who owns resolution + SLA)No service tickets, no rent/lease admin, no operational or pricing promises
PM operations
Liberty, in Entrata
Operations + voice + listings. Tours, leasing, move-in, maintenance, rent, lease, renewals, all service. Owns all voice/phone (sales calls forward here too) and maintains the listings.Never leaves Entrata

4. Recognition touch map (proposed)

My suggestion, building on your leanings: mail for the meaningful and celebratory (and anything with a gift); text for the light, timely, relational. A handwritten card by mail is rarer now, so it lands harder. All from ownership, signed Foothold. (Researching the best card+gift-card API provider now.)

MomentChannelWhat + tone
Move-in (welcome packet)Mail + textWelcome card + $25 gift card (local). First impression. Once, at move-in.
Resident birthdayMail + textHandwritten card + $25 gift card (Amazon or local). 1-2/yr (per adult on the lease).
Before renewal (every unit)Mail + textThank-you card + $25 gift card, pet-themed (Chewy) if they have a pet, generic if not. Goes to everyone, not just pet households. The warm pre-renewal touch.
Tenure milestone (1 / 3 / 5 yr)MailCard + the experience gift per the tenure ladder. The big ones.
New babyMailCard (+ optional meal box). Celebratory, never a gift card.
Engagement / marriageTextLight congrats, no gift. Timely beats formal here.
Death / hardshipMailHandwritten sympathy card, no gift card (it'd cheapen it). Sincerity only.
Property updates & changesText / emailProactive heads-up on anything happening (paving next week, new package room, landscaping refresh). A small thing that makes residents feel like they matter and the place is theirs. Via GHL broadcast from ownership.
Cut: the automated post-service-issue satisfaction survey. It reads impersonal and gets unsubscribed. We just leave the service-call card, and they have the ownership number if they want to reach us.
Fulfillment (researched): two providers cover all of it. Handwrytten mails a real handwritten card with a physical gift card enclosed via API (~$32-34 for a card + $25 Amazon card; ~$4 card-only for sympathy). Tremendous sends a digital gift card by text, free to use, Amazon + 2,000 options, fund by ACH to skip the 3% fee. Skip the ABM platforms (Sendoso, Reachdesk), they carry $15-25K/yr minimums for what we'd do with two API calls. Every send also logs a note to the Entrata thread, so the PM sees the touch.
Gift-card touches (spec for now): welcome, birthday, before-renewal. All three carry a $25 gift card. Each one gets a follow-up text the night the gift card lands, "just want to make sure you got your package", which confirms receipt and opens the review-ask door (section 6). The other touches carry no gift card (sympathy = card; marriage / property updates = text). Tenure-milestone experience gifts + new-baby boxes are a later add.
$250 / $250 resident referral. Refer a friend who signs a lease (within 12 months of the code) and you both get $250 in rent credit, tracked by code from first touch so it pays even months later. The agent surfaces it at the natural highs (the move-in kit, after a recognition touch, in the relationship cadence) and it rides on the referral flyer. The off-platform, resident-to-resident demand lever.

5. If a resident brings ownership a problem

Liberty owns maintenance, service tickets, SLA, and resolution, that's what they're paid for, and we don't second-guess it ticket by ticket. But a resident who texts the ownership number with a problem can't be left hanging.

  1. Acknowledge, instantly: "Got your message. This is our property manager Liberty's responsibility and they're great at taking care of you. We've passed it to them and they'll be in touch shortly. – Foothold"
  2. Hand it to Liberty as a work order / note in Entrata, and let them run it. No nightly SLA-policing, that's their job, not ours.
  3. Watch the scoreboard, not the plays. We don't monitor individual tickets. If Liberty slips, it shows up in the aggregate, the resident-rating trend, review velocity, and renewals on the scorecard. That's the owner's altitude.
Why the restraint: re-policing every ticket would make Foothold a second management layer, defeating the point of paying a pro PM. As long as Liberty's at or above market on responsiveness, we keep the resident relationship warm and let them operate. (If NPI ever vertically integrates PM, this changes.)

6. Social proof engine (gathering reviews + testimonials)

Reviews are a conversion multiplier on both ends: they lift ILS rank (a listing with ≥1 review gets up to 50% more leads; renters filter on 4.5★) AND they lift the site funnel (land → pick a unit → apply / join the waitlist). So gathering them runs like a machine, timed to the moments residents are happiest.

The line that keeps it legal: trigger on EVENTS and ask everyone at that event, never filter by sentiment. Asking all residents after move-in is fine; asking only the happy ones, or screening a review before it goes public, is review gating, which Apartments.com, Google, and the FTC prohibit (Apartments.com flags it for 90 days). Timing to emotional highs is legitimate; sentiment-gating isn't.
Trigger (emotional high)WhyAsk
~2 weeks post-move-inSettled in, welcome packet landed, strong first impression. (Not day 1, they haven't experienced us yet.)Auto-text after the welcome packet
After a recognition touchSurprised + delighted by the card / gift, but keep it light.A soft "just want to make sure you got your package" that opens the door, not a hard ask
Lease anniversary / renewalCommitted and loyal, they re-signed.Auto-text at renewal
The machine: the worker watches Entrata (move-in date, anniversary) + our DB (recognition sends) and fires the ask by text from the ownership number with a smart link to Google + Apartments.com. The same ask invites a short on-site testimonial (a line + optional photo). Public reviews flow back into the ILS scorecard (rank) and onto the site; testimonials feed the footholdboise.com funnel (homepage + property pages) to lift land-to-apply. Every ask is logged to Entrata.
Don't spam. We ask at events, but never re-ask a resident who's left a public review in the last ~12 months, and we space the touches so it never reads like a campaign. One good ask at a real high beats five nags.
The move-in packet is a Foothold touch, personalized. A handwritten welcome card + a local gift card mails from ownership via Handwrytten at move-in. The "First Week in Boise" booklet only goes to renters we know are relocating, a 30-year local doesn't need it, so we tailor by what we actually know about them (more custom = better). It sets up the ~2-week review ask. Possible personalization source, TBD: if Liberty's phone system exposes call transcripts, they're a rich (and sensitive) well of resident life-context, consent-gated, worth asking Liberty about.

7. Edge cases

Green = locked. Amber = decided, pending an Entrata/API confirmation (research in flight).

ScenarioHandlingStatus
Resident texts ownership # for a ticketAgent logs it into Entrata + redirects, gently: "service requests go to [LAG #], but no big deal, we took care of it this time." Number's more visible, so this'll happen, it's fine.Locked
Guest plays mom & dadBoth read the same Entrata record; agent reads LAG's latest activity before replying and makes no ops/pricing promises; ownership routes back, never overrules.Locked
Any forwarded phone call~15 min later the agent texts to confirm they connected + ask for feedback. No need to detect missed-vs-answered.Locked
Emergency by text to ownership #Confirmed: agent files an Entrata work order with maintenancePriorityId set to the property's emergency tier (read once from getWorkOrderPickLists) + alerts LAG. Surfaces like a native emergency. Just map each property's emergency priority value.Locked
Agent down / API write failsBackup email notifies the Liberty PM with the lead + message context, nothing lost while it's down.Locked
Handoff pointOwnership owns through tour scheduled or application submitted; LAG owns everything after. Plus the one post-tour feedback text.Locked
The application itselfConfirmed: it's Entrata's ProspectPortal, live + self-service. footholdboise.com links straight to the property's apply URL ([property].prospectportal.com/.../application_authentication/), zero friction, apply anytime. Abandoned-app follow-up: poll getLeads for an in-progress status gone stale (verify the per-property status IDs with one test application).Locked
Which number whereOwnership # on website + marketing. On service surfaces (lease, packet, portal, service-call card), LAG # is bold/front-and-center, with a small footnote: "Feedback for ownership? [Foothold #]."Locked
Ownership # gets service tickets / serves residentsYes by design, it's the visible, relational number (birthday texts, life events, "got your card?"). Service tickets that land there get auto-saved + redirected. Foothold stays the forward-facing brand keeping the PM honest.Locked
Do scorecard + gifts need PM tasks in Entrata?No tasks, but yes visibility. Gifts auto-send (Handwrytten / Tremendous) and the agent logs a note to the Entrata thread ("mailed birthday card + $25 gift card"), so the PM sees it, no action needed. Scorecard/metrics = a weekly email (or ops-site login), not in Entrata. Actual service tickets/emergencies on the ownership channel get written as work orders LAG acts on.Locked

8. Context & data freshness (the EliseAI lesson)

This is the whole ballgame. Liberty fired EliseAI because it ran on stale availability data, told prospects units weren't available when they were, and sent leads away. Not an "AI can't do it" problem, a bad-context problem. The Foothold agent can never make that mistake.

The fix is architectural, not just a better prompt. Foothold gets its own datastore (Supabase / Postgres) the agent reads from, kept fresh from Entrata by a background sync. Freshness is tiered, because nightly is fine for amenities but fatal for availability:

DataFreshnessHow
Availability + pricingNear-real-timeBackground poll every few minutes into Supabase, plus a live re-check of the specific unit right before the agent quotes it or sends the apply link. This is the EliseAI-proof.
Floor plans, amenities, property factsSlow (nightly)Nightly Entrata sync.
Lead + conversation stateReal-timeLives in Supabase / GHL, updated as it happens.
Resident facts (lease, pets)DailyDaily pull for the recognition engine.
Why cache instead of just hitting the API live per question? Latency isn't the issue (a live call is a few seconds, fine). The blocker is Entrata's rate limit: 1 call per property per minute per method. Two guests asking about availability in the same minute already exceeds it and the call fails. So a poller keeps the Supabase cache fresh within the limit, the agent reads the cache, and the live re-check is one targeted call at the commit moment, used sparingly. For 2 properties at launch you can lean more live; the cache is what keeps it from breaking as volume grows.
The hard guardrail: the agent never states availability or price without a fresh read. If the cache is stale or the API's down, it says "let me confirm that and get right back to you", it never guesses. That one rule kills the EliseAI failure mode. (The agent's full personality + guardrails are their own work session; this is the data-architecture half of it.)
Telephony (planned): agent SMS + voice routing on Twilio direct (not GHL, which stays for bulk drips). A site-wide brand number + a per-property local 208 number, so an inbound text/call already tells us the property. Compliance: A2P 10DLC (Brand + Campaign via Twilio), consent capture + STOP handling, all numbers under one campaign.

9. The voice question (answered: forward to LAG)

Researched the real 2026 state of AI voice leasing. Verdict: forward calls to LAG for v1. Don't put AI voice on the front door.

You're right on both counts, voice isn't more stale, and it isn't a bigger fair-housing risk. Same brain + same guardrails says the same words whether typed or spoken, so both the data risk and the FHA risk are medium-agnostic. The one real delta was auditability (no transcript by default), and your transcript-to-Entrata idea closes it: log every call via updateLeads, same as a chat. With disclosure up front ("this is Foothold's AI assistant, ask for a person anytime") + one-tap transfer, voice is no riskier than chat. So v1 = forward to LAG is purely a sequencing call: prove the data layer + the agent's guardrails on the easier-to-tune chat surface first, then point the same proven brain at voice. A maturity decision, not a liability one.
The dependency it all rides on: Entrata API write access (updateLeads + sendWorkOrders) and live-availability reads. Liberty requests it week 1.