← Blog

·

Post-purchase follow-up and NPS on WhatsApp: how to ask for feedback without being annoying

Updated on October 25, 2026

To run an NPS survey on WhatsApp without annoying customers, send a single short survey after the customer received the order or finished a support interaction, mention that specific order, let them answer in one tap (buttons or WhatsApp Flows), and cap how often each customer is surveyed. On the official WhatsApp Business API, that message can only be a utility template if it is tied to a concrete purchase or interaction; Meta classifies generic surveys as marketing.

This guide covers the post-purchase flow, Meta’s category rule for surveys, three ways to collect the score (buttons, list and Flow), a sample NPS Flow, and how to read answers in the webhook.

Surveys on WhatsApp: what Meta allows

Meta’s template categorization documentation has a specific row for feedback surveys. They are utility when they collect feedback on a previous order, transaction or interaction, and specificity is mandatory: “A general/generic survey or request for feedback will not be approved as utility.”

In practice:

TextLikely category
“Your order {{1}} was delivered. How was your experience? Tap below to answer a short survey.”Utility
“You contacted our support about order {{1}}. How was the service?”Utility
“We’d love to hear what you think of our brand!”Marketing (generic)
“Rate your order {{1}} and get 10% off your next purchase.”Marketing (mixed content with an offer)

The last example is the most common mistake. A coupon as an incentive turns the survey into marketing, because templates that mix utility and marketing content are classified as marketing. For the logic behind the three categories, see how Meta classifies your template.

There’s a second path too: if the customer messaged you in the last 24 hours, the customer service window is open and you can send the survey as a free-form message (buttons, list or Flow), with no template.

When to send: the post-purchase flow

The right trigger is an event in your system, not a fixed calendar date. A lean flow:

  1. Order confirmation (utility).
  2. Shipping updates (utility).
  3. Delivery confirmed: your system records delivery from the carrier or your app.
  4. Short wait: give the customer time to use the product. For food, minutes; for electronics, a few days. Set it per product type.
  5. NPS survey, mentioning the order.
  6. Follow-up based on the score: a thank-you for high scores, human contact for low scores.

For customer support, the trigger is ticket closure. Same principle: mention the interaction and ask one thing. Metrics such as CSAT and response time are covered in customer service metrics on WhatsApp.

Frequency: what keeps complaints down

Meta doesn’t set a maximum number of surveys per customer. What it measures is feedback: blocks, reports and mutes lower your phone number quality rating. Over-surveying is a fast way to get there. Rules that work well in your own system:

  • One survey per order, never more than one per event.
  • Per-customer cap: for example, at most one survey every 30 or 60 days, even for weekly buyers. Choose the cap based on your purchase frequency.
  • No reminders: if the customer didn’t answer, don’t push.
  • Honor opt-outs: add a button such as “No more surveys” and store the preference.
  • Don’t survey after an unresolved issue: if the order has an open complaint, fix it first.

Every business-initiated message requires opt-in. If the customer agreed to receive order updates on WhatsApp, make it clear in the same consent that you may ask for feedback. See how to build an opt-in list.

Three ways to collect the score

FormatHow it worksLimitGood for
Quick reply buttonsUp to 3 buttons with labels up to 20 characters3 optionsSimple CSAT (good, okay, bad)
Interactive listMenu with selectable rowsUp to 10 rows in totalScales of up to 10 points
WhatsApp FlowsForm inside the chat, with screens and componentsRadioButtonsGroup accepts up to 20 options0–10 NPS with a comment

The limits come from Meta: reply buttons, interactive lists and Flows components.

Note the detail: classic NPS runs from 0 to 10, which means 11 options. It doesn’t fit in an interactive list, which accepts up to 10 rows. Your options are a Flow, asking the customer to type the number (and validating it), or using a different scale.

NPS with WhatsApp Flows

WhatsApp Flows opens a form inside the chat. For a survey, one screen is enough: the 0–10 score and an optional comment field. Meta itself links survey tutorials built with Flows on its examples page.

A minimal Flow JSON:

{
  "version": "6.0",
  "screens": [
    {
      "id": "NPS",
      "title": "Rate your order",
      "terminal": true,
      "success": true,
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          { "type": "TextBody", "text": "From 0 to 10, how likely are you to recommend our store to a friend?" },
          {
            "type": "RadioButtonsGroup",
            "name": "score",
            "label": "Your score",
            "required": true,
            "data-source": [
              { "id": "0", "title": "0" }, { "id": "1", "title": "1" }, { "id": "2", "title": "2" },
              { "id": "3", "title": "3" }, { "id": "4", "title": "4" }, { "id": "5", "title": "5" },
              { "id": "6", "title": "6" }, { "id": "7", "title": "7" }, { "id": "8", "title": "8" },
              { "id": "9", "title": "9" }, { "id": "10", "title": "10" }
            ]
          },
          { "type": "TextArea", "name": "comment", "label": "Any comments?", "required": false },
          {
            "type": "Footer",
            "label": "Send rating",
            "on-click-action": {
              "name": "complete",
              "payload": { "score": "${form.score}", "comment": "${form.comment}" }
            }
          }
        ]
      }
    }
  ]
}

The Flow can be sent in two ways, according to the sending a Flow documentation:

  • Inside the customer service window: an interactive message of type flow.
  • Outside the window: a template with a FLOW button. The same category rule applies: utility if the text mentions the order and has no offer.

Use the flow_token to identify the order. The Flow response doesn’t include the Flow ID, and Meta recommends putting an identifier in the flow_token or the payload.

Reading the answer in the webhook

When the customer completes the Flow, you receive an interactive message of type nfm_reply. The response_json field is a JSON string with the payload you defined in the complete action, per the Flows webhooks documentation:

{
  "from": "5511988887777",
  "id": "wamid.HBgN...",
  "type": "interactive",
  "interactive": {
    "type": "nfm_reply",
    "nfm_reply": {
      "name": "flow",
      "body": "Sent",
      "response_json": "{\"flow_token\": \"order-48213\", \"score\": \"6\", \"comment\": \"Arrived late\"}"
    }
  }
}

A Node.js handler that classifies the score and triggers the next step:

export function handleNps(msg, db, alertTeam) {
  if (msg.type !== 'interactive' || msg.interactive.type !== 'nfm_reply') return;

  const r = JSON.parse(msg.interactive.nfm_reply.response_json);
  const score = Number(r.score);
  const group = score >= 9 ? 'promoter' : score >= 7 ? 'passive' : 'detractor';

  db.saveNps({ order: r.flow_token, wa_id: msg.from, score, group, comment: r.comment });

  if (group === 'detractor') alertTeam({ order: r.flow_token, wa_id: msg.from, score, comment: r.comment });
}

Splitting into promoters (9 and 10), passives (7 and 8) and detractors (0 to 6) is the standard NPS convention. The score is the percentage of promoters minus the percentage of detractors.

If you used quick reply buttons in a template, the webhook arrives with type: "button" and the label in button.text. In free-form interactive messages, the type is button_reply or list_reply. To match the survey with message delivery, use the status webhook.

What to do with the score

  • Detractor (0–6): open a human conversation within minutes, while the 24-hour window opened by the customer’s answer is still open. Fixing the problem there matters more than the number.
  • Passive (7–8): say thanks and ask what was missing, only if the comment was empty.
  • Promoter (9–10): say thanks. If you want to ask for a public review (Google, marketplace), do it in the same chat, inside the window opened by the answer, with no new template.

That last point avoids a second business-initiated message: the customer’s answer opened the service window, and the free-form thank-you goes out as a service message.

How to do it with Vectalk

Vectalk uses the same payloads and webhooks as the Cloud API:

  • Survey template: create it with POST /api/templates and category UTILITY (docs).
  • Flow: create it with POST /api/flows and publish it with POST /api/flows/{flowId}/publish (Flows docs).
  • Sending: POST /api/messages, with type: "template" or type: "interactive" and interactive.type: "flow" (examples).
  • Answers: register your URL with POST /api/webhooks and handle nfm_reply as shown above.

Message costs are included in your Vectalk invoice, and Vectalk pays Meta. Create your account at apps.vectalk.com.br/register.

Frequently asked questions

Is an NPS survey a utility or marketing template?

Utility, when the text mentions a specific order, visit or support interaction and has no offer. A generic brand survey, or a survey with a coupon as an incentive, is marketing.

Can I offer a discount to people who answer?

You can, but the message becomes marketing, with marketing pricing and rules, and requires opt-in for that kind of message. If you want to keep the survey as utility, leave the offer out.

How long after delivery should I send it?

Meta has no rule. Ideally, once the customer has had time to use the product or service. Set the delay per product type and test it.

Can I run a 0–10 NPS with an interactive list?

Not in a single list, because it accepts up to 10 rows and the 0–10 scale has 11 options. Use a Flow, ask for the score as text, or switch scales.

Do I need opt-in to send a survey?

Yes. Meta requires opt-in before a business starts a conversation on WhatsApp. Make it clear in the consent that the business may send order updates and feedback requests.


Official sources checked on October 25, 2026: Template categorization, Reply buttons messages, List messages, Flows components, Sending a Flow, Flows webhooks, Flows examples, Button webhook, Get opt-in, Vectalk: Flows.

Integre o WhatsApp oficial ao seu sistema

A Vectalk entrega a Cloud API da Meta com os mesmos payloads e webhooks, um token para todas as contas e documentação completa.