Partial updates: Only the fields you provide are updated. Omitting name, defaultCountry, or defaultCurrency leaves those values unchanged on the catalog. You must supply at least one of these optional operation fields for the call to have any effect.
When to Use
- Seasonal rebranding: A marketing automation workflow renames the catalog from "Summer Collection 2025" to "Autumn Collection 2025" at the start of each season, keeping the catalog name consistent with the current promotional period without recreating it.
- Market expansion: When a retailer expands to a new country, a provisioning workflow updates the catalog's
defaultCountry and defaultCurrency to reflect the new primary market, ensuring prices display correctly for customers in that region.
- Multi-currency catalogue management: A currency management workflow detects a new default currency preference from the merchant's settings and propagates the change to the Facebook Catalog automatically, keeping the commerce channel aligned with the merchant's accounting system.
- Post-migration cleanup: After migrating a business to a new Meta Business Manager account, a remediation workflow updates catalog names and locale settings programmatically across all connected WABAs without requiring manual Commerce Manager access.
- Automated catalog governance: A governance workflow enforces a naming convention (e.g.,
[BrandCode]-[Year]-[Region]) by querying each catalog via commerce/getCatalog and calling this node to rename any catalog that does not match the expected pattern.
Configuration
Connection
| Field | Required | Description |
accessToken | Required | Permanent System User access token from Meta Business Manager. Store in BizFirst Credentials Manager and reference via {{ $credentials.whatsAppToken }}. |
phoneNumberId | Required | Numeric string ID of the WhatsApp Business phone number (e.g. 123456789012345). |
apiVersion | Optional | Meta Graph API version, e.g. v18.0. Defaults to v18.0. |
Operation
| Field | Required | Description |
catalogId | Required | The numeric Facebook Catalog ID to update (e.g. 987654321098765). Must be an existing catalog the System User has access to. |
name | Optional | New display name for the catalog. Visible in Meta Commerce Manager and in WhatsApp product messages. Maximum 100 characters. |
defaultCountry | Optional | ISO 3166-1 alpha-2 country code for the catalog's primary market (e.g. US, GB, IN). Affects default tax and pricing display. |
defaultCurrency | Optional | ISO 4217 currency code for the catalog's default pricing currency (e.g. USD, GBP, INR). Used when products do not specify an explicit currency. |
Sample Configuration
{
"resource": "commerce",
"operation": "updateCatalog",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"catalogId": "987654321098765",
"name": "Autumn Collection 2025",
"defaultCountry": "US",
"defaultCurrency": "USD"
}
Validation Errors
| Error | Cause |
accessToken is required | The accessToken field is empty or missing. |
catalogId is required | The catalogId field is empty or missing. |
100 (Meta) | Invalid catalog ID or the System User does not have write access to this catalog. |
200 (Meta) | Permissions error — the access token lacks catalog_management permission. |
190 (Meta) | Access token expired or revoked. Rotate the token in Meta Business Manager. |
100 (Meta — invalid country) | The defaultCountry value is not a valid ISO 3166-1 alpha-2 code. |
100 (Meta — invalid currency) | The defaultCurrency value is not a valid ISO 4217 code. |
Output
Success Port
Fires when Meta confirms the catalog update. The response echoes back the catalogId and name fields from the request for confirmation logging.
| Field | Type | Description |
success | boolean | true on the success port. |
catalogId | string | The catalog ID that was updated. |
name | string | The new catalog name as provided in the request (echoed for confirmation). |
status | string | "updated" on the success port. |
errorCode | string | Empty on success. |
errorMessage | string | Empty on success. |
payload | string | Full raw JSON response from the Meta Graph API. |
Error Port
Fires when the catalog update is rejected by Meta or when the network call fails.
| Field | Type | Description |
success | boolean | false on the error port. |
status | string | "failed" or "error". |
errorCode | string | Meta error code or BizFirst internal validation code. |
errorMessage | string | Human-readable error description. |
payload | string | Raw API error response for diagnostics. |
Sample Output
{
"success": true,
"catalogId": "987654321098765",
"name": "Autumn Collection 2025",
"status": "updated",
"errorCode": "",
"errorMessage": "",
"payload": "{\"success\":true}"
}
Expression Reference
| Value | Expression | Notes |
| Updated catalog ID | {{ $output.updateCatalog.catalogId }} | Pass to downstream product sync nodes to confirm the correct catalog was updated. |
| New catalog name | {{ $output.updateCatalog.name }} | Use in audit log entries or confirmation notifications. |
| Status | {{ $output.updateCatalog.status }} | Use in an IfCondition node to confirm the update before proceeding with product operations. |
| Error code | {{ $output.updateCatalog.errorCode }} | Non-empty on error port. Route to an alert node for governance violations. |
| Full API response | {{ $output.updateCatalog.payload }} | Raw JSON string from Meta. Parse with JsonTransform for extended diagnostics. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| Credential storage | Always store the access token in BizFirst Credentials Manager. Never embed raw tokens in node configuration. |
| Catalog name accuracy | Catalog names appear on product messages shown to customers. Ensure name changes are reviewed before automated workflows apply them. Consider a human-approval gate for name changes in customer-facing contexts. |
| Currency consistency | The defaultCurrency must match the currency used when creating products. Changing the default currency does not retroactively update product prices — update individual product records separately via commerce/updateProduct. |
| Country code validation | Validate ISO 3166-1 alpha-2 country codes before passing them to this node. Invalid codes are rejected by Meta with error 100 and cause the entire update to fail even if the name field was valid. |
| Change frequency | Catalog metadata updates are low-frequency operations. Do not build workflows that call this node in tight loops. Rate-limit to no more than a few updates per day per catalog. |
| Error port handling | Always connect the error port. A failed catalog rename does not affect the catalog's products but may indicate a permission issue that will also block product operations. |
Examples
Seasonal Catalog Rename
{
"resource": "commerce",
"operation": "updateCatalog",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"catalogId": "987654321098765",
"name": "{{ $input.seasonName }} Collection {{ $input.year }}"
}
A ScheduledTrigger node fires at the start of each season, reads the new season name and year from a configuration table, and passes them to this node. Only the name field is included — country and currency remain unchanged. A Notification node downstream sends a Slack message confirming the rename.
Market Expansion: Update Default Country and Currency
{
"resource": "commerce",
"operation": "updateCatalog",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"catalogId": "987654321098765",
"defaultCountry": "{{ $input.marketCountryCode }}",
"defaultCurrency": "{{ $input.marketCurrencyCode }}"
}
When a merchant onboards to a new market, a provisioning workflow reads the target country and currency codes from the merchant's profile and applies them to the catalog. The workflow then triggers a full product re-sync to update individual product prices for the new currency.
Governance Enforcement: Rename Non-Compliant Catalogs
{
"resource": "commerce",
"operation": "updateCatalog",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"catalogId": "{{ $input.catalogId }}",
"name": "{{ $input.brandCode }}-{{ $input.year }}-{{ $input.region }}"
}
A governance workflow loops through all catalogs, applies the naming convention [BrandCode]-[Year]-[Region], and logs each rename. Catalogs already compliant are skipped via an IfCondition node comparing {{ $output.getCatalog.name }} against the expected pattern before calling this node.