WhatsApp Customer Profile Update Flow Template

A one-screen form that lets existing customers update the details you use to personalise service: preferred name, email, birthday for a birthday offer, preferred branch, communication language and interests, with a consent checkbox for storing that data.

1 screen 7 fields returned Flow JSON 7.2 Sign up Salons, Spas, Clinics, Retail stores

Use Try it to fill the flow and see the exact response_json it returns.

customer-profile-update.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "PROFILE_UPDATE",
      "title": "Update your details",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_profile_update",
            "children": [
              {
                "type": "TextHeading",
                "text": "Help us get it right"
              },
              {
                "type": "TextBody",
                "text": "Update anything that has changed. Fields you leave blank stay as they are."
              },
              {
                "type": "TextInput",
                "name": "preferred_name",
                "label": "Preferred name",
                "input-type": "text",
                "helper-text": "What should we call you?"
              },
              {
                "type": "TextInput",
                "name": "profile_email",
                "label": "Email",
                "input-type": "email",
                "helper-text": "For receipts and booking confirmations"
              },
              {
                "type": "DatePicker",
                "name": "birthday",
                "label": "Birthday (for a birthday treat)"
              },
              {
                "type": "Dropdown",
                "name": "preferred_branch",
                "label": "Preferred location",
                "data-source": [
                  {
                    "id": "downtown",
                    "title": "Downtown"
                  },
                  {
                    "id": "riverside",
                    "title": "Riverside"
                  },
                  {
                    "id": "north_mall",
                    "title": "North Mall"
                  },
                  {
                    "id": "online_only",
                    "title": "Online only"
                  }
                ]
              },
              {
                "type": "Dropdown",
                "name": "preferred_language",
                "label": "Language for messages",
                "data-source": [
                  {
                    "id": "english",
                    "title": "English"
                  },
                  {
                    "id": "spanish",
                    "title": "Español"
                  },
                  {
                    "id": "french",
                    "title": "Français"
                  },
                  {
                    "id": "portuguese",
                    "title": "Português"
                  },
                  {
                    "id": "arabic",
                    "title": "العربية"
                  }
                ]
              },
              {
                "type": "CheckboxGroup",
                "name": "interests",
                "label": "What are you interested in?",
                "data-source": [
                  {
                    "id": "hair_styling",
                    "title": "Hair and styling"
                  },
                  {
                    "id": "skincare",
                    "title": "Skincare and facials"
                  },
                  {
                    "id": "massage",
                    "title": "Massage and body treatments"
                  },
                  {
                    "id": "wellness_packages",
                    "title": "Wellness packages"
                  },
                  {
                    "id": "retail_products",
                    "title": "Products to use at home"
                  }
                ]
              },
              {
                "type": "EmbeddedLink",
                "text": "How we use your data",
                "on-click-action": {
                  "name": "open_url",
                  "url": "https://example.com/privacy"
                }
              },
              {
                "type": "OptIn",
                "name": "data_consent",
                "label": "I agree that Your Business can store these details to personalise my visits and service messages.",
                "required": true
              },
              {
                "type": "Footer",
                "label": "Save my details",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "preferred_name": "${form.preferred_name}",
                    "profile_email": "${form.profile_email}",
                    "birthday": "${form.birthday}",
                    "preferred_branch": "${form.preferred_branch}",
                    "preferred_language": "${form.preferred_language}",
                    "interests": "${form.interests}",
                    "data_consent": "${form.data_consent}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

Raw JSON for scripts: curl -s https://whautomate.com/whatsapp-flow-templates/customer-profile-update.json

Import in 60 seconds
  1. Copy the JSON above (or edit it first in the Flow Builder).
  2. In WhatsApp Manager, open Account tools > Flows, create a flow and choose Sign up as the category.
  3. Paste into the JSON editor, check the preview, then Publish.
  4. Send it with the Flow ID, as an interactive message or through a template's Flow button.

Not technical? Skip the JSON and send it from Whautomate with a drag-and-drop editor.

About this customer profile update flow

Contact records decay quietly. People change email addresses, move closer to a different branch, or never told you they prefer to be called "Jo" rather than "Joanna". This flow gives existing customers one screen to put that right, inside the chat they already use with you, with no login and no web page to find.

Each field feeds something concrete. The preferred name goes into message greetings and booking confirmations. The birthday powers a birthday offer, and customers share it far more willingly when the label says why you are asking. The branch and language fields decide which location's updates they get and which language your team replies in, and the interests list lets you segment without guessing from purchase history.

A consent checkbox at the bottom records that the customer agrees to you storing these details, with a link to your privacy policy. It is separate from marketing consent on purpose: a customer can happily share their birthday and branch for better service without agreeing to promotional broadcasts, which you should collect with a dedicated opt-in.

Fields this flow returns

When the customer taps the final button, the complete action sends these keys back in response_json. Fields from earlier screens are pulled in with global references (${screen.SCREEN_ID.form.field}), so nothing is lost between screens.

KeyComponentScreenRequiredReturnsExample
preferred_name TextInput PROFILE_UPDATE No string "Jo"
profile_email TextInput (email) PROFILE_UPDATE No string "[email protected]"
birthday DatePicker PROFILE_UPDATE No YYYY-MM-DD "1990-04-12"
preferred_branch
downtown, riverside, north_mall, online_only
Dropdown PROFILE_UPDATE No item id "riverside"
preferred_language
english, spanish, french, portuguese, arabic
Dropdown PROFILE_UPDATE No item id "english"
interests
hair_styling, skincare, massage, wellness_packages, retail_products
CheckboxGroup PROFILE_UPDATE No array of ids ["skincare","wellness_packages"]
data_consent OptIn PROFILE_UPDATE Yes boolean true

Optional fields the customer leaves empty may be missing from response_json or arrive empty. Treat every optional key as nullable in your handler.

No developer needed

Send the Customer Profile Update flow without touching code

You do not need to be technical to use WhatsApp Flows. Connect your WhatsApp number, set the flow up in our drag-and-drop editor and send it to customers in a few clicks. No JSON, no API calls, no WhatsApp Manager.

1

Connect your number

Log in with Facebook and connect your WhatsApp number in a few minutes. No API keys or servers to set up.

2

Set up the flow

Start from a ready-made form or import this one, then drag fields in, change the wording and try it on a live phone preview. Click Publish when it looks right.

3

Send it anywhere

Send it from any chat in the Team Inbox, on web or mobile, send it automatically from an automation, or broadcast it to a list.

4

Get the answers

Every answer is saved on the customer's profile and chat, and your team can be notified the moment a form comes in.

7-day free trial, no credit card required.

Sample webhook payload (nfm_reply)

This is what your webhook receives when a customer submits the flow. response_json is a JSON string: parse it, then match flow_token to the record you created when you sent the message. The customer's WhatsApp number is in messages[0].from.

response_json (parsed)
{
  "flow_token": "bk_8f2c41",
  "preferred_name": "Jo",
  "profile_email": "[email protected]",
  "birthday": "1990-04-12",
  "preferred_branch": "riverside",
  "preferred_language": "english",
  "interests": [
    "skincare",
    "wellness_packages"
  ],
  "data_consent": true
}
POST your-webhook (full event)
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "field": "messages",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "15550001234",
              "phone_number_id": "PHONE_NUMBER_ID"
            },
            "contacts": [
              {
                "profile": {
                  "name": "Alex Morgan"
                },
                "wa_id": "14155550123"
              }
            ],
            "messages": [
              {
                "context": {
                  "from": "15550001234",
                  "id": "wamid.SENT_FLOW_MESSAGE_ID"
                },
                "from": "14155550123",
                "id": "wamid.INCOMING_MESSAGE_ID",
                "timestamp": "1760000000",
                "type": "interactive",
                "interactive": {
                  "type": "nfm_reply",
                  "nfm_reply": {
                    "name": "flow",
                    "body": "Sent",
                    "response_json": "{\"flow_token\":\"bk_8f2c41\",\"preferred_name\":\"Jo\",\"profile_email\":\"[email protected]\",\"birthday\":\"1990-04-12\",\"preferred_branch\":\"riverside\",\"preferred_language\":\"english\",\"interests\":[\"skincare\",\"wellness_packages\"],\"data_consent\":true}"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

Deploy with the WhatsApp Cloud API

Prefer code over WhatsApp Manager? Save the template as customer-profile-update.json and run these calls with a system user token that has whatsapp_business_management and whatsapp_business_messaging permissions.

1. Create the flow

bash
curl -X POST 'https://graph.facebook.com/v23.0/{WABA_ID}/flows' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{"name": "customer_profile_update", "categories": ["SIGN_UP"]}'
# => {"id": "{FLOW_ID}"}

2. Upload the Flow JSON

bash
curl -X POST 'https://graph.facebook.com/v23.0/{FLOW_ID}/assets' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -F '[email protected];type=application/json' \
  -F 'name=flow.json' \
  -F 'asset_type=FLOW_JSON'
# => {"success": true, "validation_errors": []}

3. Publish it

bash
curl -X POST 'https://graph.facebook.com/v23.0/{FLOW_ID}/publish' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}'

Publishing is permanent: a published flow cannot be edited. To change it later, create a new flow (or clone it with clone_flow_id) and publish the new version.

4. Send it to a customer

Inside the 24-hour customer service window, send an interactive flow message. Outside it, create a message template with a Flow button that points to this flow, and send the template instead.

send-customer-profile-update.json
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "14155550123",
  "type": "interactive",
  "interactive": {
    "type": "flow",
    "header": {
      "type": "text",
      "text": "Keep your details up to date"
    },
    "body": {
      "text": "Update your name, email and preferences in under a minute, and add your birthday so we can send you a treat on the day."
    },
    "footer": {
      "text": "Your details stay private"
    },
    "action": {
      "name": "flow",
      "parameters": {
        "flow_message_version": "3",
        "flow_token": "bk_8f2c41",
        "flow_id": "YOUR_FLOW_ID",
        "flow_cta": "Update my details",
        "flow_action": "navigate",
        "flow_action_payload": {
          "screen": "PROFILE_UPDATE"
        }
      }
    }
  }
}
bash
curl -X POST 'https://graph.facebook.com/v23.0/{PHONE_NUMBER_ID}/messages' \
  -H 'Authorization: Bearer {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d @send-customer-profile-update.json

When to send it

Annual data refresh

Once a year, send the flow to active customers through a Flow-button template so birthdays, emails and branch preferences stay current.

Bounced email or wrong name

When a receipt email bounces or a customer corrects their name in chat, reply with the form so every detail is updated at once rather than one field at a time.

Opening a new location

Ask existing customers to choose their preferred branch when a new site opens, so location-specific updates reach the right people from day one.

Loyalty programme sign-up

Use the flow as the enrolment step for a loyalty or birthday club, where the birthday and interests are the whole point of joining.

How to customise this template

  • List your real branches in the Dropdown and keep an "Online only" option if you also sell or consult remotely. Use stable ids such as downtown rather than full addresses, which change.
  • Offer only the languages your team can actually reply in. Listing a language nobody on staff speaks sets up a disappointing first reply.
  • Change the interests to your own service lines. A spa might list massage, facials and wellness packages; a gym might list classes, personal training and nutrition.
  • If you already hold the email address, move this flow behind a keyword such as "update details" and keep the field optional, so customers are not forced to retype it.

Open this template in the Flow Builder to make these changes visually. The builder keeps field names unique and regenerates the completion payload for you.

Common mistakes to avoid

  • A static flow cannot pre-fill the customer's current details, so every field starts empty. Treat blank optional answers as "no change" in your handler, not as an instruction to clear the stored value.
  • Birthdays arrive as YYYY-MM-DD including a year. If you only need the day and month for an offer, store just those, and say in the label that the year is not used if customers seem reluctant.
  • Do not bundle marketing consent into the data-storage OptIn. Agreeing to store a profile is not the same as agreeing to promotional messages, and mixing them makes both harder to rely on.
  • Language and branch fields return ids, not labels. Map them to your own locale codes and location records in the webhook handler, and keep the ids stable when you rename a branch.

Keep consent and contact data in one place

In Whautomate, import this flow into the built-in flow editor, click Publish and send it from the Team Inbox, an automation or a Flow-button template. Answers are saved on the client's profile, tags are added on submit, and automations can manage your suppression list so opted-out contacts stop receiving broadcasts.

  • Tags added automatically on submit
  • Suppression list for opt-outs
  • Every answer kept on the client profile

7-day free trial, no credit card required.

Frequently asked questions

Not as a static flow. Pre-filling fields with stored values needs a data_exchange endpoint that returns the customer's record when the flow opens. This template collects fresh values, and your webhook handler decides which ones replace what you already hold.
Use the sender's WhatsApp number from messages[0].from, and set the flow_token to your customer id when you send the flow. The response_json echoes the flow_token back, so you can update the correct record even if the customer shares a phone with someone else.
Inside the nfm_reply response_json: preferred_name and profile_email as strings, birthday as YYYY-MM-DD, preferred_branch and preferred_language as item ids, interests as an array of ids, and data_consent as a boolean.
No. The answers appear on the customer's chat in the shared team inbox, where an agent can see them and update the contact. If you want the values written to your own database, parse the nfm_reply in your webhook handler.

The Complete Omnichannel Customer Engagement Platform

Go beyond free tools. Automate conversations, build AI chatbots, send broadcast campaigns, book appointments, sell products, and manage every messaging channel from one powerful platform. Trusted by thousands of businesses worldwide.

  • WhatsApp, Instagram, Messenger, Telegram & Live Chat
  • AI chatbots & no-code automation
  • Broadcast campaigns & analytics
  • Appointment & class booking
  • E-commerce, Shopify & WooCommerce integration
  • CRM, invoicing & payment collection

No credit card required. Free 7-day trial. Visit our pricing page for plans.