Case Studies

ImmoCRM Today: The Marketing CRM for Estate Agencies That Tracks Cost per Contract, per Creative

Six months after the original case study, ImmoCRM is a marketing-first CRM for estate agencies: cost per meeting and per contract at ad-creative level, CAPI feedback to Meta, Telegram for agents, a valuation widget.

3
attribution levels: campaign, ad set, creative
~145 zł
cost per meeting from valuation leads, vs ~550 zł
Lead + meeting
events sent back to Meta via CAPI
1 login
for leads, ads, deals, agents and follow-ups

Back in March I wrote up how we built ImmoCRM: a multi-tenant CRM that catches an estate agency's Meta leads in seconds and routes them to the right agent. That post is still accurate, but it describes maybe a third of what the system does now. Six months of running it for real agencies pushed it somewhere I didn't plan: it stopped being a lead inbox and became the thing an agency uses to decide where its marketing money goes.

I've looked hard for something comparable and haven't found it. There are plenty of real-estate CRMs, and they are almost all built around listings: offer management, portal exports, documents. ImmoCRM is built around the other side of the business, the one that pays for the ads. As far as I can tell it's the only marketing-first CRM for estate agencies on the Polish market, and I'd honestly like to be corrected if someone knows another.

Here's what it does today, with the caveats I'd want to hear if I were the one buying it.

MARCH Leads captured and assigned fast Spend still lived in Ads Manager No idea which creative paid off ROI discovered in Excel, quarterly fast capture · blind spend TODAY Cost per lead/meeting/contract, per creative CAPI tells Meta which leads booked Wyceniarka adds its own leads Contract → agent → ad, one record same speed, now with attribution
The March build solved speed. Six months of running it for real agencies added the half that answers "which ad actually paid".

Cost per contract, per creative

The question every agency owner asks is "which ads actually make us money", and the honest answer from most tools is "we know which ads produce leads". That's not the same question. A campaign can produce cheap leads that never sit down with an agent.

ImmoCRM tracks each lead from the ad it came from through the whole pipeline: contacted, meeting booked, contract signed, property sold. Because every lead carries its Meta ad id, the statistics view can roll costs up at three levels, campaign, ad set and individual ad, and show cost per lead, cost per meeting and cost per contract at each one. Next to each row there's the creative itself, thumbnail, headline and body, so "the video with the agent talking beats the still with the flat" is something you read off a table rather than argue about in a meeting.

Two ad sets can have the same cost per lead and a 5x difference in cost per meeting. Without this view you'd scale the wrong one.

The one caveat: attribution needs the ad parameters to arrive with the lead. Leads that come in without them, for example from a valuation form someone found organically, are shown separately as an attribution gap rather than silently assigned to the wrong campaign.

ImmoCRM statistics dashboard showing active leads, qualified leads, meetings, closed deals and the Wyceniarka funnel
The overview dashboard (demo data): leads, meetings and contracts next to the Wyceniarka funnel, agent leaderboard below.

Telling Meta what a good lead looks like

Every landing page and funnel carries the agency's Meta pixel, and the server sends a deduplicated Conversions API event for each lead, so nothing is lost to blocked browsers or a cookie banner nobody clicked. The part that matters more: when an agent moves a lead to "meeting booked" in the CRM, or from Telegram, ImmoCRM fires a Schedule event back to Meta for that same person.

So Meta isn't just optimising for people who fill in forms. It gets told, a few days later, which of those people turned into an actual meeting, and it shifts delivery toward people who look like them. Contract-signed feedback is the next step; Meta requires a monetary value on that event and we're still deciding how to attach commission data an agency is comfortable sending.

FROM CREATIVE TO CLOSED CONTRACT Ad creativeimage or video Leadcarries ad_id Agent assignedTelegram card Meeting bookedCAPI Schedule fires Contract signeddeal record Statsroll-up every stage keeps the ad_id, so the roll-up can be sliced by campaign, ad set or single creative
One record from creative to contract. Nothing gets re-attributed by hand at any stage.

Wyceniarka: leads that come to you

I wrote a separate post about the valuation widget, so briefly: a homeowner gets a valuation range for their flat, house or plot on the agency's own site, in the agency's branding, with no vendor logo. Before they see anything they're asked why they want it, so only people who say "planning to sell" land in the agents' pipeline. The result is a range (±5% for flats, ±7% for houses, ±15% for land), never a single number, so there's still a reason to call the agent. And the final screen shows the agency's phone, Instagram and client reviews instead of a dead end.

For the Poznań agency we run it for, in the same four months and the same CRM, regular Meta lead-form campaigns produced a meeting for roughly 550 zł and Wyceniarka for roughly 145 zł. I round those numbers and they're the agents' own status bookkeeping, not a Meta-reported conversion, but the gap is not subtle.

Landing pages and quizzes instead of lead forms

Meta's instant forms are fast and they produce the worst leads I've seen. People tap through without reading. So agencies on ImmoCRM build their own sales landing pages and quizzes in the funnel builder: a few questions about the property or the situation, a short pitch, then contact details. It's more friction, on purpose. Fewer people finish, and the ones who do actually meant it.

The last step of every funnel is the same as the valuation result: the agency's Instagram (with an optional auto-redirect), a one-tap WhatsApp button, and a carousel of client testimonials. The visitor leaves with a face and a phone number, not a "thank you for your submission".

Agents live in Telegram, not in the CRM

Agents don't open dashboards between viewings. So the operational side runs through Telegram. A new lead is posted to the team group and assigned either round-robin or by a manager picking a name; the assigned agent gets the card in a direct message. From that card they change the lead's status (the status list is the agency's own, configured per organisation), add a free-text note, and set or snooze a follow-up. All of it writes back to the CRM.

Inside the CRM an agent sees only their own leads, enforced at the database level, not just in the interface. Agencies that prefer a shared pool can switch a folder to "everyone sees everything" mode, but that's a choice, not the default.

Two things I didn't expect agents to use as much as they do: the follow-up calendar with a week view and "call again in 3 days / next week" presets, and the tasks list. Both send Telegram reminders with complete and snooze buttons. It's a small feature. It's also the reason leads stop dying at "nowy" after the first missed call.

Agents promote their own listings

An agent pastes an Otodom link into the CRM, ImmoCRM scrapes the listing (photos, price, description), the agent sets a daily budget, and a Meta campaign goes live for that property with tracked links. Stop, change budget or change the goal from the same panel. Leads from that ad land in the CRM tagged with the property, so "how much did we spend to sell the flat on Wilkońskich" has an answer.

No agency owner wants to be the bottleneck for every property ad. This removes them from the loop while keeping every złoty in the same statistics as the rest of the marketing.

Finding out where each agent leaks

The Agents tab shows the same funnel per person: leads received, contacted, meetings, contracts, with the conversion between each stage. One agent books meetings from 30% of leads and closes 10% of them; another books 12% and closes 40%. Those are different coaching conversations, and before this view the owner only saw "agent A did 3 contracts, agent B did 3 contracts".

There's a ranking on top of it (meeting-to-contract ratio, contact speed, average attempts, commission generated) and a monthly digest posted to the owner's Telegram, so the numbers show up without anyone remembering to look.

Messages, sequences, campaigns

From a lead's card an agent can send an SMS, an email, or open WhatsApp with a prefilled greeting in one tap (that one is a link, not an API integration, because a real agent typing the rest works better than a bot). Under the hood it's Twilio for SMS with opt-out handling, and Brevo for email.

Then the automatic layer:

  • Sequences. A flow builder with triggers (new lead, status changed, no contact for N days) and actions (send SMS, notify on Telegram, change status, assign an agent, add a note, call a webhook), plus delays, conditions and A/B splits. The standard one is a welcome sequence: a personal-sounding SMS from the assigned agent a few minutes after the lead arrives, another the next day if there was no answer.
  • SMS campaigns. When an agency has a few hundred leads sitting in "no contact" or "call back later", it builds a group from them and sends a single campaign: are you still thinking about selling? The replies re-enter the pipeline. It's the cheapest lead source an agency has and most never use it.
  • Newsletter. A monthly (or weekly, or fortnightly) series to every lead who consented: what changed on the local market, what changed in the regulations, what the agency sold. The draft is AI-written from the notes the agency supplies for that month; it refuses to invent market data on its own, which is the only way I'd ship an AI newsletter.

Contracts, sales and the actual return

When a lead's status becomes "deal", ImmoCRM creates a contract record: address, property value, commission percentage, which agent, and it splits the commission into office and investor revenue. Contracts then move through their own statuses (listed, sold, extended). Because every contract is still linked to the lead and the lead to the ad, the statistics can finally show return on ad spend at the level of closed sales, not "leads generated".

That number is the one owners were computing in spreadsheets, quarterly, by hand, and getting wrong.

Under the hood, briefly

Next.js and Postgres on Supabase, with row-level security doing the multi-tenancy so an agent, a manager and a super-admin hit the same tables and see different rows. Meta Graph API for lead retrieval, campaign creation and CAPI. Twilio for SMS, Brevo for email, Telegram Bot API for the agent side. Scheduled jobs handle sequences, follow-up reminders, newsletter sending, SMS campaigns and the monthly ranking digest. The valuation module has its own schema and its own scrapers for listing comparables per city.

SYSTEM ARCHITECTURE Meta Ads · pixel · CAPI ImmoCRM coreNext.js + Supabase + RLS Attribution + stats Telegram agent bot Twilio SMS + Brevo Wyceniarka schema Sequences + SMS camp. Newsletter scheduler one core, isolated per agency by row-level security
One core, wired to Meta on one side and to agents, messaging and the valuation module on the other. Everything scoped to the agency by RLS.

Nothing exotic. The hard part was never the technology. It was deciding that a CRM for agencies should be organised around the cost of a signed contract, and then making every feature feed that one number.

If you run an agency and your marketing reporting stops at "leads", ImmoCRM is at immocrm.pl. If you'd rather have something like this built for a different business, that's what we do.

immocrmreal-estatecrmmeta-adsattribution
Work with us →