Partial updates: Only fields included in the configuration are sent to the API. Omitted fields retain their current values. You do not need to re-supply all fields to update just one.
When to Use
- Tenant onboarding: A new tenant setup workflow populates the WhatsApp Business profile with the tenant's business details (address, description, email, website) immediately after their phone number is registered.
- Seasonal About text rotation: A scheduled workflow updates the
about field with seasonally relevant content (e.g. holiday hours, special promotions) and reverts it after the period ends.
- Address or contact detail changes: When a business moves premises or changes its support email, an internal change-management workflow automatically updates the WhatsApp Business profile to keep it consistent with the CRM.
- Website URL updates after migration: A post-deployment workflow updates the profile websites array to point to the new domain after a web migration.
- Compliance-driven description updates: A legal or compliance team updates the business description to include required disclosures or disclaimers across all managed WhatsApp accounts.
Configuration
Connection
| Field | Required | Description |
accessToken | Required | Permanent System User access token from Meta Business Manager. Store in BizFirst Credentials Manager. |
phoneNumberId | Required | Numeric string ID of the WhatsApp Business phone number whose profile you want to update. |
apiVersion | Optional | Meta Graph API version, e.g. v18.0. Defaults to v18.0. |
Operation
At least one of the following fields must be provided. Omitted fields are not modified.
| Field | Required | Description |
about | Optional | Short "About" status text visible on the business profile. Maximum 139 characters. |
address | Optional | Physical address of the business (street, city, postcode, country). |
description | Optional | Longer business description displayed on the profile page. |
email | Optional | Business contact email address. Must be a valid email format. |
websites | Optional | JSON array of up to 2 website URLs (e.g. ["https://example.com", "https://shop.example.com"]). Providing an empty array clears all websites. |
vertical | Optional | Industry category. Accepted values: AUTOMOTIVE, BEAUTY, CLOTHING, EDUCATION, ENTERTAINMENT, EVENT_PLANNING, FINANCE, GROCERY, GOVERNMENT, HEALTH, HOTEL, NONPROFIT, PROFESSIONAL_SERVICES, RETAIL, TRAVEL, RESTAURANT, OTHER. |
Sample Configuration
{
"resource": "profile",
"operation": "updateBusiness",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"about": "Same-day delivery across the Bay Area. Chat to order!",
"address": "456 Market Street, San Francisco, CA 94105",
"email": "hello@bizfirstai.com",
"websites": "[\"https://bizfirstai.com\", \"https://shop.bizfirstai.com\"]",
"vertical": "RETAIL"
}
Validation Errors
| Error | Cause |
accessToken is required | The accessToken field is empty or missing. |
phoneNumberId is required | The phoneNumberId field is empty or missing. |
100 (Meta) | Phone number ID not found or the token does not have access. |
190 (Meta) | Access token expired or invalid. |
200 (Meta) | Token lacks required permission scope. |
131000 (Meta) | The about text exceeds 139 characters. |
131003 (Meta) | More than 2 website URLs were provided. |
Output
Success Port
Fires when Meta confirms the profile update. The output includes the values that were submitted (not the full current profile — use profile/getBusiness to read back the complete updated profile).
| Field | Type | Description |
about | string | The submitted About text, or null if not included in the request. |
address | string | The submitted address, or null if not included. |
description | string | The submitted description, or null if not included. |
email | string | The submitted email, or null if not included. |
websites | array | The submitted websites array, or null if not included. |
vertical | string | The submitted vertical, or null if not included. |
status | string | "updated" on success. |
errorCode | string | Empty on success. |
errorMessage | string | Empty on success. |
rawResponse | string | Raw JSON from Meta, typically {"success":true}. |
Error Port
| Field | Type | Description |
status | string | "failed" or "error". |
errorCode | string | Meta error code or BizFirst internal code. |
errorMessage | string | Human-readable description of the failure. |
rawResponse | string | Raw API error JSON for diagnostics. |
Sample Output
{
"about": "Same-day delivery across the Bay Area. Chat to order!",
"address": "456 Market Street, San Francisco, CA 94105",
"description": null,
"email": "hello@bizfirstai.com",
"websites": ["https://bizfirstai.com", "https://shop.bizfirstai.com"],
"vertical": "RETAIL",
"status": "updated",
"errorCode": null,
"errorMessage": null,
"rawResponse": "{\"success\":true}"
}
Expression Reference
| Value | Expression | Notes |
| Status | {{ $output.updateBusinessProfile.status }} | "updated" confirms the API call succeeded. |
| Submitted email | {{ $output.updateBusinessProfile.email }} | Echoes back the submitted value. Null if email was not included in the update. |
| Submitted websites | {{ $output.updateBusinessProfile.websites }} | Array of submitted URLs. |
| Error code | {{ $output.updateBusinessProfile.errorCode }} | Non-null on error port. Check for 131000 if about is being set from user input. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| About text length | Validate about text length (max 139 chars) in an upstream Function node before calling this operation to avoid a 131000 rejection. |
| Website array limit | The websites field accepts at most 2 URLs. Validate the array length before passing. Pass an empty array [] to clear all websites. |
| Read-before-update | If doing a partial update, retrieve the current profile first with profile/getBusiness to preserve existing fields that are not being changed. |
| Credential storage | Store the access token in BizFirst Credentials Manager. Never paste it into node configuration as plain text. |
| Audit logging | Log all profile updates — which fields were changed, the previous values, new values, timestamp, and the triggering workflow — for change management records. |
| Error port handling | Always connect the error port. Silent failures on profile updates can leave the public-facing business profile in an inconsistent state. |
Examples
Tenant Onboarding — Initial Profile Setup
{
"resource": "profile",
"operation": "updateBusiness",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "{{ $input.phoneNumberId }}",
"about": "{{ $input.aboutText }}",
"address": "{{ $input.businessAddress }}",
"description": "{{ $input.businessDescription }}",
"email": "{{ $input.supportEmail }}",
"websites": "{{ $input.websiteUrlsJson }}",
"vertical": "{{ $input.industryVertical }}"
}
A tenant onboarding workflow collects business details from the onboarding form and sets all profile fields in one call. After success, it calls profile/getBusiness to read back the live profile and verify each field before marking the onboarding as complete.
Seasonal About Text Update
{
"resource": "profile",
"operation": "updateBusiness",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"about": "Holiday hours: Mon–Sat 9am–6pm. Closed Dec 25–26. Happy Holidays!"
}
A scheduled workflow fires on Dec 20 and sets the seasonal About text. A second scheduled workflow fires on Dec 27 and restores the standard About text from the configuration store. Only the about field is supplied — all other profile fields remain unchanged.
Post-Migration Website URL Update
{
"resource": "profile",
"operation": "updateBusiness",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"websites": "[\"https://new.bizfirstai.com\", \"https://shop.new.bizfirstai.com\"]"
}
A post-deployment workflow fires after a successful web migration. It updates the websites field with the new domain URLs. The old domain will continue to redirect but the profile now shows the canonical new URLs, ensuring consistency in WhatsApp search results.