Note on automatic review: Templates created via template/create are automatically submitted for review and do not require a separate call to this node. Use this node specifically for templates that are in DRAFT, PAUSED, or REJECTED status and need to be re-submitted.
When to Use
- Re-submitting rejected templates: After correcting the components of a rejected template via
template/update, a workflow calls this node to re-enter Meta's review queue.
- Activating paused templates: A template that was paused (e.g. due to high user block rate) has been reviewed and corrected. This node re-submits it for Meta to evaluate for re-activation.
- Draft template promotion: A template that was created in draft state programmatically is ready for production use. This node formally submits it for Meta's approval review.
- Automated review pipeline: A template management workflow creates and updates templates in a staging environment, then calls this node as the final promotion step when content approval is obtained internally.
- Batch re-submission: After a policy change that caused multiple templates to be rejected, a bulk remediation workflow corrects and re-submits all affected templates in a single automated run.
Configuration
Connection
| Field | Required | Description |
accessToken | Required | Permanent System User access token with whatsapp_business_management permission. Store in BizFirst Credentials Manager. |
phoneNumberId | Required | WhatsApp Business phone number ID associated with the account owning the template. |
apiVersion | Optional | Meta Graph API version, e.g. v18.0. Defaults to v18.0. |
Operation
| Field | Required | Description |
templateId | Required | The ID of the template to submit for review. The template must be in a state that allows re-submission (DRAFT, PAUSED, or REJECTED after an update). |
Implementation note: This node triggers Meta's review pipeline by making a POST request to the template endpoint. The exact API call may behave as a no-op for templates already in PENDING or APPROVED status — verify the current status with template/get before calling this node.
Sample Configuration
{
"resource": "template",
"operation": "submitForReview",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"templateId": "987654321098765"
}
Validation Errors
| Error | Cause |
accessToken is required | The accessToken field is empty or missing. |
phoneNumberId is required | The phoneNumberId field is empty or missing. |
templateId is required | The templateId field is empty or missing. |
100 (Meta) | Template ID not found or does not belong to the calling account. |
190 (Meta) | Access token expired or invalid. |
200 (Meta) | Token lacks whatsapp_business_management scope. |
132022 (Meta) | Template cannot be submitted in its current state. |
Output
Success Port
Fires when Meta accepts the re-submission. The template is now in PENDING status. Use template/get to poll for the final approval decision.
| Field | Type | Description |
id | string | The template ID that was submitted. |
templateStatus | string | Status after submission — typically null (implicitly PENDING). |
status | string | "created" or "updated" (the operation code returned by Meta's POST endpoint). |
errorCode | string | Empty on success. |
errorMessage | string | Empty on success. |
rawResponse | string | Full raw JSON response from Meta. |
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
{
"id": "987654321098765",
"templateStatus": null,
"status": "created",
"errorCode": null,
"errorMessage": null,
"rawResponse": "{\"id\":\"987654321098765\",\"status\":\"PENDING\"}"
}
Expression Reference
| Value | Expression | Notes |
| Template ID | {{ $output.submitTemplate.id }} | Pass to template/get to poll for approval status. |
| Operation status | {{ $output.submitTemplate.status }} | Confirms the API call succeeded. Template approval must be checked separately via template/get. |
| Error code | {{ $output.submitTemplate.errorCode }} | Non-null on error port. Code 132022 means the template state does not allow submission. |
| Raw response | {{ $output.submitTemplate.rawResponse }} | Full JSON for diagnostics and logging. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| State pre-check | Call template/get before calling this node to confirm the template is in a submittable state. Calling on an already-APPROVED or PENDING template may have unintended effects. |
| Review timeline | After submission, poll template/get every 4 hours until status changes. Do not assume same-day approval. |
| Repeated rejections | If a template is rejected multiple times, review Meta's content policies before re-submitting. Repeated violations may result in the business account being flagged. |
| Credential storage | Store the access token in BizFirst Credentials Manager. |
| Error port handling | Always connect the error port. Failure to submit must be detected and alerting triggered — a template stuck in REJECTED state that was supposed to be resubmitted silently breaks downstream send workflows. |
| Campaign planning | Plan review submissions at least 72 hours before the intended campaign launch to account for Meta's review window plus contingency time for one resubmission if initially rejected. |
Examples
Re-submit After Correction
// Step 1: Update the rejected template with corrected components
{
"resource": "template",
"operation": "update",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"templateId": "987654321098765",
"components": "{{ $input.correctedComponentsJson }}"
}
// Step 2: Submit for review (chained after update success)
{
"resource": "template",
"operation": "submitForReview",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"templateId": "987654321098765"
}
A template remediation workflow first applies the content correction via template/update, then immediately chains to this node to trigger the re-submission. After this node succeeds, a scheduled poll loop monitors template/get every 4 hours until the template reaches APPROVED or REJECTED status.
Batch Re-submission After Policy Change
// Loop node iterates over list of rejected template IDs
{
"resource": "template",
"operation": "submitForReview",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"templateId": "{{ $loop.currentItem.id }}"
}
After a Meta policy change caused bulk rejections, a compliance team prepares corrected component JSON for each affected template. A workflow loops through the list — first calling template/update for each, then this node to re-submit. Results are collected into a resubmission report sent to the communications team.
Draft Promotion Pipeline
{
"resource": "template",
"operation": "submitForReview",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"templateId": "{{ $input.draftTemplateId }}"
}
An internal approval gate workflow presents the template definition to a human approver. On approval, the workflow calls this node to formally submit to Meta. A Slack notification is sent to the campaign manager confirming submission with the expected approval date range (24–48 hours from submission timestamp).