Best Boilerplates for CRM Applications in 2026
TL;DR
- Twenty is the best open source starting point for a sales or business CRM — modern TypeScript stack, GraphQL API, custom objects, and active development make it genuinely usable as a platform.
- Monica is for personal CRM and relationship management, not sales pipelines — a common mistake is trying to build B2B sales tooling on top of Monica, which doesn't fit.
- SuiteCRM makes sense for enterprise requirements where a proven, full-featured PHP CRM is needed and deep customization is expected.
- Custom T3/Next.js CRM is the right call when CRM is a feature inside a larger product, not the core product itself — building on a generic boilerplate gives you tighter control over data model and UX.
- For most early-stage CRM products, start with Twenty to validate product-market fit, then consider a custom build once you have a clear picture of differentiated requirements.
Key Takeaways
CRM is one of the most-replicated categories in B2B software, which creates a paradox for product teams: the category is saturated with polished incumbents (HubSpot, Salesforce, Pipedrive), yet "we need a CRM that works the way we work" is one of the most common reasons companies build internal tools. That tension — buying vs building, customizing an open source base vs starting fresh — shapes almost every CRM project.
The boilerplate question for CRM is less about infrastructure choices (auth, billing, hosting) and more about the domain model. CRM applications have a high-complexity data layer: contacts with deduplication, companies with hierarchy, deals with stage transitions, activities with relationship polymorphism, custom fields with type enforcement, and reporting across all of it. Getting this data model right is the hardest part, and it's where purpose-built CRM platforms like Twenty have invested serious engineering. Starting from a generic SaaS boilerplate means building that data model from scratch.
The decision framework: if CRM is your core product (what users pay for), use Twenty or build custom with careful domain model design. If CRM is a supporting feature embedded in a larger SaaS product — a customer success module inside a project management tool, deal tracking inside a professional services platform — build it as a module on top of your existing product's boilerplate.
CRM Categories
Not all CRM products are the same, and the right boilerplate choice depends heavily on which category you're building for.
Sales CRM
The classic CRM: contacts, companies, deals, pipeline stages, activity timeline, email integration. The goal is to help sales reps track their pipeline, manage follow-ups, and forecast revenue. This is what Twenty and SuiteCRM are built for, and it's the most crowded market segment.
Building a new sales CRM is hard to justify unless you have a specific niche differentiation — vertical-specific features (real estate deal tracking with property data integration, financial services CRM with compliance workflows), integrations your industry uses that incumbents handle poorly, or a workflow model that genuinely differs from HubSpot/Pipedrive/Salesforce.
Personal CRM
Personal CRM focuses on managing human relationships rather than sales pipelines: remembering birthdays, tracking last contact dates, logging conversation notes, managing gift ideas, setting reminders to stay in touch. Monica is the reference implementation here. The user is an individual managing personal and professional networks, not a sales team.
Building a personal CRM product is a viable niche — the market is underserved relative to enterprise sales CRM — but the data model and UX assumptions differ significantly from sales CRM. Don't use a sales CRM boilerplate for a personal CRM product.
Internal CRM
Many companies build CRM tooling as an internal tool rather than a product. Customer success managers tracking account health, support teams logging customer interactions, account managers managing renewal timelines. This category is often better served by no-code internal tool platforms (Retool, Notion) than by a custom-built application, unless the integration requirements or organizational scale justify the investment.
Platform CRM
CRM as a platform means exposing CRM data and workflows via API to other tools in the organization's stack. Salesforce is the archetype — the CRM is the system of record, and every other tool integrates with it. Building a platform CRM requires treating the API as a first-class product, not an afterthought.
Niche/Vertical CRM
The most defensible position in the CRM market: a CRM built specifically for a vertical (real estate agents, recruitment agencies, financial advisors, veterinary practices) with domain-specific data models, workflows, and integrations that general-purpose CRMs handle poorly. These products often win on fit, not features.
Quick Comparison
| Tool | Price | Contacts | Pipeline | Activities | API | Best For |
|---|---|---|---|---|---|---|
| Twenty | Free (AGPL) | ✅ | ✅ | ✅ | ✅ GraphQL | Modern open source CRM |
| Monica | Free (AGPL) | ✅ | ❌ | ✅ | ✅ | Personal CRM |
| SuiteCRM | Free (AGPL) | ✅ | ✅ | ✅ | ✅ | Enterprise CRM |
| Custom T3/Next.js | Dev cost | Manual | Manual | Manual | Manual | Deeply integrated CRM |
Twenty — Best Modern Open Source CRM
Price: Free (AGPL v3) | Creator: Twenty team
The most developer-friendly open source CRM. Built with TypeScript (NestJS backend + React frontend), GraphQL API, and PostgreSQL. Designed to be self-hosted and customized.
Features: Contact management, company records, deals/opportunities, activity timeline, notes, tasks, email integration, and custom fields/objects.
Choose if: You want to build on top of an existing CRM rather than from scratch.
Self-Hosting Twenty
Twenty requires Node.js 18+, PostgreSQL 14+, and Redis. The recommended self-hosting path is Docker Compose:
git clone https://github.com/twentyhq/twenty
cd twenty
cp .env.example .env
# Set APP_SECRET, DATABASE_URL, REDIS_URL, FRONT_AUTH_ENABLED
docker compose up -d
The Docker Compose setup runs the API server, frontend, and a background worker for email sync and async tasks. For production, plan for at least 2 vCPUs and 4GB RAM — Twenty's full-text search and email sync are moderately resource-intensive. A single t3.medium on AWS handles development and small teams; production deployments with active email sync benefit from t3.large or equivalent.
Twenty's GraphQL API
Twenty exposes a GraphQL API that covers all core data objects and supports custom objects you define through the UI or API. This is the key capability for building product features on top of Twenty:
query GetContactsWithDeals {
people(filter: { company: { name: { like: "%Acme%" } } }) {
edges {
node {
id
name { firstName lastName }
email { primaryEmail }
pointOfContactFor {
edges {
node {
id
name
stage
amount { amountMicros currencyCode }
}
}
}
}
}
}
}
The custom objects feature lets you add domain-specific entities (Properties for real estate, Policies for insurance, Projects for agencies) through the UI, and they immediately get GraphQL endpoints, filtering, and relation support. This is Twenty's strongest differentiator over building a CRM from scratch — the metadata layer handles the plumbing, you focus on domain logic.
The AGPL license is an important consideration: if you're building a commercial product on top of Twenty, AGPL requires you to release your modifications under AGPL if you distribute the software. Self-hosting for internal use is fine. Building a CRM product and selling it to customers requires either releasing your code or purchasing a commercial license from the Twenty team.
Monica — Best Personal CRM
Price: Free (AGPL) | Creator: Monica team
Personal CRM for managing relationships: birthdays, last contact date, notes, gifts, activities. Strong privacy focus — fully self-hostable. Not for sales pipelines.
Choose if: You're building a personal relationship manager or relationship intelligence product.
Monica's data model is built around personal relationship tracking: relationship types (friend, family, colleague), life events, conversation logs with emotional notes, debt tracking between friends, pet data, and contact reminder scheduling. None of this maps to sales CRM use cases.
The practical advice: do not try to adapt Monica into a sales tool. The assumptions are fundamentally different. Monica assumes a single user managing personal contacts; sales CRM assumes a team sharing a contact database with ownership, territories, and permissions. The data model differences run deep.
SuiteCRM — Best for Enterprise
Price: Free (AGPL) | Creator: SalesAgility
SuiteCRM is the most feature-complete open source CRM available. Built on PHP/MySQL, forked from SugarCRM community edition, it ships with: full contact and company management, sales pipeline, marketing campaign management, email marketing, customer support cases, reporting and dashboards, workflow automation, and a module framework for customization.
The enterprise use case for SuiteCRM: organizations that need a proven, battle-tested CRM with deep functionality and are willing to manage PHP/MySQL infrastructure. SuiteCRM is used by thousands of organizations globally, has 10+ years of development behind it, and has a professional services ecosystem for customization.
The developer experience tradeoffs are significant. PHP/MySQL is not the 2026 developer stack of choice. The codebase predates modern PHP practices. Customizing SuiteCRM means writing PHP module extensions following SuiteCRM's conventions, which have a steep learning curve. If your team is TypeScript-native, the productivity hit of working in SuiteCRM's extension model is real.
SuiteCRM's best fit is organizations with existing PHP/MySQL expertise, enterprises that need the full breadth of CRM functionality without building it, and situations where a proven audit trail and compliance posture matter (SuiteCRM has been through enterprise security reviews that a custom-built CRM has not).
Building CRM Features from a SaaS Boilerplate
If you're adding CRM features to an existing SaaS:
// Core CRM data model
model Contact {
id String @id @default(cuid())
firstName String
lastName String
email String?
phone String?
company Company? @relation(fields: [companyId], references: [id])
companyId String?
activities Activity[]
deals Deal[]
tags String[]
notes Note[]
ownerId String // Sales rep who owns this contact
owner User @relation(fields: [ownerId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Deal {
id String @id @default(cuid())
title String
value Decimal?
stage String // lead, qualified, proposal, negotiation, won, lost
closeDate DateTime?
contact Contact @relation(fields: [contactId], references: [id])
contactId String
activities Activity[]
ownerId String
}
model Activity {
id String @id @default(cuid())
type String // call, email, meeting, note, task
notes String?
date DateTime @default(now())
contact Contact? @relation(fields: [contactId], references: [id])
contactId String?
deal Deal? @relation(fields: [dealId], references: [id])
dealId String?
userId String
}
CRM Pipeline View
The kanban pipeline view is the most-requested CRM feature:
// tRPC: Get deals grouped by stage
const dealsByStage = api.crm.getDealsByStage.useQuery();
// Returns: { lead: [...], qualified: [...], proposal: [...], ... }
// Drag-and-drop stage update
const updateDealStage = api.crm.updateStage.useMutation();
// @hello-pangea/dnd for drag-and-drop
<DragDropContext onDragEnd={({ draggableId, destination }) => {
updateDealStage.mutate({
dealId: draggableId,
newStage: destination.droppableId,
});
}}>
{STAGES.map(stage => (
<Droppable droppableId={stage.id}>
{deals.filter(d => d.stage === stage.id).map((deal, i) => (
<Draggable draggableId={deal.id} index={i}>
<DealCard deal={deal} />
</Draggable>
))}
</Droppable>
))}
</DragDropContext>
Email Integration
Email integration is where most CRM implementations either win or lose with users. Sales reps live in their email client; if the CRM doesn't reflect email conversations automatically, they won't log activities manually.
Gmail and Outlook Integration
Connecting email accounts requires OAuth2 authorization from each user. For Gmail: Google People API + Gmail API with gmail.readonly and gmail.modify scopes. For Outlook: Microsoft Graph API with Mail.ReadWrite scope. Both require registering an OAuth2 application in Google Cloud Console or Azure Active Directory.
The architectural decision is whether to sync email server-side (your backend polls the Gmail API on a schedule and writes to your database) or client-side (the browser fetches recent emails and enriches the UI without storing). Server-side sync gives you persistent activity history but requires storing email content and handling OAuth refresh tokens long-term. Client-side sync is simpler and more privacy-preserving but can't power reporting or search.
For a CRM where email history is a core feature, server-side sync is necessary. Plan for a background worker (BullMQ, Inngest, or similar) that polls each connected account every 5–15 minutes for new messages.
Email Open Tracking
Tracking whether a prospect opened an email requires injecting a 1x1 pixel image with a unique URL into outgoing emails. When the image loads, your server logs the open. This is the standard approach used by every email marketing tool.
The gotcha: Apple Mail Privacy Protection (enabled by default since iOS 15) pre-fetches email images, generating false open events. Open tracking rates from Apple Mail users are unreliable. For CRM email tracking, present open signals as directional indicators rather than definitive data, and lean harder on click tracking (which proxy prefetching does not fake) for engagement signals.
Auto-Logging Emails to Contacts
Automatically logging incoming and outgoing emails to the relevant contact requires matching email addresses from the email headers against your contact database. The naive approach (exact email match) misses aliases, variations, and corporate email forwarding. Production implementations add fuzzy domain matching (any email from @acme.com associates with Acme contacts), reply-chain threading (group emails by message-ID chain), and manual disambiguation when matching is ambiguous.
Contact Enrichment
Raw contact records — name, email, company — are rarely enough for sales workflows. Enrichment APIs fill in job title, LinkedIn profile, company size, funding, and tech stack from an email address alone.
Clearbit and Apollo
Clearbit (now part of HubSpot, though the API continues) and Apollo.io offer enrichment APIs that return structured company and person data from an email address or domain. Integration is straightforward:
async function enrichContact(email: string) {
const response = await fetch(`https://person.clearbit.com/v2/combined/find?email=${email}`, {
headers: { Authorization: `Bearer ${process.env.CLEARBIT_API_KEY}` }
});
const data = await response.json();
return {
title: data.person?.employment?.title,
linkedIn: data.person?.linkedin?.handle,
companySize: data.company?.metrics?.employees,
companyFunding: data.company?.metrics?.raised,
};
}
Enrichment is best triggered asynchronously on contact creation — add the raw contact immediately, queue enrichment as a background job, and update the contact record when enrichment returns. Synchronous enrichment on contact creation creates latency and enrichment API failures block contact creation.
Webhooks for Enrichment
Some enrichment providers support push-based enrichment via webhooks: you submit a contact, and the provider calls your webhook when enrichment data is ready. This is preferable for high-volume CRM products where polling-based enrichment would exhaust rate limits.
CRM vs Sales Tools
A question worth asking before building: should this be a CRM or an integration with an existing sales tool?
The math on HubSpot integration: HubSpot's free CRM tier handles contacts, companies, deals, and activities with an API that is well-documented and reliable. Building a HubSpot integration (sync contacts, read deal status, log activities) takes 1–2 weeks. Building equivalent CRM functionality from scratch takes months. If your users already use HubSpot or Salesforce, an integration is almost always faster to ship and cheaper to maintain than a competing custom CRM.
The cases where building beats integrating: your product requires CRM data that lives inside your system of record (not a third-party CRM), you need a white-labeled CRM experience without the HubSpot branding, the CRM workflow is deeply novel (not just contacts and deals), or your users are specifically not HubSpot/Salesforce customers and the integration assumption doesn't hold.
Reporting and Analytics
CRM reporting is harder than it looks, and most early CRM implementations underinvest in it. Sales reps use the pipeline view daily; sales managers and executives use reports and dashboards to understand what's actually happening.
The minimum viable CRM reporting layer: pipeline value by stage, win/loss rate by time period, deals won per rep, average deal cycle (days from create to close), and pipeline velocity (value moving through stages per week).
Pipeline velocity is worth implementing correctly from the start. It answers the question "is my pipeline healthy?": multiply the number of deals by the average deal value by the win rate, then divide by the average sales cycle length. A declining pipeline velocity (even with stable pipeline size) is an early warning signal.
Win/loss analysis requires capturing a loss reason at deal close. This is an adoption problem as much as a technical one — sales reps don't enter loss reasons unless it's part of a required workflow. Build it as a required step in the deal-close flow, not an optional field on the deal record.
Revenue forecasting basics: a weighted pipeline model multiplies deal value by stage-specific probability (lead = 10%, proposal = 40%, negotiation = 70%, verbal commit = 90%) to estimate expected revenue for a given period. This is the foundation of every sales forecast and requires accurate stage and close date data — which requires sales rep discipline in keeping records current.
For the broader context on SaaS boilerplate choices that affect CRM product decisions, see our open source SaaS boilerplate guide. If you're building community features alongside your CRM, see best boilerplates for community apps. And the Supastarter review is worth reading if you're considering Supastarter as the underlying SaaS framework for a CRM module.
Methodology
Boilerplate recommendations in this article are based on direct evaluation of Twenty, Monica, and SuiteCRM as CRM platforms, review of their codebases and self-hosting requirements, and experience building CRM features on generic SaaS boilerplates. The CRM categories section reflects the market landscape as of early 2026 and is informed by common patterns in how companies approach CRM product development. Integration cost estimates are directional based on typical engineering timelines and should be validated against your team's specific context.
Check out this boilerplate
View Twenty CRMon StarterPick →