The Testimonial Blog
The Testimonial Blog
All the tools we're using to build our SaaS
All the tools we're using to build our SaaS
Cofounder of Senja
It's almost been two years since I originally launched Senja on Twitter after hacking it together in public for 30 days.
Picking our tooling at the time was easy. We knew we could swap our stack and our services as we grew, so we spent very little time choosing tools.
When I first wrote this article in November last year, we had about 1,000 users and were at $500 MRR.
Today we have 11,000 users, and are at $17,000 monthly recurring revenue.
As we've grown, added more features and gotten way more customers, we've gradually refined our stack, cut down on unnecessary tooling and found the services that work best for us.
In this post, I'll show you the tools we're using to build a SaaS that serves this many people, and why we chose these tools.
What Senja is Made Of - Our Tech Stack
Shipping quickly is extremely important to us. It's the biggest advantage we have over the current kingpins of the testimonial collection and sharing industry.
We ship dozens of updates per month. That's only possible because I've picked a tech stack that doesn't slow me down, but empowers me to move quickly.
Senja is made up of multiple apps that speak with each other.
The app
The backend
The curator / testimonial fetching & sync service
Public pages
Widgets
Our Public API
Our image generator and preview service
etc.
Because of the nature of our app and our requirements, our stack isn't uniform across these services. Here's a breakdown of the tech we're using and how they power Senja.
Sveltekit: Fun fact! I originally wrote the Senja app in Vue, but quickly swapped to Svelte because I move much faster with it.
Building in Svelte has not only helped me move faster, but because Svelte is a compiler and doesn't require a virtual DOM, I'm able to build and distribute Svelte-powered components with it easily.Tailwind: We're using Tailwind for styling pretty much everything. Not only does it power our app, but it also powers our widgets and chrome extension.
Vercel - We're using Vercel to host all our user-facing apps (the app, the forms and Walls of love)
Node + Express - we're running multiple express servers for different parts of our app:
Functions & Webhooks
Data Scraping & Testimonial Sync
Image Generation
Our Public API
Firebase: Powers authentication.
Amazon S3: Image Storage
Postgres: Our data is highly relational, so I'm really, really happy I chose to use SQL over NoSql for Senja's database.
Hasura: Hasura helps me work quickly with Postgres. It provides an out of the box GraphQL API around my database as well as authentication and webhooks. 10/10 would recommend.
Mux: Our video streaming provider. Completely painless to set up and worth every penny.
Remotion: Using this for video and image generation. It works seamlessly!
Cloudflare: CDN + Workers + Custom Domains
BunnyCDN: Image optimization and on-the-fly transformation
ScrapingBee + Private Data Scraping tools: We're using these to fetch reviews on sites that have no API.
Postmark: Transactional emails made easy!
As for our backend, and database, we use Railway, and it's been a joy to use. We also have an on-demand image generation server hosted there.
Marketing & Customer Success Tools
Senja! Our own testimonial collection software, to help us collect social proof and share it on our website.
Logsnag: Event tracking and notifications built by my good friend Shayan. It sends us notifications for every event performed inside the app.
Pirsch: Open-source and privacy-friendly web analytics. They have the most beautiful analytics in the market IMO.
Posthog: Analytics and reporting
Segment: One stop for data ingestion. We send data from here to Posthog, Google Ads, Google Analytics and more.
Helpkit: We write our support articles in Notion. Helpkit creates a beautiful support site from our Notion docs.
Fernand: Email support software
FirstPromoter: Affiliate programs
Encharge: Marketing automation on steroids.
Breakcold: Influencer and partnership tracking
Featurebase: Feedback board, roadmap and changelog
Swipewell: For curating testimonial examples
Supademo: The interactive demo on our landing page
It's almost been two years since I originally launched Senja on Twitter after hacking it together in public for 30 days.
Picking our tooling at the time was easy. We knew we could swap our stack and our services as we grew, so we spent very little time choosing tools.
When I first wrote this article in November last year, we had about 1,000 users and were at $500 MRR.
Today we have 11,000 users, and are at $17,000 monthly recurring revenue.
As we've grown, added more features and gotten way more customers, we've gradually refined our stack, cut down on unnecessary tooling and found the services that work best for us.
In this post, I'll show you the tools we're using to build a SaaS that serves this many people, and why we chose these tools.
What Senja is Made Of - Our Tech Stack
Shipping quickly is extremely important to us. It's the biggest advantage we have over the current kingpins of the testimonial collection and sharing industry.
We ship dozens of updates per month. That's only possible because I've picked a tech stack that doesn't slow me down, but empowers me to move quickly.
Senja is made up of multiple apps that speak with each other.
The app
The backend
The curator / testimonial fetching & sync service
Public pages
Widgets
Our Public API
Our image generator and preview service
etc.
Because of the nature of our app and our requirements, our stack isn't uniform across these services. Here's a breakdown of the tech we're using and how they power Senja.
Sveltekit: Fun fact! I originally wrote the Senja app in Vue, but quickly swapped to Svelte because I move much faster with it.
Building in Svelte has not only helped me move faster, but because Svelte is a compiler and doesn't require a virtual DOM, I'm able to build and distribute Svelte-powered components with it easily.Tailwind: We're using Tailwind for styling pretty much everything. Not only does it power our app, but it also powers our widgets and chrome extension.
Vercel - We're using Vercel to host all our user-facing apps (the app, the forms and Walls of love)
Node + Express - we're running multiple express servers for different parts of our app:
Functions & Webhooks
Data Scraping & Testimonial Sync
Image Generation
Our Public API
Firebase: Powers authentication.
Amazon S3: Image Storage
Postgres: Our data is highly relational, so I'm really, really happy I chose to use SQL over NoSql for Senja's database.
Hasura: Hasura helps me work quickly with Postgres. It provides an out of the box GraphQL API around my database as well as authentication and webhooks. 10/10 would recommend.
Mux: Our video streaming provider. Completely painless to set up and worth every penny.
Remotion: Using this for video and image generation. It works seamlessly!
Cloudflare: CDN + Workers + Custom Domains
BunnyCDN: Image optimization and on-the-fly transformation
ScrapingBee + Private Data Scraping tools: We're using these to fetch reviews on sites that have no API.
Postmark: Transactional emails made easy!
As for our backend, and database, we use Railway, and it's been a joy to use. We also have an on-demand image generation server hosted there.
Marketing & Customer Success Tools
Senja! Our own testimonial collection software, to help us collect social proof and share it on our website.
Logsnag: Event tracking and notifications built by my good friend Shayan. It sends us notifications for every event performed inside the app.
Pirsch: Open-source and privacy-friendly web analytics. They have the most beautiful analytics in the market IMO.
Posthog: Analytics and reporting
Segment: One stop for data ingestion. We send data from here to Posthog, Google Ads, Google Analytics and more.
Helpkit: We write our support articles in Notion. Helpkit creates a beautiful support site from our Notion docs.
Fernand: Email support software
FirstPromoter: Affiliate programs
Encharge: Marketing automation on steroids.
Breakcold: Influencer and partnership tracking
Featurebase: Feedback board, roadmap and changelog
Swipewell: For curating testimonial examples
Supademo: The interactive demo on our landing page
It's almost been two years since I originally launched Senja on Twitter after hacking it together in public for 30 days.
Picking our tooling at the time was easy. We knew we could swap our stack and our services as we grew, so we spent very little time choosing tools.
When I first wrote this article in November last year, we had about 1,000 users and were at $500 MRR.
Today we have 11,000 users, and are at $17,000 monthly recurring revenue.
As we've grown, added more features and gotten way more customers, we've gradually refined our stack, cut down on unnecessary tooling and found the services that work best for us.
In this post, I'll show you the tools we're using to build a SaaS that serves this many people, and why we chose these tools.
What Senja is Made Of - Our Tech Stack
Shipping quickly is extremely important to us. It's the biggest advantage we have over the current kingpins of the testimonial collection and sharing industry.
We ship dozens of updates per month. That's only possible because I've picked a tech stack that doesn't slow me down, but empowers me to move quickly.
Senja is made up of multiple apps that speak with each other.
The app
The backend
The curator / testimonial fetching & sync service
Public pages
Widgets
Our Public API
Our image generator and preview service
etc.
Because of the nature of our app and our requirements, our stack isn't uniform across these services. Here's a breakdown of the tech we're using and how they power Senja.
Sveltekit: Fun fact! I originally wrote the Senja app in Vue, but quickly swapped to Svelte because I move much faster with it.
Building in Svelte has not only helped me move faster, but because Svelte is a compiler and doesn't require a virtual DOM, I'm able to build and distribute Svelte-powered components with it easily.Tailwind: We're using Tailwind for styling pretty much everything. Not only does it power our app, but it also powers our widgets and chrome extension.
Vercel - We're using Vercel to host all our user-facing apps (the app, the forms and Walls of love)
Node + Express - we're running multiple express servers for different parts of our app:
Functions & Webhooks
Data Scraping & Testimonial Sync
Image Generation
Our Public API
Firebase: Powers authentication.
Amazon S3: Image Storage
Postgres: Our data is highly relational, so I'm really, really happy I chose to use SQL over NoSql for Senja's database.
Hasura: Hasura helps me work quickly with Postgres. It provides an out of the box GraphQL API around my database as well as authentication and webhooks. 10/10 would recommend.
Mux: Our video streaming provider. Completely painless to set up and worth every penny.
Remotion: Using this for video and image generation. It works seamlessly!
Cloudflare: CDN + Workers + Custom Domains
BunnyCDN: Image optimization and on-the-fly transformation
ScrapingBee + Private Data Scraping tools: We're using these to fetch reviews on sites that have no API.
Postmark: Transactional emails made easy!
As for our backend, and database, we use Railway, and it's been a joy to use. We also have an on-demand image generation server hosted there.
Marketing & Customer Success Tools
Senja! Our own testimonial collection software, to help us collect social proof and share it on our website.
Logsnag: Event tracking and notifications built by my good friend Shayan. It sends us notifications for every event performed inside the app.
Pirsch: Open-source and privacy-friendly web analytics. They have the most beautiful analytics in the market IMO.
Posthog: Analytics and reporting
Segment: One stop for data ingestion. We send data from here to Posthog, Google Ads, Google Analytics and more.
Helpkit: We write our support articles in Notion. Helpkit creates a beautiful support site from our Notion docs.
Fernand: Email support software
FirstPromoter: Affiliate programs
Encharge: Marketing automation on steroids.
Breakcold: Influencer and partnership tracking
Featurebase: Feedback board, roadmap and changelog
Swipewell: For curating testimonial examples
Supademo: The interactive demo on our landing page
Collecting testimonials doesn't get much easier
Collect text and video testimonials — Share them everywhere!
Sign up for free
More Articles
Testimonials Made Easy
The faster, easier way to collect testimonials
Jump in today and see how easy it is to collect testimonials with Senja.
Testimonials Made Easy
The faster, easier way to collect testimonials
Jump in today and see how easy it is to collect testimonials with Senja.
Testimonials Made Easy
The faster, easier way to collect testimonials
Jump in today and see how easy it is to collect testimonials with Senja.