💬 Shared WhatsApp Inbox on the new PlatformMore
1msg official logo

Payment received alert to finance via WhatsApp API

The scenario sends the finance manager a personalised WhatsApp template when a new payment is received.

Use case overview

The scenario sends the finance manager a personalised WhatsApp template when a new payment is received. The message includes the customer name, payment amount, and payment date. A static URL button opens the billing dashboard.

Template example

💳 New payment received

Customer: {{1}}

Amount: {{2}}

Date: {{3}}

Review the payment in the billing dashboard.

Open billing
  • {{1}}
    customer name
  • {{2}}
    payment amount
  • {{3}}
    payment date
  • “Open billing”
    button — fixed in the Meta template
WhatsApp Business API for new payment notification

When to use it

Reach for this scenario when a payment gateway or billing system posts a successful charge and the finance manager needs to know before the next dashboard refresh. It fits finance teams monitoring incoming payments, billing ops matching offline or bank transfers in ERP, and integrators wiring PSP webhooks to internal manager alerts via 1MSG.

Faster reconciliation
Customer name, amount and date arrive as three body variables on the manager's phone when the payment event fires, so reconciliation can start from WhatsApp instead of waiting on email or a refreshed dashboard.
Alerts without an open chat
An approved template reaches the finance manager's phone even when there is no open WhatsApp conversation, which is the only channel allowed for this first outbound alert.
One tap to the billing dashboard
A static URL button fixed in the Meta template opens the billing dashboard from the alert, so the manager reviews the payment without hunting for the record.
No manual alert routing
Billing or the gateway emits the new-payment event, the system resolves the manager phone and builds the template, so no one retypes the payment summary or remembers to notify.
Delivery logged for finance analytics
Delivery result is recorded after the send, so billing or finance systems can track alert delivery alongside the payment event.

Workflow

  1. Trigger

    Billing or the payment gateway emits a new-payment event.

    event · triggered

  2. Capture event

    The system resolves the finance manager phone number and payment summary fields.

    phone: "+…"

  3. Build & send

    An internal notification template is built with three body variables and a static URL button.

    POST /sendTemplate

  4. Delivered

    The manager receives the WhatsApp alert on their phone.

    delivered

  5. Status tracked

    Delivery result is logged; the manager opens the billing dashboard via the button.

    status: "read"

WhatsApp Business API for new payment notification

Technical implementation

Prerequisites

  1. 1MSG API Key · How to get API Key
  2. WhatsApp Business account · How to Connect WABA
  3. WhatsApp Template · How to Approve WABA Template
  4. Customer opt-in · How to Manage Customers Consent

Code examples

#!/usr/bin/env bash
set -euo pipefail

# === Configuration (replace "___" placeholders) ===

API_BASE_URL="https://api.1msg.io"        # production 1MSG API base URL
CHANNEL_ID="___"                           # channel ID from 1MSG dashboard
API_TOKEN="___"                            # channel JWT token (Bearer)

TEMPLATE_NAME="___"                        # approved template name
TEMPLATE_NAMESPACE="___"                   # template namespace (required — send fails without it)
TEMPLATE_LANGUAGE="___"                    # template language code, e.g. "en"



# === Test data ===
MANAGER_PHONE="___"                 # manager phone in international format
TEST_CUSTOMERNAME="___"         # {{1}} customer name
TEST_PAYMENTAMOUNT="___"         # {{2}} payment amount
TEST_DATE="___"         # {{3}} date or time

PHONE_NORM="$(printf '%s' "$MANAGER_PHONE" | tr -cd '0-9')"

for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" \
            "TEMPLATE_NAME=$TEMPLATE_NAME" "TEMPLATE_NAMESPACE=$TEMPLATE_NAMESPACE" \
            "TEMPLATE_LANGUAGE=$TEMPLATE_LANGUAGE" "MANAGER_PHONE=$MANAGER_PHONE" \
            "TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
            "TEST_PAYMENTAMOUNT=$TEST_PAYMENTAMOUNT" \
            "TEST_DATE=$TEST_DATE"; do
    val="${pair#*=}"
    if [ -z "$val" ] || [ "$val" = "___" ]; then
        echo "Missing configuration value: ${pair%%=*}" >&2
        exit 1
    fi
done

if [ -z "$PHONE_NORM" ]; then
    echo "Error: phone number has no digits after normalization" >&2
    exit 1
fi

URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendTemplate"

# params carries body ONLY. Button text is fixed in the Meta template — no button param.

# {{1}} customer name → ${TEST_CUSTOMERNAME}
# {{2}} payment amount → ${TEST_PAYMENTAMOUNT}
# {{3}} date or time → ${TEST_DATE}
read -r -d '' PAYLOAD <<JSON || true
{
  "phone": "${PHONE_NORM}",
  "template": "${TEMPLATE_NAME}",
  "namespace": "${TEMPLATE_NAMESPACE}",
  "language": { "policy": "deterministic", "code": "${TEMPLATE_LANGUAGE}" },
  "params": [
    {
      "type": "body",
      "parameters": [
        { "type": "text", "text": "${TEST_CUSTOMERNAME}" },
        { "type": "text", "text": "${TEST_PAYMENTAMOUNT}" },
        { "type": "text", "text": "${TEST_DATE}" }
      ]
    }

  ]
}
JSON

RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -d "$PAYLOAD")"

HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"

case "$BODY" in
    *'"sent":true'*) ok=1 ;;
    *) ok=0 ;;
esac

if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
    echo "Message sent to manager."
    echo "API response: $BODY"
else
    echo "Send failed. HTTP status: $HTTP_CODE" >&2
    echo "$BODY" >&2
    exit 1
fi

Response and delivery status

HTTP 2xx and JSON "sent": true mean 1MSG accepted the message for sending — not that it already reached the customer's phone. Save the id field (looks like wamid.…) to correlate delivery callbacks.

200 OKResponse
{
  "sent": true,
  "message": "Sent to [email protected]",
  "description": "Message has been sent to the provider",
  "id": "wamid.HBgLMzgwNjM5..."
}
  • sent

    Accepted for sending — not yet on the customer's phone

  • id

    Store it; delivery callbacks and hookInfo are keyed on this

Delivery statuses and webhooks →

Common errors

StatusAPI responseCauseFix
200Message was not sent: template is not definednamespace, template or language is missing from the request body.Send all three. Take namespace and the exact template name from GET /templates; language is an object: {"policy": "deterministic", "code": "en"}.
200template name (…) does not exist in <language>The template is approved in a different language than the one requested.Use the exact language code the template was approved in (for example es_MX is not the same as es). Check it in GET /templates.
200Message was not sent: provide chatId, phone, bsuid, or usernameNo recipient the channel could resolve.Pass exactly one recipient: phone (country code plus number, digits only), chatId (for example [email protected]) or bsuid.

All error codes →

Common questions

Related

Build for WhatsApp in hours
without infrastructure hassle