Handoff · Leasing

PropFlow Lead Intake — the client handoff

Written Aug 25, 2026 · Owner: unassigned (handoff) · Supersedes the removed website-lead-api-handoff page

The strategy is replacement, not integration. We are moving clients away from ILS / PMS lead-management intake. The client's website posts leads straight into PropFlow, and Clara owns the lead from the first second — reply in seconds, guest card created, follow-up cadence armed. The PMS stays the system of record; PropFlow becomes the system of work, starting at the front door.

Decided (Fede, Aug 25, 2026): PropFlow's intake endpoint replaces email-relay and ILS-feed lead delivery for client websites. Camellia is the reference implementation (short-term fix, in build now); every subsequent client site is pointed at the same endpoint with its own key.

The intake endpoint SPEC ONLY — build on demand

One endpoint, multi-tenant by construction. Server-to-server only — the visitor's browser never talks to PropFlow; the client site's own server (or their website vendor's platform) is the caller.

POST https://propflowai.co/api/leads/website
Header  x-propflow-lead-key: <per-client key>

{
  "propertyId": "1773625953462",      // required, must be on the key's allowlist
  "name":       "Raul Perez Foster",  // required
  "email":      "prospect@example.com", // required, validated
  "phone":      "(951) 404-9086",     // optional
  "bedrooms":   "studio",             // optional: studio | 1br | 2br | free text
  "movein":     "2026-09-01",         // optional, YYYY-MM-DD
  "message":    "Studio or 1bd Thanks!", // optional
  "locale":     "en"                  // optional: en | es
}
ResponseMeaningCaller's move
202Accepted — the regular lead flow is runningShow the visitor success
400 / 401 / 403Bad payload / unknown key / property not on this keyFix the integration; do not retry blindly
429Per-property rate limitBack off
5xxPropFlow-side failureFall back to the email path so no lead is ever lost

Camellia — the short-term fix SHIPPED Aug 25

Decision (Fede/Gera, Aug 25): only the short-term fix is built now; the API switch stays on paper. The short-term fix, both halves live in production as of Aug 25:

  1. Provenance stamp (propflowai #6251, merged): PropFlow's own outbound mail carries a hidden origin marker and only marked mail is skipped on ingestion — the "skip anything from our domain" rule that silently ate website leads Aug 22–25 is deleted. Website leads flow again through the email path.
  2. Neutral sender (camellia-site #19, merged + deployed): the form's notification email now sends from website@propflowai.co instead of Clara's own address — the "our mail vs a real lead" ambiguity is removed at its source. Subject, prospect reply-to, and body format unchanged (lead parsing keys on the body shape, verified).

The API switch for Camellia is specced and parked: camellia-site PR #18 ([HOLD], unmerged) holds the form-side change — inert by design until the endpoint exists and a key is configured. Do not merge it before both.

Open choice for Fede — the office inbox copy.
A — No email copy (recommended, and what Phase 1 implements): leads live in PropFlow (conversations + prospects board); the mailbox stops carrying a duplicate. Fewer moving parts, no sender-identity ambiguity ever again.
B — Add a marked FYI copy: camellia-site also sends a plain notification from a neutral address ("already handled by Clara — no action needed"). Keeps the team's inbox habit; costs a second path that can drift. Additive later if wanted — nothing in Phase 1 blocks it.

Onboarding the next client's website

What we hand a client (or their website vendor) is deliberately small:

  1. Their key — issued per client, scoped to their property IDs.
  2. The endpoint spec above — one POST from their form handler's server.
  3. The fallback rule — on 5xx, deliver the lead by email to their connected leasing mailbox.

Who makes the change depends on who owns the form:

Site typeExampleThe change
Custom / agency-builtCamelliaTheir developer swaps the email send for the POST — an hour of work
Vendor templateYale 25 Station (Apartments247 → RentCafe feed)The vendor points the form's lead destination at our endpoint instead of the ILS/PMS feed — one vendor integration covers every property on that platform
PMS-native siteRentCafe-hosted sitesReplace the site or intercept its lead notifications into the connected mailbox during transition; these convert last

Transition note: listing-site (ILS) leads keep arriving by email into the connected mailbox until the client turns those subscriptions down — nothing breaks mid-migration; the mailbox lane and the API lane run side by side, and both end in the same flow.

Work items

#RepoItemStatus
0bothShort-term fix: provenance stamp (#6251) + neutral form sender (camellia-site #19)Shipped Aug 25
1propflowaiPOST /api/leads/website: key auth → validation → synthesize inbound payload → existing queue → ingestion-log row (website_api) + rate limit + failure alertSpec only
2propflowaiTests: key rejection, property allowlist, payload validation, same-pipeline-outcome regression (reuse the Raul-shape fixture), publish-failure alertSpec only
3camellia-siteForm handler: PropFlow POST primary, SendGrid email fallback on error, honeypot/validation keptParked — PR #18 [HOLD], inert until 1 exists
4bothProd verification: real form submission with a test identity → prospect + conversation + Clara reply + website_api log row; honeypot submission → dropped, Sentry event, nothing in PropFlowWith the build
5opsKey issuance + env config on both Vercel projects (explicit go required for prod env writes)With the build
6propflowaiAfter a quiet month with the fallback unused: retire the email-relay special cases for the form's shapeLater

Constraints for the builder

Context: Aug 25 incident doc (the lead blackout + reasoning leak) · PR #6251 (provenance stamp, merged) · PR #6253 (tour-confirmation copy, merged) · current form handler: camellia-site src/app/api/contact/route.ts.

PropFlow Docs