tfpdev
All workCase 04 / 04
CRMAutomation

Real Estate CRM, Limassol

About 80 agents ran the busiest agency in the city on ten Telegram groups and a set of spreadsheets.

80
agents off Telegram
~1 hour
lead response, from about half a day
2.5 years
in production
Region
Limassol, Cyprus
Role
Tech lead
Duration
2022 – 2024 · 2.5 years
Status
Handed off.
Team
2 junior developers
StackPythonDjangoMongoDBTelegram Bot APIOpenAI GPT-3.5 / 4AWS

What was broken

The agency was the busiest in Limassol. Its operating system was ten Telegram groups and Google Sheets. The founder posted listings into each group by hand and collected replies by hand.

A lead that came in at noon got an answer in the evening, when an agent finally scrolled back through the group. Repeat clients were not recognized. Nobody knew the history of a property.

The segment was premium rentals, sales and offices. Each property carried a lot of information and a lot of conversation. All of it lived in chats.

What I did

  1. Build native instead of buying a CRM

    Django, Mongo, Python bots. A CRM with lead history, property history, who is working which property, and competitor tracking.

    Why

    The founder needed dozens of small features that off-the-shelf CRMs either did not have or sold in their most expensive tier. Every micro-feature became one more reason to own the code.

  2. The bot picks when to post

    An agent adds a listing to a queue. The bot chooses the time window and posts to the agency's own Telegram groups. Spam, competitor and scraper protection on the groups came with it.

    Why

    Posting by hand was the founder's full-time job. The groups grew once the timing became consistent.

  3. An auto-responder that chooses, not writes

    First-line answers in the groups came from an algorithmic responder with GPT-3.5, later GPT-4, choosing between prepared answers.

    Why

    Most first questions are the same. The model only had to pick, so it could not make promises.

  4. Parse the listings portal, do not retype it

    A parser for Bazaraki, the main local portal, with bot protection on the other side. It was the hardest scraping I had done at that point.

    Why

    A new listing had to be in the CRM minutes after it appeared on the market. That is the whole business.

  5. Follow the agents to the phone

    Once bots handled selection and posting, agents' work became calls. Calls were recorded, attached to leads and reviewed by managers.

    Why

    The CRM has to live where the work is. The work moved.

Proof

80
agents off Telegram
~1 hour
lead response, from about half a day
2.5 years
in production

Listings in, leads out, everything logged.

Architecture
Listings in, leads out, everything logged.leadsListings portalBazarakiParsernew listings in minutesCRMlead + property history80 agentsone interfacePosting botpicks the time windowTelegram groupsown, protectedAuto-responderGPT picks a prepared answerCallsrecorded, attached to leads

What I would do differently

  • Define the support boundary in the contract before the first line of code. Years of small post-handoff requests are a contract problem, not a code problem.

Stack

  • Python
  • Django
  • MongoDB
  • Telegram Bot API
  • OpenAI GPT-3.5 / 4
  • AWS