Building a CRM for My Small Business

Wait 5 sec.

I started Spatial Thoughts in 2020 as an online training academy. We have been hosting cohort-based training courses ever since and the business has steadily grown over the years. As with many small businesses, most of our data is scattered across spreadsheets, emails, and different SaaS platforms. As the number of training participants grew, I found it increasingly hard to find the data I needed to make decisions. For example, I frequently would go down a rabbit hole to answer questions like,Which of our participants received scholarships for a course but haven’t yet completed the certification?Can I get a list of our QGIS-certified participants from Germany?Do we know anyone who is skilled in both Earth Engine and Python and lives in Australia?We are launching a new course and want to reach out to everyone who has completed our intermediate Python courses. Can we get their emails?These were really difficult to answer and involved manual searches and digging through various spreadsheets. I had always dreamt of having a unified database that I could query and find an answer. This type of database – also known as a Customer Relationship Management (CRM) – is something out of reach for small businesses like mine. The costs and time involved for building something custom and tailored to my needs were never justified. But things have changed rapidly in the past few months. With AI-coding tools – like Claude Code – building systems like these is no longer out of reach. I spent a lazy afternoon with Claude Code and built exactly what I needed. Everything from data extraction to building a private web app. I was blown away by the capabilities of modern AI tools and want to share the process here.What I BuiltThe final result is a Flask app with a SQLite database. I only needed the app for myself, so I fire it up locally whenever I need. It is not hosted anywhere, and there is no login or user management. The homepage is a dashboard showing total enrollments, certificates, batches, and number of participants. I also added a map where you could click on a country and see total enrollments from there. There are quick links to browse various database tables.The main table is the People table with the profile information of a person, along with all the courses they have attended. Everything is editable, so I can update the fields with new information or add missing data. There is also a query page, where I can drill down to find specific matches. The screen below shows how I can find enrolled participants in a course who have yet to complete their certification. Data Extraction and CleaningThis was by far the most daunting task. The data needed to build this was scattered across multiple systems and files and was quite messy. I relied heavily on Claude Code to clean, merge, de-duplicate, join and prepare the tables. The primary source of my data was across the following systemsGoogle Sheets: We had separate spreadsheets for tracking certificates, scholarship applications and registrations, contact information for participants. I exported all of these as CSVsWordPress Website: We create a dedicated, secure page for each cohort, which has information on the schedule and participants. Some of the data – especially for the very old courses – existed only here. I exported my WordPress site as XML and used Claude Code to build a Python parser to extract relevant data in a CSV.Stripe Reports: All our payments are processed by Stripe, and we had a folder full of CSVs from each of the cohorts. This was used to fill in missing information not found in other sources.Eventbee Attendee Reports: We use Eventbee as the event management platform for registrations. This is the main source of information for the database. Unfortunately, there is a separate event page for each batch and required 3-4 clicks to export data from each page. A game-changer for the recently released support for Chrome MCP in Claude. This allows Claude code to programmatically browse, click and download data from Chrome without manual action. I prompted Claude Code to download and process CSVs for each of our events and within 15-mins it had completed the task and created a single CSV file with all enrollment data.Automating Download of Attendee Reports using Claude with Chrome MCPOnce all the data was extracted, I prompted Claude Code to join various CSVs, deduplicate the results and create a master file. This took multiple iterations, and at each step, Claude Code built a Python script for processing and cleaning the data. I would look at the output, list out the problems, and prompt again to build a script that addressed those. After a few iterations, I had a good clean data table that combined all the information I needed.Data extraction and cleaning scripts built by Claude CodeBuilding the AppWith the hard part out of the way – it was time to build the app. A suggested best practice is to use the Claude Code’s Plan Mode to zero-in on the requirement first. I used the plan mode to build an implementation plan and save it to a file. I then read-through the plan and made a few changes. Once done, I asked Claude Code to go and build the app.Prompt to create a planThe final implementation planThe app is relatively simple and straightforward so it took only a few minutes for the app to be ready. Claude also started a local server and opened up a tab for me to preview the app. I iterated on the design with a few more follow-up prompts.Added my company logo and asked it to use colors from the logo for branding the app.I wanted to add a map. So I downloaded the Natural Earth Admin 0 – Countries POV shapefile for India (which has the legally required international boundaries for India), used Mapshaper to simplify it and save it as a GeoJSON file. I then asked Claude to use this to add a Leaflet-based map showing the enrollments for each country.Added a feature to be able to merge duplicate records with an interactive confirmation view.ConclusionClaude Code helped me build something that was unthinkable just a few months ago. I believe that there is no better time to learn software engineering. AI tools handle a lot of the heavy lifting, but having a solid grasp of the fundamentals still makes a real difference in what you can build and how well you can direct these tools. The full code for the CRM is on GitHub — feel free to use it as a starting point for your own projects.