Real estate lead sheet: from portal export to WhatsApp reply
Set up a real estate lead sheet with the right columns, dedupe rules and an automation that messages each new row on WhatsApp.

A real estate lead sheet works when every portal, ad and website enquiry lands as one row with the same columns, and a new row triggers a WhatsApp message to the buyer. This guide gives you the column layout, the dedupe rule, the webhook payload and the step-by-step automation, plus the failure cases that show up once real leads start arriving.
Columns your lead sheet needs
Most brokerage sheets grow one column at a time until nobody trusts them. Start with a fixed set and treat the first eight as required. Automation can only act on a row it can parse.
| Column | Example | Filled by |
|---|---|---|
| lead_id | L-20261031-0042 | Sheet formula or automation |
| received_at | 2026-10-31 09:14 | Automation (UTC, convert for display) |
| source | portal, meta_ad, website, walk_in | Import step or hidden field |
| listing_ref | the portal's reference for the property | Portal export or form hidden field |
| name | Khalid Al Mansoori | Lead |
| phone_e164 | +971501234567 | Normalized by automation |
| language | ar or en | Detected on first reply |
| consent | yes, with timestamp | Form checkbox or portal terms |
| purpose | own use or investment | Bot, question 1 |
| budget_range | free text or band | Bot, question 2 |
| area_or_bedrooms | Marina, 2 BR | Bot, question 3 |
| timeline | within 3 months | Bot, question 4 |
| status | new, contacted, qualified, viewing, handed_off, lost | Automation, then agent |
| assigned_agent | agent email | Routing rule |
| first_reply_at | timestamp | Automation |
| viewing_at | timestamp | Bot or agent |
Keep names, notes and free text on the right side of the sheet. Keep anything an automation reads or writes on the left, and never rename those headers once a scenario depends on them.
Where portal exports break the sheet
Portal leads reach you as emails, CSV downloads or CRM pushes, and each format has its own habits. The same buyer can enquire on two listings in one afternoon, so you get two rows with the same phone number. Phone numbers arrive as 0501234567, +971 50 123 4567 or 00971501234567. Arabic names sometimes arrive reversed or split across columns, depending on the exporrt.
Three rules fix most of it:
- Normalize every phone to E.164 before the row is written. If a number has no country code, assume the market the portal serves and flag it.
- Use
phone_e164 + listing_refas the dedupe key. A repeat enquiry on the same listing updates the existing row. An enquiry on a different listing adds a row but does not trigger a second opening message within the same conversation. - Never overwrite
statusfrom an import. Imports add rows and fill empty cells, nothing more.
Step by step: new row to WhatsApp reply
This is the flow we build into the Dubai Real Estate WhatsApp Bot, reduced to what a sheet-based team can wire up with Make, Zapier or n8n.
- Create two tabs.
Leadsholds the columns above.Logholds one row per message sent or received, withlead_id,direction,timestampandtext. The Log tab is what you will read when a buyer says nobody replied. - Set up intake. Portal leads come in by parsing the notification email or importing the CSV on a schedule. Website and ad leads come from a form that sends a webhook. Both paths end in the same step: normalize, dedupe, write the row.
- Check consent. If
consentis empty, route the row to a human instead of messaging. Write the reason intostatus. - Trigger on a new row. The automation watches for rows where
status = newandfirst_reply_atis empty, then posts the payload below to the bot. - Send the opening message. The first message to a buyer who has not messaged you in the last 24 hours has to be an approved WhatsApp template. Write it in both Arabic and English and pick by the
languagehint if you have one, otherwise send the bilingual version. - Qualify. The bot asks four short questions and writes each answer back to the matching column. A buyer who replies with a voice note gets it transcribed first, and the transcript goes in the Log tab.
- Write back. Set
first_reply_atthe moment the template is accepted by WhatsApp, not when the automation starts. Setstatus = contacted, thenqualifiedwhen all four answers are in. - Hand off. When a buyer asks for a viewing, or asks something the bot should not answer, set
status = handed_off, fillassigned_agentand notify the agent with the row link and the last five messages.
The payload that starts the conversation
Keep the payload flat and small. The bot does not need your whole sheet, only what it needs to greet the buyer and know which property they asked about.
{
"lead_id": "L-20261031-0042",
"source": "portal",
"listing_ref": "MRN-2BR-1187",
"name": "Khalid Al Mansoori",
"phone_e164": "+971501234567",
"language_hint": "ar",
"consent": { "given": true, "at": "2026-10-31T05:14:02Z" },
"received_at": "2026-10-31T05:14:02Z"
}
The automation should treat a non-2xx response as a failure and retry with the same lead_id. The bot should treat a repeated lead_id as a no-op. Without that pair of rules, a retry sends the buyer the same greeting twice.
Routing map
Once a row is qualified, who gets it is a lookup, not a judgment call. Put the rules in a third tab so a sales manager can edit them without opening the automation.
| If | Then |
|---|---|
| source = meta_ad and area is off plan | Assign to the off-plan desk, notify the desk channel |
| budget_range above your threshold | Assign to a senior agent, mark priority high |
| language = ar | Prefer an Arabic-speaking agent in the round robin |
| no agent answers within your set window | Reassign and alert the team lead |
| timeline = just browsing | Keep status qualified, send brochures, no agent alert |
Capturing ad and website leads with a form
Portal leads arrive with their own structure. Ad and website leads are the ones you control, so a form is where you can get clean data on day one. We build Qwenvo, a free form builder, and it fits here because the features this flow needs are all on for every account: webhooks to any URL, hidden fields for source, listing_ref and UTM values, partial submissions so a buyer who gave a phone number and stopped still shows up, a custom domain on a subdomain like enquire.yourbrokerage.com, no badge, and teammates. Our form to Google Sheets guide covers the sheet side in more detail.
Be clear about one limit. Qwenvo's one-click Google Sheets connection is still being rolled out, so today you send the submission by webhook into Make, Zapier or n8n, which writes the row. Qwenvo is also hosted in the United States, so if your compliance team needs European hosting for buyer data, Tally is hosted in Europe.
Failure cases and what to measure
The failures we see most often are boring ones:
- Template not approved. The first message silently fails and the row says
contacted. Only setfirst_reply_atfrom the delivery response. - Wrong country code. A number missing its prefix gets read as local to the wrong country. Flag any number that fails a length check.
- Two scenarios, one row. An import and a webhook both write the same lead within seconds. The dedupe key has to be checked inside the same step that writes the row.
- Sheet row limits and slow polling. If the automation polls the whole sheet every few minutes, it will get slow as the Leads tab grows. Archive closed leads monthly to a separate tab.
- After hours. The bot should still reply, but the handoff should wait for the agent's morning with the viewing request already logged.
Track four numbers per source: the gap between received_at and first_reply_at, the share of leads that reach qualified, the share that book a viewing, and the share that go lost before any reply. Those four show whether a portal is worth its fee and whether the bot is helping or just adding noise.
Questions teams ask
Can I keep the sheet and still use a CRM later?
Yes. The columns above map onto a CRM's lead object, and lead_id becomes the external ID. Export the Leads tab as CSV when you move.
Do I need the WhatsApp Business Platform, or will the regular app do?
Automated first messages need the Business Platform, through a provider or directly. The regular app and the Business app are fine for agents typing replies, but they will not take a webhook from your sheet.
What if the buyer replies in Arabic, English or a voice note?
The bot should answer in the language the buyer used and transcribe voice notes before extracting answers. Store the transcript in the Log tab so an agent can check what the buyer said.
How many columns is too many?
If an automation does not read or write it, it probably belongs in notes. Keep the working set under about twenty columns and the sheet stays readable.
Next step
Open your current sheeet and add the five columns you are missing from the table above, starting with phone_e164, consent and first_reply_at. Then send yourself a test lead through the webhook and check that a single row appears, with a timestamp, before anything messages a real buyer.
Dubai Real Estate WhatsApp Bot
Third-party platform and model usage billed to you directly. No lock-in. Live in 10 days.