Merge pull request #85 from ArnasDon/chore/whatsapp-trademark-symbol

chore: add WhatsApp® on first mention across user-facing surfaces
This commit is contained in:
Arnas Donauskas 2026-05-06 13:52:23 +03:00 committed by GitHub
commit 280e5b8cd9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 17 additions and 17 deletions

View File

@ -1,6 +1,6 @@
# CRM Template for WhatsApp # CRM Template for WhatsApp
> Self-hostable CRM template for WhatsApp — shared inbox, contacts, > Self-hostable CRM template for WhatsApp® — shared inbox, contacts,
> sales pipelines, broadcasts, and no-code automations. Fork it, brand > sales pipelines, broadcasts, and no-code automations. Fork it, brand
> it, host it. > it, host it.

View File

@ -1,6 +1,6 @@
# Documentation # Documentation
A self-hostable CRM template for WhatsApp built on Next.js and Supabase. A self-hostable CRM template for WhatsApp® built on Next.js and Supabase.
These docs walk you from a freshly forked repo to a production deploy. These docs walk you from a freshly forked repo to a production deploy.
## Reading order ## Reading order

View File

@ -10,7 +10,7 @@ want to change something in your fork.
| Rendering | **Next.js 16** (App Router) | Server components for data-fetch pages; client components where interactivity's needed. React 19. | | Rendering | **Next.js 16** (App Router) | Server components for data-fetch pages; client components where interactivity's needed. React 19. |
| UI | **Tailwind v4** + **shadcn/base-ui** primitives | Tailwind's zero-runtime styling, shadcn patterns for composable, dark-theme-first components. | | UI | **Tailwind v4** + **shadcn/base-ui** primitives | Tailwind's zero-runtime styling, shadcn patterns for composable, dark-theme-first components. |
| Data + Auth | **Supabase** | Postgres with Row-Level Security, built-in email/password auth, Storage for avatars, Realtime for the inbox. | | Data + Auth | **Supabase** | Postgres with Row-Level Security, built-in email/password auth, Storage for avatars, Realtime for the inbox. |
| WhatsApp | **Meta Cloud API** | Official Business API. No third-party gateway. | | WhatsApp® | **Meta Cloud API** | Official Business API. No third-party gateway. |
| Encryption | `node:crypto` AES-256-GCM | Per-user WhatsApp access + verify tokens at rest. | | Encryption | `node:crypto` AES-256-GCM | Per-user WhatsApp access + verify tokens at rest. |
| Scheduler | External HTTP pinger | Hits `GET /api/automations/cron` to drain Wait-step executions. | | Scheduler | External HTTP pinger | Hits `GET /api/automations/cron` to drain Wait-step executions. |

View File

@ -1,6 +1,6 @@
# Automations cron # Automations cron
The **Automations** module lets you build flows that react to WhatsApp The **Automations** module lets you build flows that react to WhatsApp®
events (new message, new contact, keyword match, schedule, etc.). Most events (new message, new contact, keyword match, schedule, etc.). Most
steps run inline — the exception is the **Wait** step, which parks the steps run inline — the exception is the **Wait** step, which parks the
execution in `automation_pending_executions` until its due time. execution in `automation_pending_executions` until its due time.

View File

@ -101,7 +101,7 @@ plain-HTTP version.
## 7. Update the Meta webhook ## 7. Update the Meta webhook
Back in **Meta for Developers → WhatsApp → Configuration**, change the Back in **Meta for Developers → WhatsApp® → Configuration**, change the
callback URL to `https://<your-domain>/api/whatsapp/webhook` and re-verify. callback URL to `https://<your-domain>/api/whatsapp/webhook` and re-verify.
## 8. Schedule the automations cron ## 8. Schedule the automations cron

View File

@ -56,7 +56,7 @@ AUTOMATION_CRON_SECRET=generate-a-long-random-string
- Rotate `SUPABASE_SERVICE_ROLE_KEY` if it leaks — Supabase lets you - Rotate `SUPABASE_SERVICE_ROLE_KEY` if it leaks — Supabase lets you
regenerate it under Project Settings → API. regenerate it under Project Settings → API.
- Treat `ENCRYPTION_KEY` like a database master key. Losing it means - Treat `ENCRYPTION_KEY` like a database master key. Losing it means
connected WhatsApp accounts must reconnect; rotating it means the same. connected WhatsApp® accounts must reconnect; rotating it means the same.
## Next step ## Next step

View File

@ -30,7 +30,7 @@ cp .env.local.example .env.local
You cannot run `npm run dev` until **at least** `NEXT_PUBLIC_SUPABASE_URL` You cannot run `npm run dev` until **at least** `NEXT_PUBLIC_SUPABASE_URL`
and `NEXT_PUBLIC_SUPABASE_ANON_KEY` are set. You need the full Supabase and `NEXT_PUBLIC_SUPABASE_ANON_KEY` are set. You need the full Supabase
setup before WhatsApp features will work, so do that next. setup before WhatsApp® features will work, so do that next.
## 4. Set up Supabase ## 4. Set up Supabase

View File

@ -74,7 +74,7 @@ emails link back correctly.
## 6. (Optional) Storage ## 6. (Optional) Storage
The app downloads WhatsApp media through Meta's `/download` endpoint and The app downloads WhatsApp® media through Meta's `/download` endpoint and
currently relays it on demand rather than caching it in Supabase Storage. currently relays it on demand rather than caching it in Supabase Storage.
No bucket setup is required for a default install. No bucket setup is required for a default install.

View File

@ -41,7 +41,7 @@ In Supabase → **Authentication → Providers → Email**, either:
Set `NEXT_PUBLIC_SITE_URL` **and** add the same origin to Supabase → Set `NEXT_PUBLIC_SITE_URL` **and** add the same origin to Supabase →
**Authentication → URL Configuration → Redirect URLs**. **Authentication → URL Configuration → Redirect URLs**.
## WhatsApp ## WhatsApp®
### Webhook verification fails in Meta ### Webhook verification fails in Meta

View File

@ -1,6 +1,6 @@
# WhatsApp setup # WhatsApp setup
This template talks to the official **WhatsApp Business Cloud API** (Meta). Each This template talks to the official **WhatsApp® Business Cloud API** (Meta). Each
account stores its own `phone_number_id`, `waba_id`, and encrypted account stores its own `phone_number_id`, `waba_id`, and encrypted
`access_token` — there is no shared app-level token. This page walks `access_token` — there is no shared app-level token. This page walks
through getting those values and wiring the webhook. through getting those values and wiring the webhook.

View File

@ -159,7 +159,7 @@ export default function AutomationsPage() {
<div> <div>
<h1 className="text-2xl font-bold text-white">Automations</h1> <h1 className="text-2xl font-bold text-white">Automations</h1>
<p className="mt-1 text-sm text-slate-400"> <p className="mt-1 text-sm text-slate-400">
Build workflows that react to WhatsApp events automatically. Build workflows that react to WhatsApp® events automatically.
</p> </p>
</div> </div>
<Button <Button

View File

@ -271,7 +271,7 @@ export default function InboxPage() {
<div className="flex shrink-0 items-center justify-center gap-2 border-b border-amber-500/20 bg-amber-500/10 px-4 py-2"> <div className="flex shrink-0 items-center justify-center gap-2 border-b border-amber-500/20 bg-amber-500/10 px-4 py-2">
<WifiOff className="h-4 w-4 text-amber-400" /> <WifiOff className="h-4 w-4 text-amber-400" />
<p className="text-xs text-amber-400"> <p className="text-xs text-amber-400">
WhatsApp is not connected. Go to Settings to connect your account. WhatsApp® is not connected. Go to Settings to connect your account.
</p> </p>
</div> </div>
)} )}

View File

@ -39,7 +39,7 @@ export default function SettingsPage() {
<div> <div>
<h1 className="text-2xl font-bold text-white">Settings</h1> <h1 className="text-2xl font-bold text-white">Settings</h1>
<p className="text-sm text-slate-400 mt-1"> <p className="text-sm text-slate-400 mt-1">
Manage your profile, WhatsApp integration, message templates, and Manage your profile, WhatsApp® integration, message templates, and
tags. tags.
</p> </p>
</div> </div>

View File

@ -77,7 +77,7 @@ export default async function Image() {
maxWidth: 1000, maxWidth: 1000,
}} }}
> >
<span>Run your WhatsApp business from&nbsp;</span> <span>Run your WhatsApp® business from&nbsp;</span>
<span style={{ color: '#a78bfa' }}>one inbox.</span> <span style={{ color: '#a78bfa' }}>one inbox.</span>
</div> </div>

View File

@ -25,7 +25,7 @@ export function Hero() {
<div> <div>
<div className="inline-flex items-center gap-2 rounded-full border border-slate-800 bg-slate-900/60 px-3 py-1 text-xs text-slate-300"> <div className="inline-flex items-center gap-2 rounded-full border border-slate-800 bg-slate-900/60 px-3 py-1 text-xs text-slate-300">
<ShieldCheck className="h-3.5 w-3.5 text-violet-400" /> <ShieldCheck className="h-3.5 w-3.5 text-violet-400" />
Built on the official WhatsApp Business API Built on the official WhatsApp® Business API
</div> </div>
<h1 className="mt-5 text-4xl font-bold tracking-tight text-white sm:text-5xl lg:text-6xl"> <h1 className="mt-5 text-4xl font-bold tracking-tight text-white sm:text-5xl lg:text-6xl">

View File

@ -11,11 +11,11 @@ export const SITE_URL =
export const SITE_NAME = 'CRM Template for WhatsApp' export const SITE_NAME = 'CRM Template for WhatsApp'
export const SITE_TAGLINE = 'Run your WhatsApp business from one inbox' export const SITE_TAGLINE = 'Run your WhatsApp® business from one inbox'
/** Default description — reused by layout metadata and structured data. */ /** Default description — reused by layout metadata and structured data. */
export const SITE_DESCRIPTION = export const SITE_DESCRIPTION =
'A CRM template for WhatsApp built for small teams: shared inbox, contact hub, sales pipelines, broadcasts, and no-code automations — built on the official WhatsApp Business API.' 'A CRM template for WhatsApp® built for small teams: shared inbox, contact hub, sales pipelines, broadcasts, and no-code automations — built on the official WhatsApp Business API.'
/** /**
* Keyword targets. Search engines largely ignore the meta keywords * Keyword targets. Search engines largely ignore the meta keywords