ETAONIS was launching Jaco, a news monitoring product. The need was precise: an MVP that stands up commercially, meaning able to take a subscription on day one, not just show a mock-up. Four features were built, each answering one step of a subscriber's journey.
The project in detail
Sign-up happens in two steps, the credentials and the choice of one of the tool's three plans, which can be validated in whichever order suits the user. Payment goes through Stripe, with a coupon system planned from the start, because a launch rarely happens without welcome offers. Search combines a simple bar with an advanced area by sector, geography, date and keywords.
The fourth feature is the one that turns a search engine into a monitoring product. Subscribers record the alerts they expect, from sectors and keywords, and how often they want reports. A dedicated script reads those preferences and sends the alerts and reports. That automation is what means a subscriber no longer needs to come back to the site for the service to be of use.
One architectural point was settled before a single line was written: how the application queries the data API. Two options stood: route requests through Django, which then acts as a relay, or call the API directly from the browser using an ephemeral token identifying the user. The first was quicker to set up, the second cleaner and faster. We recommended the ephemeral token and that is what was built: the repository still carries its token module and its bespoke authentication backend.
The DevOps side mattered as much as the code. We installed a GitLab instance at the client's, moved its code across, set up a staging environment and configured continuous integration so that any change pushed to a given branch deploys automatically. The application is containerised, served by uWSGI behind nginx, with its deployment files in the repository. Training came with delivery, so the team could keep its own chain alive and write its own tests.
That is the model I prefer on an MVP: deliver the product and leave behind a team able to carry on without me.