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

Send a sales proposal link via WhatsApp API

The scenario sends the prospect a personalised WhatsApp template when a commercial proposal is ready.

Use case overview

The scenario sends the prospect a personalised WhatsApp template when a commercial proposal is ready. The message includes the prospect name, the product or service offered, and a short note about the proposal. A static URL button opens the online proposal document.

Template example

Hello, {{1}}! We are sending you a commercial proposal for "{{2}}". {{3}} Open the document using the button below — we are here if you have questions.

Open proposal
  • {{1}}
    prospect or customer name
  • {{2}}
    product or service covered by the proposal
  • {{3}}
    short proposal note (e.g. valid until 30 June, includes implementation timeline)
  • “Open proposal”
    button — fixed in the Meta template
WhatsApp Business API for commercial proposal send

When to use it

Reach for this scenario when a commercial proposal is ready but email or a CRM link alone is not getting it opened — the prospect has no active WhatsApp thread, so only an approved template can carry the first outbound. It fits B2B sales teams delivering quotes right after generation, agencies triggering WhatsApp when a PDF or web proposal is published in CRM, and service businesses sending pricing packages to qualified leads.

Faster proposal review
Three body variables carry the prospect name, the product or service quoted, and a short note such as validity or timeline, and the static URL button opens the full document in one tap from WhatsApp.
Higher open rates than email alone
The notification lands in WhatsApp where prospects already read messages, instead of a CRM link or inbox they may never open.
No manual proposal ping
CRM or the proposal system emits a proposal-ready event, resolves the phone number, and the template goes out automatically — sales does not retype the summary for each prospect.
Pipeline-ready delivery logging
Delivery result is written back to CRM after send, so the sales team can follow up from the same record that marked the proposal ready.
Compliant first contact outside the chat window
An approved Meta template reaches the prospect when free-text messaging is not allowed because there is no open 24-hour conversation yet.

Workflow

  1. Trigger

    CRM or the proposal system emits a proposal-ready event.

    event · triggered

  2. Capture event

    The system resolves the prospect phone number and proposal fields.

    phone: "+…"

  3. Build & send

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

    POST /sendTemplate

  4. Delivered

    The prospect receives the WhatsApp message with the proposal link.

    delivered

  5. Status tracked

    Delivery result is logged in CRM; sales can follow up based on engagement.

    status: "read"

WhatsApp Business API for commercial proposal send

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
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
Lead Engagement & Conversion
Lead re-engagement message via WhatsApp API
The scenario sends the lead a personalised WhatsApp template when they did not reply to a prior sales message within the expected time.
Lead Engagement & Conversion
Lead handoff to sales notice via WhatsApp API
The scenario sends the client a personalised WhatsApp template when their qualified lead is handed off to the sales team.
Lead Engagement & Conversion
First message to a new lead via WhatsApp API
The scenario sends a new lead a personalised WhatsApp template as the first sales touch.
Lead Engagement & Conversion
Lead intent quick-reply buttons via WhatsApp API
The scenario sends the lead a personalised WhatsApp template asking them to clarify their purpose.
Lead Engagement & Conversion
No-reply follow-up message via WhatsApp API
The scenario sends the client a personalised WhatsApp template when they did not reply to a prior service message within the expected time.

Build for WhatsApp in hours
without infrastructure hassle