mrkeyoor.com_
Tue 01 Sept 17:42 UTC
Self-Hostedevaluationupdated 28 Aug 2026

wacrm review

wacrm is a forkable customer relationship manager built around the official WhatsApp Business API. It combines a team inbox, contacts, deals, broadcasts, workflow automation, an optional AI reply assistant, a scoped REST API, and an MCP server in one Next.js application.

+51 / 3dstars / 7d
Verdict

Our wacrm run passed all 825 tests in 16 seconds, but its 34-second build failed because Supabase credentials were required during prerendering. It is a credible fork for a small team that already accepts Supabase, Meta Cloud API setup, and ongoing ownership of the code. Choose Chatwoot for a maintained multichannel product, and avoid wacrm when webhook retries or horizontal scaling are requirements from day one.

We ran it

Lab card: what happened when we ran wacrmScreenshot of wacrm (wacrm.tech)
Install✓ · 23s939 packages · 973 MB
Build✗ · 34s
Tests✓ · 16s825 passed · 0 failed of 825 (vitest)
Known vulns00 critical · 0 high · 0 moderate · 0 low (npm audit)
Repo480 files~75,193 lines of source · 4 MB · 2 CI workflows · Dockerfile

Answers from our run

Does wacrm build from source?

Dependencies installed in 23 seconds (939 packages), and the build failed. We cloned commit 6ed9191 into a clean Debian container with 3 CPUs and no project-specific setup.

Do wacrm's tests pass?

Yes: 825 of 825 passed when we ran the project's own test command (vitest). Some failures need services or credentials a bare container does not have.

Does wacrm have known vulnerabilities in its dependencies?

npm audit found none in the dependency tree at the time of our run.

Who should not use wacrm?

Teams wanting a zero-credential preview build: our build failed while prerendering /forgot-password because the Supabase URL and API key were absent.

What are the alternatives to wacrm?

Chatwoot, Twenty, Frappe CRM. Our wacrm run passed all 825 tests in 16 seconds, but its 34-second build failed because Supabase credentials were required during prerendering.

Setup2/5Tests pass, but the build needs Supabase before first deploy
Docs5/5Credentials, Docker, API, MCP, and failure modes are explicit
Community4/52,126 stars with issues and fixes active in late August
Maturity3/5825 tests pass; no tagged release and build is config-coupled

Who it’s for

Small teams that want to own and customize a WhatsApp-focused CRM.
Agencies willing to maintain a fork for each branded deployment.
Supabase users prepared to configure Meta webhooks, credentials, and message templates.
Claude Code and other MCP users who want CRM reads with separately enabled write actions.

Who it’s NOT for

Teams wanting a zero-credential preview build: our build failed while prerendering /forgot-password because the Supabase URL and API key were absent.
Operators seeking one container that includes its database and scheduled jobs: Supabase stays external, migrations run separately, and automation waits need an external scheduler.
Multi-instance deployments that need a shared API rate limit: the public API docs say the 120-request-per-minute limiter is in memory and per process.
Systems that require durable outbound webhook delivery: the docs describe one best-effort attempt, no redirect following, and no retry queue today.
Contributors expecting upstream to become their custom CRM: the project tells users to fork and says feature changes often belong in that fork.

Setup reality

Our sandbox installed 939 packages in 23 seconds and used 973 MB. The build failed after 34 seconds while prerendering /forgot-password: Supabase's server client required a project URL and API key. Tests then passed all 825 cases in 16 seconds. Npm audit found 0 known vulnerabilities.

A working instance needs a Supabase project, anon and service-role keys, a 32-byte encryption key, and a Meta app secret. WhatsApp use also needs official Cloud API setup. AI replies require each account to supply an OpenAI or Anthropic key.

Docker runs only the Next.js app; Supabase and migrations remain external. Wait steps need a scheduler plus a cron secret. Changing public Supabase variables requires a rebuild, while rotating the encryption key makes saved WhatsApp tokens unreadable until users enter them again.

One Next.js app covers the inbox, deals, and automations

wacrm is a concrete WhatsApp CRM that its author expects you to fork. The application includes a shared inbox with assignment and notes, contacts with tags and custom fields, Kanban sales pipelines, broadcasts using approved templates, and a visual automation builder. Team roles range from owner to viewer. The transport is Meta's official WhatsApp Business API, with Supabase providing Postgres, authentication, storage, and row-level security.

The scope goes well beyond a message viewer. A public REST API can read contacts and conversations, send messages, and launch broadcasts. An optional reply assistant calls OpenAI or Anthropic with an account's own key. Its knowledge base uses Postgres text search by default and can add pgvector semantic search when an embeddings key exists.

Fork ownership includes application maintenance

The README repeatedly calls wacrm a template. Its intended path is fork, brand, modify, and host, while feature pull requests may belong in the user's fork. That is honest positioning. You receive source under MIT and can change the fields or workflow, but there is no vendor promising migrations, support, or compatibility for your modifications. A CRM that holds customer conversations needs someone responsible for upgrades and incident response.

The stack is familiar: Next.js 16, React 19, TypeScript, Tailwind 4, and Supabase. The repository's 480 files and roughly 75,193 source lines are already large enough that casual customization can have consequences outside the page being edited.

What happened when we ran it

Our sandbox installed commit 6ed9191 in 23 seconds. Npm added 939 packages and occupied 973 MB on disk, far more than the 4 MB checkout. The build ran for 34 seconds and failed with exit code 1 while prerendering /forgot-password. Supabase's SSR client said a project URL and API key were required, and the Next.js worker stopped.

The test command succeeded in 16 seconds. Vitest reported 825 passed and 0 failed out of 825. Npm audit found 0 known vulnerabilities in the installed dependency tree. Those are reassuring repository signals, especially beside the build failure: the tested logic passed, while the production compilation path assumed configuration that our secret-free sandbox did not have. We did not substitute dummy Supabase values because that could hide a second configuration error.

Our scan found 2 CI workflow files, a Dockerfile, and a Compose file. The build log identifies the missing Supabase URL and API key. It does not show whether valid values are sufficient for a complete build, so a buyer should run that check against a disposable Supabase project before scheduling deployment.

Supabase and Meta configuration start before deployment

Four environment values are required according to the example file: the public Supabase URL, anonymous key, service-role key, and a 64-character hexadecimal encryption key. The Meta app secret is also marked required because inbound webhook requests are checked with HMAC-SHA256.

The service-role credential bypasses row-level security and belongs only in server routes. The encryption value protects saved WhatsApp and AI provider tokens with AES-256-GCM. Rotation has a sharp consequence documented in the template: every token encrypted under the previous value becomes unreadable, so users must save their WhatsApp settings again. Secret backup and rotation procedures should be written before the first team account is invited.

Docker excludes the database, migrations, and scheduler

The included container runs as a non-root user and serves the standalone Next.js output. Compose starts 1 application service; it does not create Supabase. Operators apply the migrations separately and point the app at a hosted or self-hosted project. Public Supabase variables are built into the browser bundle, so changing either one requires rebuilding the image rather than restarting it.

Automation waits also depend on something outside the container. An external scheduler must call 2 cron endpoints with a shared secret, and those endpoints answer 503 until the secret exists. Media storage needs planning too. The Docker guide says received attachments can be copied into a Supabase bucket because Meta later removes them, but files over 16 MB are never copied and the bucket grows with message volume.

MCP writes require scopes and explicit switches

The bundled MCP server works with Claude Code, Claude Desktop, Cursor, and other MCP clients. Its default tools can read contacts, conversations, messages, identity, and broadcast status. Sending a message or changing a contact requires both an API key with the matching scope and WACRM_ENABLE_WRITES=true. Broadcasts add a separate switch and an explicit confirmation parameter.

The REST API has similar care around credentials. Keys are account-scoped, stored as SHA-256 hashes, shown once, and revocable. The standard limit is 120 requests per minute for each key. That limiter lives in memory inside one process, so multiple app instances do not share enforcement. Teams planning horizontal scaling need Redis, Upstash, or another shared counter before they can rely on that limit as a system-wide control.

Outbound webhooks can lose an event after one attempt

API webhooks are signed, require HTTPS, reject private network targets, and can disable an endpoint after repeated failures. Delivery is best-effort with 1 attempt, a short timeout, and no followed redirects. Events may arrive out of order or more than once, so consumers must deduplicate by delivery ID and reconcile through the read API. The docs label a durable retry queue as a future idea and say it is not scheduled.

GitHub recorded the last push on August 27, 2026. The repository had 2,126 stars and 26 combined open issues and pull requests, split into 11 issues and 15 pull requests. Activity on August 27 included fixes and reports concerning sender identity, webhook status details, and Supabase read-only behavior. There is no tagged GitHub release. Pin commit 6ed9191 or another tested revision, and deploy only after the Supabase-backed build succeeds in your own environment.

Alternatives

ProjectWhat it isPick it when
Chatwoot gh↗A mature open-source customer support inbox with WhatsApp and other channels.pick this instead when multichannel support and an established product matter more than owning a small Next.js fork.
Twenty gh↗A general-purpose open-source CRM with customizable records and workflows.pick this instead when sales data is central and WhatsApp is only one possible integration.
Frappe CRMA self-hosted sales CRM built on the Frappe platform.pick this instead when conventional lead and deal management outweighs a WhatsApp-first inbox.
Evolution API gh↗A messaging integration server with several WhatsApp connection options.pick this instead when you need an API layer and plan to build the CRM interface yourself.

What people are saying

  1. [github-trending] ArnasDon/wacrm

Sources

  1. wacrm README
  2. wacrm Docker guide
  3. wacrm MCP server guide
  4. wacrm public API
  5. Failed status webhook issue

More self-hosted reviews

v2 · OpenShell · wigolo · Mindwtr · club-3090 · reclip · the whole board →