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

Proposal follow-up reminder via WhatsApp API

The scenario sends the prospect a personalised WhatsApp template message reminding them to review the commercial proposal.

Use case overview

The scenario sends the prospect a personalised WhatsApp template message reminding them to review the commercial proposal. The message contains the prospect's name, the product or service discussed, and a clear recommended next step. A static URL button lets them open the proposal document directly.

Template example

Hi {{1}}, we wanted to follow up on the proposal we sent you for {{2}}. We would love to hear your thoughts - {{3}}. If you have any questions or need more details, feel free to reply to this message.

View Proposal
  • {{1}}
    prospect's name
  • {{2}}
    name of the product or service covered by the proposal
  • {{3}}
    recommended next step for the prospect (e.g. review, schedule a call, confirm)
  • “View Proposal”
    button — fixed in the Meta template
WhatsApp Business API for proposal follow-up reminder

When to use it

Reach for this scenario when a commercial proposal or quote went out and the prospect still has not responded after one or two days — and there is no open WhatsApp chat, so only an approved template can reach them. It fits B2B sales teams waiting on signed proposals, e-commerce or SaaS flows where pricing was sent but the deal went quiet, and agencies or small teams automating the follow-up step from CRM or a sales pipeline tool.

Stalled deals get a timely nudge
The CRM or sales system detects that a proposal was sent and the 1–2 day follow-up delay has elapsed, then fires an approved WhatsApp template even though no session is open.
Fewer intrusive follow-up calls
Three body variables carry the prospect's name, the product or service in the proposal, and a recommended next step, so sales sends a polite reminder the prospect can answer when ready.
Proposal opens in one tap
The static URL button fixed in the Meta template links straight to the online proposal, so review happens from WhatsApp instead of digging through email.
Less manual chase work
Phone number, offer context, and next step are pulled from CRM when the trigger fires, and the delivery result logs back for pipeline follow-up.

Workflow

  1. Build & send

    The CRM or sales system detects that a commercial proposal was sent and the follow-up delay (1–2 days) has elapsed.

    POST /sendTemplate

  2. Capture event

    Prospect phone number, product or service context, and the recommended next step are retrieved from CRM.

    phone: "+…"

  3. A personalised template message

    A personalised template message is built with three body variables and a static URL button linking to the proposal.

    POST /sendTemplate

  4. Delivered

    The prospect receives the WhatsApp message and can follow the link to open and review the proposal.

    delivered

  5. Status tracked

    Delivery result is logged for further follow-up in the CRM or sales pipeline.

    status: "read"

WhatsApp Business API for proposal follow-up reminder

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 ===
TEST_PHONE="___"                 # client phone in international format
TEST_CUSTOMERNAME="___"         # {{1}} customer name
TEST_PRODUCTORSERVICENAME="___"         # {{2}} product or service name
TEST_NEXTSTEP="___"         # {{3}} next step

PHONE_NORM="$(printf '%s' "$TEST_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" "TEST_PHONE=$TEST_PHONE" \
            "TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
            "TEST_PRODUCTORSERVICENAME=$TEST_PRODUCTORSERVICENAME" \
            "TEST_NEXTSTEP=$TEST_NEXTSTEP"; 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}} product or service name → ${TEST_PRODUCTORSERVICENAME}
# {{3}} next step → ${TEST_NEXTSTEP}
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_PRODUCTORSERVICENAME}" },
        { "type": "text", "text": "${TEST_NEXTSTEP}" }
      ]
    }

  ]
}
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 client."
    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

Lead Engagement & Conversion
Reply to price inquiries via WhatsApp API
This scenario sends a free-text WhatsApp message with sendMessage inside the 24-hour customer service window after the client asks how much a product or service costs.
Lead Engagement & Conversion
Auto-reply to inbound leads via WhatsApp API
This scenario sends a free-text WhatsApp message with sendMessage inside the 24-hour customer service window after the client wrote first about a product or service.
Lead Engagement & Conversion
Reply to stock availability questions (WhatsApp API)
This scenario sends a free-text WhatsApp message with sendMessage inside the 24-hour customer service window after the client asks if an item is available.
Lead Engagement & Conversion
Purchase decision nudge with WhatsApp buttons
This scenario sends a prospective customer a personalised WhatsApp template while they are still deciding.
Lead Engagement & Conversion
WhatsApp API list message: product catalog picker
This scenario sends an interactive list with sendList during the 24-hour session window.
Lead Engagement & Conversion
Consultation invite via WhatsApp API template
The scenario sends the customer a personalized WhatsApp template message inviting them to a pre-purchase consultation.
Lead Engagement & Conversion
New lead alert to sales manager via WhatsApp API
The scenario sends the sales manager a personalised WhatsApp template when a new lead is captured.
Lead Engagement & Conversion
Start lead qualification via WhatsApp API
This use case sends a new lead an approved WhatsApp template with a personalized greeting: the message substitutes the lead's name and product or source context, and the «Начать» (Start) quick-reply b

Build for WhatsApp in hours
without infrastructure hassle