Building and maintaining a SaaS solution
2020 was a really different year. It all started normal until the pandemic hit. Businesses were closed, churches were forced to go online, and many other activities had to change. Even though people started getting used to the new normal some activities weren't the same as they used to. This is the case of church services.
Churches are built around having a community of people that interact with each other across different activities and groups. When churches were closed, they started seeing a steady decline in their community. The only way of slowing it down was to innovate and make their live streams, video productions, and activities more interactive and involving. While churches were still fighting to operate without people in their buildings it became apparent that when the time to open back up came, they were going to need a way to control their reduced max occupancy.
One day while serving at my church the idea hit me. Movie theaters have seat booking platforms that help them manage their occupancy and ticket creation without the need of having a person attending calls of people making reservations. The best part of this idea was that it would be a completely automated system that would stop accepting reservations when the event got filled up. I proceeded to tell the idea to my team leader. He then proceeded to discuss it with the administrative team, and the decision was made to develop this web app. That’s how Cenyth Events was born.
When I was told that they wanted me to develop this web app I proceeded to collect their requirements. Those we're simple to imagine and understand, especially because I know how they usually work during their weekly services. It was decided that the app needed to have 3 user roles, user, staff, and admin. The admin would be able to edit org info and manage events. The staff would be able to perform a check-in procedure through a QR code that’s present in all virtual tickets. And the users would be able to create and cancel their reservations for events.
On the technical side I decided to use Python and Flask as the framework to build the API on. The web app was built using Angular and PWA features to facilitate the check-in procedure. Development was then started and when the first complete and usable version was done around July it was presented to the administrative team.
A few months later the time to move it to production had come. On the first days with real-life users many minor bugs were discovered and fixed. One of the biggest ones was a problem with the email sender provider Sendgrid. Most of our emails sent through them to Outlook inboxes were either sent directly to spam or completely blocked due to some sender IP issues that Sendgrid had been experiencing. To solve this issue the decision to move to Mailgun was made. Changing the email provider in the API was a simple task, and since then it has worked flawlessly.
Over the next few months, I've worked on improving all of the user interfaces based on user feedback and fixing problems that have become apparent through the passing of time. Recently on January another major feature was introduced. This feature was the ability for the web app to automatically expire all reservations that haven't been checked in at a certain time before or after an event. This helps because there’s a large amount of people that make a reservation, don't use it and never cancel it. So, they are taking a space that could be used by somebody else. This feature relies on scheduling tasks on the API and then executing a SQL query to expire all reservations that meet a certain criterion.
It's certainly been an interesting experience working with a real client that has expectations about a service that you provide them. Sometimes it’s just fixing simple bugs and making improvements. Other times bigger and more difficult bugs appear that you must find a way to fix in a timely manner. But it doesn't matter if what needs to be done is going to be easy or difficult. What's important is that you learn from those experiences.