Local Business Voice - A technical perspective
The problem
A few months ago, Simon Cox (director of NNBN and Head of Policy at Northamptonshire and Milton Keynes Chamber of Commerce) told me about a problem he was solving: our local councils and education authorities don't know what business owners struggle with, what is working, and what needs improving. He was thinking about using Zoho's ecosystem to create this initiative, which I quickly told him, for a complex, conditional form system like this, Zoho would not be a great solution, and this is where it began.
Starting out
I began a few frontend concepts in React, and in hindsight, were way too modern and flashy looking. He actually liked the one I spent the least time on the best: hardly any styling, just straight to the point. That was that. For the form architecture, I researched countless existing solutions but I quickly realised that an off-the-shelf form platform would not be a good fit for this project.
Building a custom form solution
My mate Paweł has always stressed the standard senior philosophy to me: build only what is needed... Sounds simple, but on my own projects, I tend to overbuild, going miles away from the initial purpose because "it looks cool". This is exactly what I did. I chose the following stack:
- Language: TypeScript
- API framework: Express.js
- Database: PostgreSQL
Nothing more, nothing less.
That was the point. We needed a form that could handle conditional branching, support different topic areas, and store responses in a way that was easy to ingest and analyse later. We didn't need a platform with 100 features we would never use. A small TypeScript app, a simple Express API, and PostgreSQL was more than enough to solve the problem cleanly.
Turning survey responses into policy insight
Once the form system was in place, the next challenge was turning raw submissions into something actually useful.
A submission comes in as structured JSON: business metadata (location, industry, employee count, years trading) plus the actual responses. For instance, a business owner in Northampton running a small IT firm might select the "AI & Technology" topic and answer questions about AI familiarity, current usage, concerns, and training needs.
The database stores the core business metadata in normal columns, while the actual survey answers sit in structured JSON, which makes it easy to evolve the questionnaire without pain.
From there, the Python analytics layer reads the submissions, groups them by topic and geography, computes distributions and correlations, and generates quarterly reports. For example: "Of the 47 responses from Milton Keynes, 62% of businesses report using AI, but only 34% have received formal training." Those kinds of insights are what local councils actually need to see, not a raw dump of survey responses.
In other words, the form is the input layer; the analytics pipeline is the part that makes the data useful.