Off-the-shelf CRMs are built for sales teams. I am not a sales team.
A CRM is two things. A customer record and a workflow. Most small business CRMs solve both for big sales organisations, and the workflow half is where the bloat lives. Pipelines, sequences, automations, lead scoring, multi-touch attribution, deal forecasting, territory routing. None of that exists inside a one-person studio in Malta where the workflow is "write the proposal, send the invoice, build the thing".
For a studio my size, the customer record is the part that matters. A name, an email, a mobile number, what status they are at, what they owe, what they paid, when we last spoke. That is it. Every CRM I tried for a Maltese SME started at a price that assumed I was running a team, and the free tiers locked the bits I actually needed. Searchable phone numbers. Custom fields. A clean export. Form submissions auto-landing as a contact instead of an email I have to copy paste.
The deeper problem is that every CRM is a place where customer data sits separately from the website. The contact form posts to one inbox. Contact records live in another tool. Calendar bookings live in a third. The lead does not become a customer record automatically, so I spent fifteen minutes after every form submission copy pasting fields into a CRM that was not doing the one job I needed it to do.
What a small business CRM actually needs.
When I sat down to write the spec, the list came out to six things. Nothing more.
- A customer record per email address, deduplicated. Case insensitive, so the same person submitting a form twice does not become two leads.
- A status per customer. Lead, proposal sent, proposal signed, deposit paid, waiting production, in production, delivered. Seven statuses that map to how a real project moves through a small Malta studio.
- Pending balance and paid balance, per customer. So at a glance I know what is outstanding and what landed.
- A mobile number field, fully searchable. Most CRMs treat phone numbers as a footnote. That is wrong for Malta, where the phone call is still the contract.
- Every public form on the marketing site becomes a CRM record automatically. Contact form, pricing wizard, booking modal, giveaway entry. Each one upserts a customer by email and tags them with a source.
- A calendar view of the calls I have booked. Same backend, same login. No tab switching to see today's schedule.
That is the entire CRM. There is no pipeline view, no segmentation, no marketing automation builder, no email sequence engine. It is a list of Blinkers (what I call my customers) and a list of calls. Two screens.
The build, in plain terms.
It is a Flask app with a SQLite database, sitting on the same VPS as the public Blinklabs website. Two main tables: customers and bookings. Plus a small events table for first-party analytics that does not need cookies or a third party tracker. The CRM lives at a separate subdomain behind a single login.
Every public form on blinklabs.eu posts to the same Python backend. The contact form, the pricing wizard, the calendar booking, the giveaway. Each submission runs through one shared upsert_customer function that either creates a new lead or fills in the missing fields on an existing one without overwriting anything you already have. Marketing consent is captured per submission, not assumed.
The build took roughly three weekends.
- Weekend one. The schema. The Blinkers list. The status pills, the search by name, company, email or mobile, and the dropdown filter. Form-to-lead wiring on the marketing site.
- Weekend two. The calendar integration. Pulling availability from the calendar I already use, writing the booked call back into it with a video link, and persisting the booking in the local database. Same logic later powered the admin "New meeting" page.
- Weekend three. The mission control dashboard. Pageviews, unique visits, wizard completion rate, form submissions, traffic sources, top pages. All from the local events table. Then the Blinker detail page with activity history and the topbar notification bell for today's calls.
Everything runs on one small Maltese VPS that was already serving the website. The only ongoing cost is the cost of that server, which I was paying anyway.
What I would skip if I started again.
Two things I built that I did not need.
The first is the wide date-range filter on the dashboard. I shipped Today, Last 7 days, Last 30 days, Last 365 days, and a custom range. I use Last 30 days. The rest are dead weight in the UI.
The second is the colour palette on the status pills. I gave each of the seven statuses its own colour: stone, mustard, blueprint, plum, terracotta, marker red, forest green. They look great in screenshots. In daily use, three colours would do the work: red for active leads, blue for in production, green for delivered. The other four are noise pretending to be information.
Things I added later that I should have built on day one: the archive feature (so finished clients can be hidden without being deleted) and the topbar notification bell that shows today's calls from any page. Both are five lines of database schema and one component, but they change how the tool feels from "screen I check" to "screen that tells me what I need to know".
Should you build your own CRM.
Probably not. If you are a Maltese business with a sales team, your CRM is more than half workflow, and an off-the-shelf option will be cheaper than my time. The major small business CRMs are mature, the integrations exist, and the team licences are not the issue.
You should consider building your own only if all of these are true:
- You run a one-person studio or a very small team.
- Your workflow lives mostly in your head, not in the software.
- You already write code, or you pay someone who does.
- You find yourself paying a monthly subscription for a CRM you only use as a glorified contact database.
If all four are true, two or three weekends and a SQLite file replaces a monthly subscription forever, and you get to shape every field around how you actually work. That is the only honest pitch.
The tradeoff.
What I gave up by building my own CRM is the long tail of integrations. There is no native Slack ping, no out-of-the-box email sequence builder, no off-the-shelf marketing automation. If I want any of those, I have to build them. So far I have not needed to.
What I got is a CRM that fits the shape of a one-person Malta studio exactly. Every lead from any form on the site becomes a Blinker automatically. Every call I have booked shows up in the calendar view. Every Blinker has the seven statuses that actually map to how a small project moves through this studio. It runs on a server I already had, it costs me nothing extra per month, and the data is mine.
The maths is simpler than it looks. If your CRM is doing nothing your inbox could not also do, and you are paying for the privilege every month, the build is closer than you think. The whole list of features I shipped above is one person and three weekends. That is the size of the problem most Maltese SMEs are actually solving.