# Build or Buy: Replace SaaS Subscriptions With One App A SaaS subscription is software a business rents by the month instead of owning: a newsletter platform, a CRM, a scheduling tool, a help desk, a status page. The vendor builds the product, hosts it, keeps it running and ships new features. You pay a monthly fee per seat, per contact or per plan, or a share of the revenue that passes through it. A small business often pays for several at once, one for each job, and each keeps its own login, its own list of customers and its own bill. Elements is not a hosted service. It is an integrated app environment for building web apps with an AI agent: one coherent system that includes a project server that runs while you work, a default app framework, a bundled Postgres database, email, background jobs, sign-in, realtime updates and a command that deploys to a server you rent. With Elements, a business can build its own app for a job it rents today, and run that app on its own server. For a long time, building your own was rarely worth it for a small business. For some jobs that has changed. An AI agent can write the app, and Elements supplies the database, email, jobs and payment plumbing it runs on, so a custom build is now something a small business can make and keep running. Your newsletter, your CRM and your payment processing used to be three services with three lists of people. Built as one app, they share one database and one list. Every app is different, so this page does not tell you to cancel anything. It suggests weighing each vendor's features, price and service, all in, against what a custom build would take. ## What Elements Gives You to Build With Most of what a subscription product does is the same handful of parts: a database of people and records, pages they sign in to, email, work that runs on a schedule, and payments. Elements ships each of those parts as one coherent system, and one command, `elements build -json`, reports every build error in the code that uses them, from type checking to tests and migrations ([build](/learn/man/build)). The parts are: - **A Postgres database with migrations.** Elements bundles Postgres and applies migrations as you work ([database](/learn/man/database), [migrations](/learn/man/migrations)). Running it on your server suits a prototype or a single-server app; for several servers, or managed backups, point `DB_HOST` at a hosted Postgres instead ([setup](/learn/man/deploy/setup)). - **Email.** Email templates are written in Elements HTML, the same HTML language as your pages, and sent through any SMTP provider, such as Postmark or Amazon SES ([email](/learn/man/email)). - **Background jobs and cron.** Jobs are queued in your own database and can be scheduled for later ("in 3 days", "tomorrow at 8am"); cron runs work on a schedule, such as a daily digest ([jobs](/learn/man/jobs)). - **Reactive pages, rendered on the server.** Pages arrive fully rendered and update in place when their data changes ([html](/learn/man/html)). - **Realtime rows and channels.** A LiveTable keeps a set of rows in sync across every open browser, and channels broadcast messages from the server to every browser listening ([livetable](/learn/man/livetable), [channel](/learn/man/channel)). - **Sign-in and sessions.** Your users are rows in your own database ([session](/learn/man/session), [authentication recipe](/learn/man/recipes/authentication)). - **File uploads,** sent with a form's other fields and stored in your database ([file upload recipe](/learn/man/recipes/file-upload)). - **Stripe payments.** Checkout for one-time payments and subscriptions, with the app registering its own webhook ([payments](/learn/man/payments), [subscriptions](/learn/man/payments/subscriptions)). ## What Stripe Adds An Elements app that takes payments through Stripe can use these Stripe products: - **Checkout:** a payment page Stripe hosts, so card numbers never touch your app. - **Billing:** recurring subscriptions, with Stripe retrying failed cards. - **The customer portal:** a page Stripe hosts where customers update their card or cancel. - **Stripe Tax:** sales tax and VAT calculated and collected at checkout, in the places where you are registered to collect. - **Radar:** fraud screening on card payments. - **Invoicing and Payment Links,** for bills and one-off sales. The Elements manual covers Checkout, the webhook and subscriptions. The rest your app reaches through Stripe's official `stripe` package, which installs as is ([payments](/learn/man/payments)). Stripe charges its own fees for each of these, listed on [stripe.com/pricing](https://stripe.com/pricing). Platforms that take payments for you charge card fees as well, so those fees are a cost you already pay in some form. ## How to Add It Up The comparison that matters is your own, and only you have the numbers for it. List every subscription a single app would replace, at the plan you actually pay for, and add up a month. Include any share of revenue a platform takes, at your current revenue and at the revenue you expect. Then put the cost of running your own app next to it, in three bills: - **Elements,** $100 a month. That first purchase covers two licenses: one for the computer you build on and one for the server you deploy to ([pricing](/pricing)). - **A server** you rent by the month, such as a Droplet from DigitalOcean ([pricing](https://www.digitalocean.com/pricing/droplets)). - **An email provider** such as Postmark, which charges by monthly email volume ([pricing](https://postmarkapp.com/pricing)). Add Stripe's fees on payments ([pricing](https://stripe.com/pricing)) and the agent's work to build it. Most platforms that take payments charge card fees in some form, so compare what each side charges on top of them. The comparison usually turns in one of three places: - **A share of revenue grows with each sale.** Elements' cost does not, so past some revenue a platform's cut costs more than running your own app. - **Flat subscriptions add up.** One modest plan rarely justifies a build, but several, each for one job, can. - **A single cheap tool is usually cheaper to keep.** If a tool you use is free or inexpensive on the plan you need, keep it. The examples below show what goes on each list. ## Example: A Writer With a Paid Newsletter *This is an example, not a customer.* A writer publishes a paid newsletter on Substack, tracks sponsors and collaborators in a CRM, and takes payments by card. | Subscription | How it charges | |---|---| | [Substack](https://substack.com/going-paid) | A share of paid subscription revenue | | [HubSpot](https://www.hubspot.com/pricing/sales) Sales Hub | Per seat, by plan | Card fees apply either way. Built as one app, the writer pays Elements, a server and an email provider, plus Stripe Billing's fee on recurring charges ([pricing](https://stripe.com/billing/pricing)). Substack's share grows with every new paid subscriber, while Elements' cost does not. These demos together show the app built, each from one prompt: - [Letterhearth](https://elements.dev/demos/01a0f455-f25d-784c-a9d9-35a5841308ce): free or $8 a month subscriptions by card, a teaser on paid posts, and posts the writer schedules and emails. - [Dealwren](https://elements.dev/demos/01a0f399-f3bb-7c53-af59-10b9fa312a32): a CRM with contacts, companies, a deals board, follow-up tasks and a morning task email. - [Bytestall](https://elements.dev/demos/01a0f422-a1d8-7d6a-a748-48aa9dcb5a42), if the writer also sells an ebook or a template: card checkout with an email address and a download link. The [Substack comparison](/vs/substack) works through this case in detail, including how to find where Substack's share passes the cost of running your own app. ## Example: A Coach Who Sells Sessions and a Course *This is an example, not a customer.* A coach books paid sessions, sells an online course and emails a list of 1,000 people. | Subscription | How it charges | |---|---| | [Calendly](https://calendly.com/pricing) | Per seat, by plan | | [Kajabi](https://kajabi.com/pricing) | By plan | | [Kit](https://kit.com/pricing) | By plan and list size, plus a fee on what a creator sells through it | This one is closer. Kajabi includes email, so a coach who drops Kit pays for two flat subscriptions, and their total may sit near the cost of running your own app. The gap grows if the coach also pays for a form builder or a larger Kajabi plan. These demos together show the parts built: - [Slotnook](https://elements.dev/demos/01a0f40a-56f5-7ef5-b1d1-beeab4e2ca36): booking pages in each guest's time zone, with emailed calendar invites and reminders. - [Lecturemint](https://elements.dev/demos/01a0f469-f275-7996-aabe-5ae0c9242bdc): courses sold by card, lesson videos with notes and progress, and live lesson questions. - [Letterhearth](https://elements.dev/demos/01a0f455-f25d-784c-a9d9-35a5841308ce): the email list and scheduled posts. - [Dealwren](https://elements.dev/demos/01a0f399-f3bb-7c53-af59-10b9fa312a32), for a pipeline of prospective clients. ## Example: A Small Software Company's Customer-Facing Tools *This is an example, not a customer.* A small software company with two support agents pays for the tools its customers see around the product. | Subscription | How it charges | |---|---| | [Zendesk](https://www.zendesk.com/pricing/) | Per agent, by plan | | [Canny](https://canny.io/pricing) | By plan | | [Statuspage](https://www.atlassian.com/software/statuspage/pricing) | By plan | | [UptimeRobot](https://uptimerobot.com/pricing/) | By plan | | [Sentry](https://sentry.io/pricing/) | By plan | | [Bitly](https://bitly.com/pages/pricing) | By plan | Of the six, the help desk is the hardest to build. Zendesk threads inbound email, routes tickets and tracks response times, and there is no demo of it here. If the company keeps Zendesk, the other five are still five flat subscriptions, each for one job, and several flat subscriptions folded into one app is where this comparison usually turns. Run the app on its own server, apart from the product it watches, so the status page stays up when the product is down. These demos together show the other five built: - [Wishcairn](https://elements.dev/demos/01a0f3eb-ef9c-73ed-9b4c-4e490c420ecc): feature requests with live votes, a public roadmap, a changelog and voter emails. - [Uptimebell](https://elements.dev/demos/01a0f41f-a528-7e3d-97cb-02e9e521529d): checks every minute, incidents after three failures, and a status page that emails subscribers. - [Faultkeep](https://elements.dev/demos/01a0f45b-e5ae-722d-9405-0ab9735d61ba): a paste-in snippet that reports errors, grouped into live issues with charts and email alerts. - [Shortwick](https://elements.dev/demos/01a0f42d-7038-7412-a214-9445b53b37d5): short links with live click counts, referrers and QR codes. ## When to Keep Paying for the Subscription A subscription buys more than software, and some of it an app you build cannot match: - **An audience.** Marketplaces and networks bring you customers. Substack's recommendations, Etsy's buyers and Eventbrite's discovery feed do not come with your own app. - **Scale you would otherwise run yourself.** Sending to a large list, streaming video and serving large audio files take infrastructure, and the vendor runs it. Elements stores uploads in Postgres, which suits an app's files, not a large video library. - **Tax and liability.** Merchant-of-record platforms register, collect and remit sales tax and VAT for you. Stripe Tax calculates and collects tax in the places where you are registered; registering and filing stay with you. - **Specialized depth.** Telephony, two-way calendar sync and a help desk's email threading are hard to reproduce. - **Your time.** An app you own is an app you maintain. If nobody on the team wants that job, the subscription is doing it for you. - **A low bill.** If the subscriptions add up to less than running your own app, they are the better deal. ## Questions ### Can an AI agent really build a replacement for a SaaS product? For many small-business tools, yes, with Elements supplying the database, email, background jobs, sign-in, realtime updates and Stripe payments the app is built on. Each demo linked on this page was built by an agent from one prompt, and the prompt is on its demo page. How close a build comes to a given product depends on how much of that product you use. ### How much does it cost to run my own app instead? Elements is $100 a month, which covers two licenses, one for the computer you build on and one for the server you deploy to. Add a server you rent, from a provider such as DigitalOcean, and an email provider such as Postmark, each priced on its own pricing page, plus Stripe's fees on payments, listed at stripe.com/pricing. ### Does Elements send email on its own? No. Elements renders email from templates written in the same HTML language as your pages and sends it through an SMTP provider you choose, such as Postmark or Amazon SES. In development, mail is written to the project server log instead of being sent. ### Does Elements handle payments and sales tax? Elements apps take payments through Stripe Checkout, including subscriptions. Stripe provides Billing, the customer portal, Radar fraud screening and Stripe Tax, which calculates and collects tax where you are registered. Stripe's fees are listed at stripe.com/pricing. ### What happens to my app if I stop paying for Elements? The runtime packages are MIT licensed and the app runs on Node.js, so what you have shipped keeps working. The license covers the Elements tooling you build and deploy with.