Customers
A customer is one of your end-clients within a project. If your product is a SaaS that resells WhatsApp messaging, each tenant of YOUR product becomes a Customer in GoSendAPI.
Project: "Acme SaaS"
├── Customer: "ClĂnica San Lucas"
│ ├── WABA: business_id=123, waba_id=456
│ │ └── Phone: +54 11 5555 1234
│ └── ...
├── Customer: "PizzerĂa Don Pepe"
│ ├── WABA: business_id=789
│ │ ├── Phone: +54 11 4444 5678
│ │ └── Phone: +54 11 3333 9012
│ └── ...
└── Customer: ...When to create a Customer
| Scenario | Create Customer? |
|---|---|
| One of your end-users registers in your platform | âś“ Yes |
| Your end-user adds a second WhatsApp number | ✗ No — that’s a Phone Number under the existing Customer’s WABA |
| You want to bill / report usage per end-user | ✓ Yes — Customers are the billing unit |
| You’re testing a single WABA yourself | ✗ Use the default Customer auto-created with the project |
Customers are not the same as Projects. A Project is your workspace; a Customer is your end-client. One Project usually has hundreds or thousands of Customers.
Properties
| Field | Type | Required | Description |
|---|---|---|---|
id | bigint | auto | Internal numeric ID |
name | string | âś“ | Human-readable name |
external_id | string | optional | Your own ID for this customer (e.g. their UUID in your DB). Use this to map back from webhooks to your system. |
email | string | optional | Contact email |
phone | string | optional | Contact phone (not the WhatsApp number — that goes in Phone Numbers) |
metadata | object | optional | Free-form JSON for any extra info you want to attach |
status | enum | auto | active / inactive / suspended |
Lifecycle
Either via API (POST /admin/tenants/:tenantId/customers) or in the dashboard
Generate a Setup Link → customer authorizes WhatsApp → WABA created
2. Onboard WABAPhone numbers are linked to the WABA, but you query “all phones of customer X” by joining
3. Connect phonesMessages reference a Phone Number, which traces back to a WABA, which belongs to a Customer
4. Send/receiveBest practices
- Always set
external_idto your internal ID. Without it, joining webhook events back to your DB is painful. - Use
metadatafor tier/plan/feature flags. Avoid creating Customer-specific columns; metadata covers 95% of use cases. - Customer ≠end-user contact. The phone numbers in
phonefield are for YOU to contact the customer (sales/support). The WhatsApp numbers they CHAT FROM live in Phone Numbers.