Portal Community

When to Use

Configuration

Connection

FieldRequiredDescription
accessTokenRequiredPermanent System User access token. Store in BizFirst Credentials Manager.
phoneNumberIdRequiredNumeric string ID of the sending WhatsApp Business phone number.
apiVersionOptionalMeta Graph API version. Defaults to v18.0.

Operation

FieldRequiredDescription
toRequiredRecipient's phone number with country code, no + prefix (e.g. 14155552671).
contactsJsonRequiredA JSON array string of contact objects conforming to the WhatsApp contact schema. Each contact must have at minimum a name object with a formatted_name field. See the schema below.

Contact Object Schema

Each object in the contactsJson array supports the following fields:

FieldRequiredDescription
name.formatted_nameRequiredFull display name for the contact (e.g. "Jane Smith").
name.first_nameOptionalFirst name component.
name.last_nameOptionalLast name component.
phonesOptionalArray of phone objects: { "phone": "+14155552671", "type": "CELL", "wa_id": "14155552671" }. Type options: CELL, MAIN, IPHONE, HOME, WORK.
emailsOptionalArray of email objects: { "email": "jane@example.com", "type": "WORK" }.
orgOptionalOrganisation object: { "company": "Acme Corp", "title": "Sales Manager" }.
urlsOptionalArray of URL objects: { "url": "https://example.com", "type": "WORK" }.

Sample Configuration

{
  "resource": "message",
  "operation": "sendContacts",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "to": "{{ $input.customerPhone }}",
  "contactsJson": "[{\"name\":{\"formatted_name\":\"{{ $input.agentName }}\",\"first_name\":\"{{ $input.agentFirstName }}\",\"last_name\":\"{{ $input.agentLastName }}\"},\"phones\":[{\"phone\":\"{{ $input.agentPhone }}\",\"type\":\"WORK\",\"wa_id\":\"{{ $input.agentWaId }}\"}],\"emails\":[{\"email\":\"{{ $input.agentEmail }}\",\"type\":\"WORK\"}],\"org\":{\"company\":\"BizFirst Support\",\"title\":\"{{ $input.agentTitle }}\"}}]"
}

Validation Errors

ErrorCause
accessToken is requiredThe accessToken field is empty.
phoneNumberId is requiredThe phoneNumberId field is empty.
to is requiredThe to field is empty.
Invalid JSON in contacts: ...The contactsJson string is not valid JSON. Validate with a Function node before passing to this operation.
131047 (Meta)24-hour customer service window expired.
131026 (Meta)Recipient is not a registered WhatsApp user.

Output

Success Port

FieldTypeDescription
messageIdstringUnique WhatsApp message ID (wamid).
phoneNumberIdstringThe sending phone number ID.
tostringThe recipient phone number.
statusstring"sent" on success.
errorCodestringEmpty on success.
errorMessagestringEmpty on success.
rawResponsestringFull raw JSON from the Meta API.

Error Port

FieldTypeDescription
statusstring"failed" or "error".
errorCodestringMeta error code or BizFirst validation code.
errorMessagestringHuman-readable error description.
rawResponsestringRaw API error response.

Sample Output

{
  "messageId": "wamid.HBgLMTQxNTU1NTI2NzEVAgARGBI0QzM4NjhGQTExMjQ3RDMAA",
  "phoneNumberId": "123456789012345",
  "to": "14155552671",
  "status": "sent",
  "errorCode": null,
  "errorMessage": null,
  "rawResponse": "{\"messaging_product\":\"whatsapp\",\"contacts\":[{\"input\":\"14155552671\",\"wa_id\":\"14155552671\"}],\"messages\":[{\"id\":\"wamid.HBgLMTQxNTU1NTI2NzEVAgARGBI0QzM4NjhGQTExMjQ3RDMAA\"}]}"
}

Expression Reference

ValueExpressionNotes
Message ID{{ $output.sendContact.messageId }}Retain for audit trail.
Recipient{{ $output.sendContact.to }}For confirmation logging.
Status{{ $output.sendContact.status }}Branch on outcome in IfCondition.

Node Policies & GuardRails

Policy AreaRecommendation
Credential storageStore the access token in BizFirst Credentials Manager. Never inline in configuration.
JSON validationAlways validate the contactsJson string in a Function node before passing it to this operation. Invalid JSON fails with a BizFirst-level error before reaching Meta, which is preferable to a runtime exception but validation ensures consistent failure messages.
PII handlingContact records contain personal information. Only send contacts to users who have a legitimate need to receive them. Log all sends in your audit trail with the operator's identity.
ConsentEnsure the person whose contact card you are sharing has consented to having their phone number and email distributed via WhatsApp. This is especially important for employee contacts shared in commercial workflows.
24-hour windowContact messages are free-form. Outside the customer service window, re-engage with a template message first.
Error portConnect the error port. JSON parse failures surface here with a clear invalid_json error code and should be routed to a validation error handling branch.

Examples

Support Agent Contact Card on Case Escalation

{
  "resource": "message",
  "operation": "sendContacts",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "to": "{{ $input.customerPhone }}",
  "contactsJson": "[{\"name\":{\"formatted_name\":\"Sarah Johnson\",\"first_name\":\"Sarah\",\"last_name\":\"Johnson\"},\"phones\":[{\"phone\":\"+14155559876\",\"type\":\"WORK\",\"wa_id\":\"14155559876\"}],\"emails\":[{\"email\":\"sarah.johnson@example.com\",\"type\":\"WORK\"}],\"org\":{\"company\":\"BizFirst Support\",\"title\":\"Senior Support Specialist\"}}]"
}

After a support case is escalated, this node sends the assigned agent's contact card. The customer can tap "Add to Contacts" and directly message or call the agent using WhatsApp.

Multiple Contact Cards for a Team

{
  "resource": "message",
  "operation": "sendContacts",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "to": "{{ $input.newEmployeePhone }}",
  "contactsJson": "[{\"name\":{\"formatted_name\":\"IT Helpdesk\"},\"phones\":[{\"phone\":\"+14155551234\",\"type\":\"WORK\"}],\"emails\":[{\"email\":\"it@example.com\",\"type\":\"WORK\"}]},{\"name\":{\"formatted_name\":\"HR Department\"},\"phones\":[{\"phone\":\"+14155555678\",\"type\":\"WORK\"}],\"emails\":[{\"email\":\"hr@example.com\",\"type\":\"WORK\"}]}]"
}

An onboarding workflow sends two contact cards — IT Helpdesk and HR — to a new employee on their first day. The array-based format allows multiple contacts in a single message that the recipient can selectively save.