POST-MORTEM #126
Next.js, Strapi, Python, Node.js, PostgreSQL
Listing inquiries from the site, ads, Property Finder, Bayut, and Zillow landed in inboxes and in Bitrix24 as separate people. The same phone number opened two pipelines. Nobody recorded which listing the caller had viewed, and every new lead was treated as urgent.
Next.js for the public site. Strapi for listings, area pages, and agent profiles. Node.js for portal and Bitrix24 webhooks. Python for the drip, user tracking, and the AI call. PostgreSQL for the lead and the call score. Portals in play: Property Finder, Bayut, and Dubizzle in the UAE; Zillow, Realtor.com, and the MLS feed in the US.
One lead record, many sources, including Bitrix24. Strapi is the listing record. The site, the alert, and the pipeline read it. Track the session first: listing, portal, campaign, and pages viewed. Then call. The AI call writes a score: important or low. Important alerts the agent. Low stays on the drip. A contract status cancels the queue.
Strapi holds the listing, the area guide, and the agent. Next.js publishes that content. Inbound webhooks from Property Finder, Bayut, Dubizzle, Zillow, Realtor.com, and Bitrix24 store source and listing, and Python merges on phone before a new pipeline opens. The session log is attached before the AI call. The call writes an important or low score onto the lead. The drip sends from a queue with an unsubscribe, quiet hours, and a stop when status is under contract.
The same phone posted from Property Finder and from Bitrix24 produced one lead and two source rows. A session that viewed the listing was on the lead before the call. An important score notified the assigned agent. A low score did not. A status change to under contract left the queue empty.