Skip to content

Guide

Next.js CRM for a SaaS: build one, use one, or skip it

Looking for a Next.js CRM? Build one, run an open-source one, or skip it and follow up with every sign-up from your Next.js app in a few lines.

The short answer

A Next.js CRM can mean one of three things: a CRM you build yourself with Next.js, an open-source one built with Next.js that you run yourself, or the part of a CRM you were really after, which is knowing who signed up and following up with them.

If you sell through a team that works a deal pipeline, use a real CRM. If you build a SaaS alone or with a few people, the third is often all you need, and it is a handful of lines in your Next.js app. Kicklace is for that case. It is not a CRM: it does the follow-up a CRM is bought for, without the CRM, for founders who have never set one up.

Build your own

Contacts, companies, deals, notes, tasks, email going out and coming in, imports, permissions: a CRM is a good deal more than a table and a form, and once it exists you keep it current beside your real product. It is worth building when the CRM is the product, or when your process is unlike anyone else's.

Run an open-source one

NextCRM is one built with Next.js. As of 28 October 2026 its repository describes an open-source CRM on Next.js 16, React 19, PostgreSQL and Prisma, under the MIT license. It covers accounts, contacts, leads, opportunities and invoicing, and it needs PostgreSQL 17 with pgvector, which its Docker Compose file starts beside the app. You host it and keep it up to date, so read its README before you decide.

Or skip the CRM and follow up with every sign-up

This is the usual need of a SaaS, and in a Next.js app with the App Router it takes four steps.

  1. Make a workspace, copy the setup token from the Hear it step of its setup, and run this in your project.
npx kicklace init --setup <token>

It adds <KicklaceTag /> to your root layout, adds kicklace to package.json and writes your keys into .env.local. Run it with --dry-run first to see every change it would make.

  1. Say when somebody signs up. In the Server Action or Route Handler that creates the account, once the user is saved:
import { after } from "next/server";
import { Kicklace } from "kicklace";

const kl = new Kicklace(process.env.KICKLACE_SECRET_KEY!);

after(() =>
  kl.track("signup", {
    email: user.email,
    idempotencyKey: `signup:${user.id}`,
  }),
);

after runs once the response has gone, so sign-up never waits on it. track never throws, since a refusal comes back as an answer, and the idempotencyKey makes a retry land once.

  1. Connect Stripe under Connections with one restricted key, and a payment lands on the same person with no code. Or say it from your server with kl.track("purchase", { email, value: 49, idempotencyKey: invoice.id }).

  2. Open the Lifecycle map. Kicklace writes your first emails from what it read on your site, and you read them, change what you like and switch them on. Before you do, it shows who would have got each one over the last 30 days.

Every visit, account and payment of one person is one record, and where they stand is worked out from what they did, never set by hand. The tag, the package and both keys are in Add Kicklace to a Next.js app, and the first email itself is in Next.js send email.

What Kicklace leaves to a real CRM

Kicklace has no deals and no pipeline, and it is not for a sales team that works from one, or for a marketer who wants a drag-and-drop newsletter builder. It reads from your Stripe and your sign-ups and sends the emails you switch on. If your people are mostly leads that somebody sells to, run a CRM and keep it beside Kicklace if you like.

FAQ

Can I build a CRM with Next.js?

Yes, since a CRM is mostly forms, tables and a database, which Next.js does well. The cost is everything after the first version: the imports, the permissions and the email, and keeping it current while you also build your product.

Is Kicklace a CRM?

No, it puts every customer and every email on one map and writes the emails for each stage in your voice, which is the follow-up a CRM is bought for. It has no deals and no sales pipeline.

Does it work with the App Router?

Yes, KicklaceTag from kicklace/next is made for it, and npx kicklace init adds it to your root layout. The package has no dependencies and runs wherever fetch does.

What does it cost?

Kicklace is free up to 1,000 contacts, sending from its own address with your name on it and a small “Sent with Kicklace” line under each email. Your own domain is part of Starter, $25 a month. The details are on pricing.

Free up to 1,000 contacts.

Join the journey

We're building Kicklace so you can get back to building your own product. We'll email you when there's something new worth showing.