Portal Community
Partial update semantics: You must supply productId plus at least one of name, description, or price. Omitting a field does not clear it; the existing value is preserved. To update the price, always supply the price in minor currency units as a string.
Price accuracy: Incorrect prices in the WhatsApp catalog are displayed directly to customers. Always validate price values from the source system before passing them to this node. Consider a human-approval workflow gate for price changes above a defined threshold.

When to Use

Configuration

Connection

FieldRequiredDescription
accessTokenRequiredPermanent System User access token from Meta Business Manager. Store in BizFirst Credentials Manager and reference via {{ $credentials.whatsAppToken }}.
phoneNumberIdRequiredNumeric string ID of the WhatsApp Business phone number (e.g. 123456789012345).
apiVersionOptionalMeta Graph API version, e.g. v18.0. Defaults to v18.0.

Operation

FieldRequiredDescription
productIdRequiredThe Facebook catalog product item ID to update (e.g. 9876543210123).
nameOptionalNew product display name. Maximum 100 characters. Omit to leave unchanged.
descriptionOptionalNew product description. Maximum 5000 characters. Omit to leave unchanged.
priceOptionalNew price in minor currency units as a string (e.g. "1999" for $19.99). Omit to leave unchanged.

Sample Configuration

{
  "resource": "commerce",
  "operation": "updateProduct",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "productId": "{{ $input.catalogProductId }}",
  "price": "{{ $input.newPriceInCents }}"
}

Validation Errors

ErrorCause
accessToken is requiredThe accessToken field is empty or missing.
productId is requiredThe productId field is empty or missing.
100 (Meta)The product ID does not exist or the System User lacks write access.
200 (Meta)Permissions error — the token lacks catalog_management permission.
190 (Meta)Access token expired or revoked.
100 (Meta — bad price)The price value is not a valid positive integer string.

Output

Success Port

Fires when Meta confirms the product update. The output echoes back the fields that were updated for confirmation logging. Fields not included in the request are returned as empty strings.

FieldTypeDescription
successbooleantrue on the success port.
productIdstringThe product ID that was updated.
namestringNew name if supplied in the request; otherwise empty.
descriptionstringNew description if supplied in the request; otherwise empty.
pricestringNew price if supplied in the request; otherwise empty.
currencystringCurrency code if returned by Meta; otherwise empty.
imageUrlstringImage URL if returned by Meta; otherwise empty.
availabilitystringAvailability status if returned by Meta; otherwise empty.
statusstring"updated" on the success port.
errorCodestringEmpty on success.
errorMessagestringEmpty on success.
payloadstringFull raw JSON response from the Meta Graph API.

Error Port

Fires when Meta rejects the update or the network call fails.

FieldTypeDescription
successbooleanfalse on the error port.
statusstring"failed" or "error".
errorCodestringMeta error code or BizFirst internal validation code.
errorMessagestringHuman-readable error description.
payloadstringRaw API error response for diagnostics.

Sample Output

{
  "success": true,
  "productId": "9876543210123",
  "name": "",
  "description": "",
  "price": "1999",
  "currency": "",
  "imageUrl": "",
  "availability": "",
  "status": "updated",
  "errorCode": "",
  "errorMessage": "",
  "payload": "{\"success\":true}"
}

Expression Reference

ValueExpressionNotes
Updated product ID{{ $output.updateProduct.productId }}Confirms which product was updated. Use in audit log entries.
New price{{ $output.updateProduct.price }}The new price in minor units. Log alongside the previous price for pricing audit trails.
Status{{ $output.updateProduct.status }}Use in an IfCondition node to confirm the update before sending a price-change notification to customers.
Error code{{ $output.updateProduct.errorCode }}Non-empty on error port. Route to a retry queue for transient failures.
Full API response{{ $output.updateProduct.payload }}Raw JSON string for extended diagnostics.

Node Policies & GuardRails

Policy AreaRecommendation
Credential storageAlways store the access token in BizFirst Credentials Manager. Never embed raw tokens in node configuration fields.
Price accuracyPrice updates take effect immediately and are visible to customers. Always validate the source price and consider requiring an approval step for price changes exceeding a defined percentage threshold. Log old and new prices in an audit table on every price update.
Inventory accuracyAvailability status changes (in stock / out of stock) should be triggered by authoritative inventory events from your warehouse system, not by heuristics. A product incorrectly marked "in stock" can result in overselling.
Partial update verificationAfter updating a product, call commerce/getProduct to verify the change was applied correctly, especially for price updates. This catches any silent failures where Meta returns success but the value was not persisted.
Image CDN requirementsIf updating imageUrl (via direct API extension), ensure the new URL is publicly accessible on HTTPS and will not expire. Broken image URLs cause product cards to render without an image in WhatsApp.
Error port handlingAlways connect the error port. Failed price updates in a bulk repricing workflow should be logged with the original product ID and the failed price, and queued for retry rather than silently dropped.

Examples

Real-Time Inventory Status Update

{
  "resource": "commerce",
  "operation": "updateProduct",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "productId": "{{ $input.catalogProductId }}",
  "description": "{{ $input.updatedDescription }}"
}

A warehouse event triggers this workflow when stock reaches zero. The description is updated to include an "out of stock" notice. A separate step in the workflow (via direct API call or future node extension) sets availability. The product remains in the catalog so returning customers can see the item and get notified when it is back.

Promotional Price Application

{
  "resource": "commerce",
  "operation": "updateProduct",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "productId": "{{ $item.catalogProductId }}",
  "price": "{{ $item.salePriceInCents }}",
  "name": "{{ $item.originalName }} — Sale Price"
}

A promotion workflow reads the sale items and their discounted prices from the promotions table and updates each product in a loop. A Delay node paces the updates to avoid rate limits. The original prices and names are saved to a revert table. A second workflow scheduled for sale-end reads the revert table and restores each product's original name and price.

Daily ERP Price Sync

{
  "resource": "commerce",
  "operation": "updateProduct",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "productId": "{{ $item.catalogProductId }}",
  "price": "{{ $item.erpPriceInCents }}"
}

A nightly workflow queries the ERP system for products whose price changed in the last 24 hours. Each changed product is passed to this node with its new price. On success, the workflow calls commerce/getProduct to verify the price was saved. Products with verification failures are logged in an exception report sent to the pricing team at 06:00.