Manage contacts in WACRM with labels, notes and tickets
WACRM Workspace's Contacts screen lets you search and import contacts, tag them with labels, log internal notes, and open support tickets — including linking a ticket to one of the contact's bookings. The Linked records card shows a contact's orders and bookings, and everything here also works through the WACRM API with scoped keys.
By Huy Nguyen (David), Founder & CEO of Netbase JSC Updated
What you'll learn
- What you need before you start
- Find and import contacts
- Open a contact: labels, notes and tickets
- Linked records: orders and bookings
- Do the same through the API
- What works today vs. what’s not yet there
Every contact your project talks to on WhatsApp lives on WACRM Workspace’s Contacts screen — created automatically from conversations, or added in bulk by pasting numbers or uploading a CSV. From a contact’s own page you can tag them with labels, keep internal notes your customers never see, and open support tickets that can link to one of their bookings. This tutorial walks the real screens and the real API calls behind them, and says plainly which parts — like a dedicated tickets screen or filtering the Contacts list by label — don’t exist yet.
What you need before you start
- A WACRM Workspace account with at least one project and at least one contact (created from a WhatsApp conversation, or imported — see below).
- For the API steps only:
curl(or any HTTP client that can set headers), and an API key from Developer / API & MCP with the contacts/labels/notes/tickets scopes ticked.
Find and import contacts
Workspace → Contacts lists every contact in the project with columns Name, Phone, Email, Labels and Added, a Search contacts box above them, and Previous/Next paging below showing “n–m of total” contacts.
Click Import contacts to add contacts in bulk — paste one phone number per line, or upload a .csv file with phone,name,email,labels columns in any order (the labels column separates multiple labels with ;, not a comma, following the same plain CSV format RFC 4180 describes, so a label’s own name is never mistaken for a second label). Up to 1,000 rows per import; the dialog warns and disables Import above that limit. After the import, the list refreshes and shows how many rows were created, updated and skipped, plus the line number and reason for any row that failed.
A note next to the Import button is always visible, not something you have to look for: “Imported contacts are NOT opted in. WACRM never grants WhatsApp consent on import — collect opt-in before sending marketing messages.” Importing a phone number is not the same as having permission to message it — see Meta’s own guidance on getting opt-in before sending anything marketing-related to an imported contact.
Open a contact: labels, notes and tickets
Click a contact’s name to open their page. It has six tabs — Profile, Conversations, Orders, Bookings, Notes and Tickets — though only Profile, Notes and Tickets show real data today; Conversations, Orders and Bookings all still show a placeholder saying that module isn’t connected yet (a contact’s real orders and bookings are on the sidebar’s Linked records card instead — see below).
The Profile tab shows phone, email (or “No email on file”), when the contact was Added and Last updated, and their labels as chips (or “No labels yet”).
Labels — click Add label to open an autocomplete (Type to find or create a label) listing labels not already on this contact; pick one or type a new name (shown as Create label "name") to create and attach it in one step. Click the x on a chip to remove (detach) a label from just this contact. To delete a label from the whole project’s catalog instead, click the small trash icon next to any label in that same “Add label” dropdown list — a confirm dialog warns the label “will be removed from every contact it’s attached to across this project. This cannot be undone” before it goes through.
Notes — the Notes tab is a running, newest-first list of internal notes (“Add a note to keep internal context on this contact — buyers never see these”). Type into the box and click Add note.
Tickets — the Tickets tab lists support tickets with status (Open/Pending/Closed), priority (Low/Normal/High) and type (Support/Service request) chips. Click New ticket and fill in Subject and Details, optionally Priority and Type, and — if this contact has any — Link to a booking (optional), which defaults to None. Click Open ticket to create it.
There is no separate tickets screen anywhere in Workspace today: tickets only exist on a contact’s own Tickets tab, one contact at a time. Both the Notes and Tickets tabs load a page at a time (most recent 20 first) with a Load more button beneath the list to fetch the next page — no full refresh needed.
Linked records: orders and bookings
Next to the tabs, a Linked records card shows this contact’s Bookings and Orders — up to three of each, most recent first, with a View bookings / View orders link to the full Bookings or Store orders screen for the rest. A contact with none yet shows “No bookings on file for this contact yet.” / “No orders on file for this contact yet.”
Do the same through the API
Contacts, labels, notes and tickets are backed by these Core API endpoints, each scoped per contact:
POST /v1/contacts/import contacts:write
GET /v1/contacts contacts:read
POST /v1/contacts/{contact}/labels labels:write
DELETE /v1/contacts/{contact}/labels/{label} labels:write
GET /v1/labels labels:read
POST /v1/labels labels:write
DELETE /v1/labels/{label} labels:write
GET /v1/contacts/{contact}/notes notes:read
POST /v1/contacts/{contact}/notes notes:write
GET /v1/contacts/{contact}/tickets tickets:read
POST /v1/contacts/{contact}/tickets tickets:write None of these scopes are granted to a key by default. Tick the ones you need under Restrict what this key can do (advanced) → WhatsApp CRM scopes when you create the key in Developer / API & MCP — a key missing a scope answers 403 insufficient_scope.
Import contacts via the API
curl -s -X POST "https://api.wacrm.ai/v1/contacts/import" \
-H "Authorization: Bearer sk_live_your_scoped_key" \
-H "Content-Type: application/json" \
-d '{"contacts": [{"phone": "+15551234567", "name": "Jane Diaz", "labels": ["vip"]}]}' {
"data": {
"created": 1,
"updated": 0,
"skipped": 0,
"errors": []
}
} Up to 1,000 rows per call (422 too_many_contacts above that). A phone already in the project is never duplicated — only an empty name/email gets filled in, nothing already set is overwritten. Same rule as the Workspace dialog: there is no consent field in this body, and sending one does nothing — an import never opts a contact in.
Add a label, add a note, open a ticket
curl -s -X POST "https://api.wacrm.ai/v1/contacts/your-contact-uuid/labels" \
-H "Authorization: Bearer sk_live_your_scoped_key" \
-H "Content-Type: application/json" \
-d '{"label_id": "your-label-uuid"}'
curl -s -X POST "https://api.wacrm.ai/v1/contacts/your-contact-uuid/notes" \
-H "Authorization: Bearer sk_live_your_scoped_key" \
-H "Content-Type: application/json" \
-d '{"body": "Asked about a refund on order #1042."}'
curl -s -X POST "https://api.wacrm.ai/v1/contacts/your-contact-uuid/tickets" \
-H "Authorization: Bearer sk_live_your_scoped_key" \
-H "Content-Type: application/json" \
-d '{"subject": "Refund request", "body": "Wants a refund on order #1042.", "priority": "high", "type": "support", "booking_id": "your-booking-uuid"}' booking_id is optional and only accepted as a real UUID belonging to one of this contact’s own bookings — a booking id that isn’t this contact’s own, or doesn’t exist, answers 404. priority accepts low/normal/high; type accepts support/service_request; both fall back to a default if left out.
List a contact’s notes or tickets
curl -s "https://api.wacrm.ai/v1/contacts/your-contact-uuid/tickets?page=1&limit=20" \
-H "Authorization: Bearer sk_live_your_scoped_key" page/limit work (limit capped at 100), and both endpoints also return a meta block with current_page, per_page, total and last_page — the same shape GET /v1/contacts returns — so you can tell exactly how many pages there are instead of guessing from a short page.
What works today vs. what’s not yet there
| What you want to do | Works today? |
|---|---|
| Search, page through, and import contacts (paste or CSV) in Workspace | Yes — Contacts → Import contacts |
| See a plain warning that imported contacts aren’t opted in | Yes — shown next to the Import button every time |
| Add, remove, or delete a label from the whole project’s catalog | Yes — from the contact’s Add label dropdown |
| Add internal notes to a contact | Yes — Notes tab |
| Open a ticket and link it to one of the contact’s bookings | Yes — Tickets tab → New ticket → Link to a booking |
| See a contact’s orders and bookings | Yes — the sidebar’s Linked records card (up to 3 of each) |
| See orders/bookings inside the Orders/Bookings tabs on the contact page | Not yet — both still show an isn’t-connected-yet placeholder; use the Linked records card instead |
| Page past the first 20 notes or tickets on a contact | Yes — click Load more on either tab; the API also returns a meta total to page against |
| Open or browse tickets from a dedicated tickets screen | Not yet — tickets only exist inside a contact’s own Tickets tab |
| Filter the Contacts list by label | Not yet — GET /v1/contacts?label= exists in the API, but the Contacts list has no label filter control |
Ready to put this into practice? Request early access to get a Workspace, or have WACRM’s team set up your project for you with Quick Setup.
Talk to an expert
A person from the WACRM team replies.
Ask David a question about “WACRM Contacts CRM: Labels, Notes and Tickets”.
Replies within one working day, usually sooner on WhatsApp.
Frequently asked questions
Are imported contacts opted in to receive WhatsApp messages?
No. Neither pasting numbers nor uploading a CSV ever grants WhatsApp consent — Workspace shows a permanent note next to the Import button saying so, and the API's import body has no consent field at all; one sent anyway is simply ignored. Collect real opt-in, for example following Meta's own getting-opt-in guidance, before sending anything marketing-related to an imported contact.
Is there a dedicated screen for support tickets?
No. Tickets only exist on the Tickets tab of a contact's own detail page in Workspace → Contacts — there is no standalone tickets list or dashboard today, and the Orders and Bookings tabs on that same page still show an isn't-connected-yet placeholder (the real order/booking data lives in the sidebar's Linked records card instead).
Can I see more than the first page of a contact's notes or tickets?
Yes. Both tabs load the first page (most recent, default 20) and show a Load more button that fetches the next page without a full refresh. The API backs this with a `meta` block (`current_page`, `per_page`, `total`, `last_page`) on both endpoints — the same shape `GET /v1/contacts` already returns.
What happens when I delete a label from the catalog instead of just removing it from one contact?
It's removed from every contact it's attached to across the whole project, not just the one you were viewing. Workspace's confirm dialog says so before the delete goes through, and it can't be undone.
Does my plan limit how many labels, notes or tickets I can create?
WACRM's plans list a contact cap — 2,000 on Premium, 10,000 on Advanced, unlimited on Pro — but nothing specific to labels, notes or tickets. Check your plan in Settings for the figure that applies to your account.
Want this set up for you?
Quick Setup connects your number with coexistence in 48 hours, done by a person.