What tech stack does Fathom Analytics use?
When developers use a product like Fathom Analytics, the first question that comes to mind is “What tech stack is this company using?”. I personally love reading through company tech blog posts where they talk about their stacks. One of the most memorable posts I read was from 2016, where Slack’s Chief Architect, Keith Adams, wrote about Taking PHP Seriously. Interestingly, Slack still uses PHP to this day.
Now, let’s get into the Fathom Analytics tech stack.
Laravel is the world’s most popular PHP framework and we love it. I’ve been using it for so long, and it allows us to grow our business very quickly. The benefit of using Laravel is that we don’t have to worry about architecture, or building a framework in-house. Laravel is a tried and tested framework, and we can take advantage of all the features it brings.
We dig Ember.js and we use it for our frontend. It’s a very opinionated framework, but we agree with those opinions. For example, the structure is set in a certain way (controllers, components, templates etc.), and we seldom need to mess around with the defaults. And when we do need to override something, it’s super flexible to do so. I like the Ember.js community, and my first time in the United States was actually when I went to EmberCamp in Chicago.
We use Caddy for our global custom domain infrastructure. We love it because it handles SSL automatically for us, and it scales really nicely. We have servers around the globe that all connect to a central DynamoDB table that stores all of our customers SSL certificates. We love Caddy so much and Matt Holt (the creator) is a great guy.
We use Global Accelerator to ensure fast performance for our custom domains. By using this, we can have a single DNS point which routes to servers around the globe. So if you're in the UK, you'll be routed to a UK Caddy server. And if you're in the USA, you'll be routed to the closest USA server. It's pretty damn great.
Laravel Vapor, a serverless deployment platform for Laravel for our application hosting, is what we’ve used since they launched. Vapor is effectively a GUI that manages underlying AWS resources and marries our Laravel application to serverless infrastructure. Going serverless if of huge importance to us because we don’t want to manage servers, and we need automatic scaling as we grow. We wrote a Laravel Vapor review and spoke about everything we enjoy about it, along with a couple of limitations.
We use Laravel Forge for provisioning servers for our custom domains infrastructure. We like it because it sets up services with sensible defaults and allows us to run a post-provision recipe each time. We start off with a load balancer server, and disable NGINX, and install Caddy on it. The price is so low for Forge, and we gladly pay it, and they’re constantly adding value to the service.
Our database is MySQL. In a past life, we used PostgreSQL but I wasn’t as productive as I was with MySQL. I have 15+ years of MySQL experience, so we decided to bin (trash) PostgreSQL and move to MySQL. We run all of our queries, even the aggregation queries, against this. We’re pushing the limits here and will be moving to ElasticSearch & DynamoDB in the future.
DynamoDB & Redis
We use DynamoDB for key-based storage when we care less about speed and more about infinite scaling (we use it in on-demand mode). We also use Redis for various caching where we don’t care about overwrites / data loss.
We use an incredible product called Tinkerwell for testing PHP code locally. We used to use a more basic PHP coder runner, but we couldn’t execute Laravel specific functions, and the code couldn’t be run inside our project environment. With Tinkerwell, we can select the folder of our project and instantly run PHP code against it. We use it every single day and it’s been a huge productivity booster.
ChipperCI is utilized for Continuous integration because we love the simplicity of the product. A lot of people ask me why we use ChipperCI instead of GitHub actions and it’s solely because I don’t want to manage the whole actions set-up. With ChipperCI, I use dropdown boxes to choose our environment, and it’s so smooth. Plus we believe in supporting small, independent businesses.
Postmark sends all of our emails. We think their company is great, it’s priced reasonably and the deliverability is great. Postmark is an easy choice for us because it means we never have to think about email or deliverability.
For error tracking, Sentry is our go-to tool. We’ve used Bugsnag in the past, and it’s great, but Sentry just clicks with me and feels good. If you’re in the Laravel space, you also have Flare, which is a solid choice too.
The wonderful PingPing handles our uptime monitoring behind the scenes. We have a great partnership with them and we love their service. This is how we provide simple uptime monitoring for all of your websites.
I wanted to include a note on our affiliate system because we’ve had so many people ask us about it. We custom built our own system to handle affiliates, as we needed it to be privacy-focused with explicit consent for cookies etc. And we wanted to control the way we did payouts. It’s been great, it runs itself, and the only manual task we perform once a month is reviewing the CSV file & uploading it to PayPal. It’s so nice.
For our marketing website, we use Statamic. Their company is amazing and we love their product. Paul originally pursued Statamic, and was able to learn how to use it very quickly, and I love it because I get to push all the content to git, and don’t have to use WYSIWYG editors. At time of writing, we host our own marketing website behind a CDN, but we’ll be moving to the leading JAMStack hosting platform, Vercel, later this year.
Like every other SaaS company in the world, we use Stripe for processing payments. The API is fantastic, the dashboard is fast and they’ve been in business for a long time.
Closing thoughts on our tech stack
The tech stack we’ve chosen is very important to and deliberate for us. We’re always open-minded with things and we choose tools based on our goal. Our goal is to deliver an infinitely scalable service without having to hire someone for DevOps. As a business, we want to remain as independent as possible, so the tools we choose are very important. We will always pay a premium for something when it delivers huge value to us. But remember folks, it’s not just the tech stack that makes the developer, it’s how they use it.