Building a Minimum Viable Product for UpPush.me in 30 days
A few weeks back, I had the idea of building a service that sends daily reminders to motivate people to work on their goals. For starters, the service would send an SMS message with an inspiring quote on a selected schedule, for example right before a workout session.
There are many motivation apps in the market that offer a similar service: show motivating quotes at random or scheduled times, but I haven’t found any that doesn’t require installing an app and uses SMS instead. Thus I decided to give this a shot and build one myself, as a side project with my current job.
The motivation for this project is twofold: work on system design, and learn about marketing and growth.
Final result: https://www.uppush.me/
Stack: Next.js, Material UI, AWS EventBridge Scheduler, AWS SNS, AWS Lambda, DynamoDB, Terraform.
There are 4 key components for this to work:
- A form for users to sign up
- A database for storing user schedules, and other metadata
- A scheduler to trigger sending an SMS at the user’s selected time
- An SMS broker: a service that provides an API to send SMS messages to a given phone number in exchange of a small fee.
The criteria I had for designing the architecture were:
- Simplicity: Keep the design as simple as possible and avoid unnecessary complexity. This will help with maintenance and minimising issues.
- Low cost: Choose options that have a free tier or are low-cost, but still don’t compromise on quality.
- Speed: Use platforms and tools I am familiar with to reduce friction and go as fast as possible.
The Landing Page and Sign Up Form
The landing page should be able to showcase the value of the service to visitors, in a simple and concise way. Then once familiarised with the service, users should be able to decide whether to sign up or skip.
To build the user interface, I used Next.js and the Material UI library. Next.js allows to quickly develop the client-side and backend APIs, and comes with many optimisations out-of-the-box — on top of providing an excellent documentation.
Hosting is done on Vercel, the company that created Next.js, and which provides a generous free tier with enough quota for a project of this scale. It also integrates with GitHub and offers CI/CD right off the bat.
The Database
The application by design doesn’t rely on heavy database reads or writes, and doesn’t store any relational data. I picked AWS DynamoDB since it fits perfectly: It is serverless (no provisioning and maintenance overhead), has a low and predictable provisioned cost, and is no-SQL.
The Scheduler
A very interesting and fun part to design and implement.
Once signed up, users expect to receive an SMS at specific times of the day, and specific days of the week — for example every other day at 6:00.
There are many options for a job scheduler (e.g. Airflow, Celery), but coming back to the design requirements, the simplest and fastest solution is Amazon EventBridge Scheduler: it is serverless, easy to set up, and has a generous free tier.
An EventBridge schedule (equivalent to a cron job) is created for every quadrant of the hour (at minute 00, at minute 15, at minute 30, and at minute 45), for every hour of the day, and for every day of the week. This results in 4 quadrants x 24 hours x 7 days = 672 schedules.
Each user is then assigned to the schedules that correspond to their selected times during sign up (converted to UTC).
Taking care of user timezones during sign up was exciting to work on. In most cases, we can safely assume the timezone configured in the user’s locale configuration (system settings) is where the user lives, but that is not always accurate, because users can be traveling, or because the locale configuration simply can’t be accessed or read from the browser. Thus the signup form has a dropdown list of all commonly known timezones users can select. The form defaults to the timezone read (or guessed) from the locale configuration.
Once a timezone is selected, the user’s schedule is converted from locale timezone to UTC by using the list of UTC offsets in the IANA database.
The SMS Broker
To programatically send an SMS to a given phone number, AWS SNS is an option that fits well with our design requirements. It’s affordable (although not always the cheapest), and integrates well with other AWS services.
For UpPush.me, every schedule triggers a call to a Lambda function that fetches a quotes and formats the SMS message that is then sent to subscribers via SNS.
However, I ran into a few hurdles that required some back-and-forth with the AWS support team (which was very responsive and keen on helping, even on my “basic tier” personal account):
- Raising the default spending quota of 1 $/month.
- Moving out of the SMS sandbox to be able to send messages to phone number that are not restricted to a pre-established list of allowed destinations.
- Trying to get a Sender ID, which is a requirement by a few countries like India which represents an amazing market for UpPush.me given the large population. I haven’t received the Sender ID yet but thankfully almost all countries don’t have it as a requirement.
To read more, follow this link to the AWS documentation.
Once I had an MVP, I started sharing UpPush.me on forums for builders like indiehackers.com and subreddits like r/smallbusiness and r/EntrepreneurRideAlong. The result was that I received feedback from other builders and had my first few subscribers 🎉!
What other builders found great was the clarity of the message from the landing page, and how it conveys the idea and a simple and clear way.
Another common feedback about the service was that the UI (landing page) needed improving, and I received a lot of recommendations to use a no-code tool to build the landing page instead of using a React library. Although it is important to have a visually appealing UI, it is not the most critical part of UpPush.me. Thus at this stage, I prefer to curate and improve the present UI, and focus on building the service further, instead of investing on rebuilding it with a no-code tool.
Users also shared that they’d like to add features such as submitting quotes, and rating the quotes sent to them by message or author.
- Perfection is the enemy of good: As engineers and developers, we can easily get distracted from the goal of building a product that is useful and desirable to users and instead focus on the minutiae of building the perfect product. Perfection is the enemy of good, and it is important to define what is the desired outcome of any project (what is good), and place safeguards that prevent us from spending too much time and energy on just building.
- Define deadlines: I find the most powerful safeguard against perfectionism to be deadlines, because with deadlines the most precious resource is time, and it allows switching perspective from “it would be nice to have this” to “how can I build and ship this feature and move on to next one”.
- Continuously seek and integrate feedback: Building a service without knowing what users actually want has the double negative effect of loosing resources (time, energy), and building momentum that leads us further astray from delivering a product. It is important to seek feedback periodically and integrate it into the product development, whether for building new features, editing current ones, or fixing bugs.
- Doing is the best way to learn: Whether you want to become a better system designer, architect, developer, or marketer, working on your own full scale projects is the best way because you have the freedom to do your own research for the best implementation, and the best tools and technologies to use. Furthermore, the resources you have at your disposal are finite (time, energy, budget) and that leads to being diligent in how you use each.
After 4 weeks from its launch, UpPush.me is now happily serving 32 subscribers (and counting!).
The current ecosystem for tech entrepreneurs is booming with solutions to build and deliver software — from no-code tools to low-cost hosting solutions — and I am thrilled to see how large the “small business” builder communities are, and how many interesting products and services are being developed 🚀 🎉.