[{"data":1,"prerenderedAt":1262},["ShallowReactive",2],{"content-query-EChsz9eNxl":3,"content-query-yP1cWMns5L":1043,"content-query-M5aWdXgQKx":1047,"content-query-W4RtfFQaoh":1054,"content-query-7VgBfxLOWV":1079,"content-query-UP87PRcOMw":1101,"content-query-eJ9XWy0CGH":1105,"content-query-Z6fTkbgt1D":1118,"content-query-9giMhwHrGj":1131,"content-query-j8GGVgf9na":1138,"content-query-G03kJtQzJS":1151,"content-query-1mvwAKmUBq":1170,"content-query-No6iPTj4EO":1195,"content-query-zRSmsuVl55":1205,"content-query-MsdmgXewTK":1209,"content-query-IVhcXRs1sR":1216,"content-query-BMhIInEJl2":1223},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"intro":10,"type":11,"layout":12,"tags":13,"body":16,"_type":1036,"_id":1037,"_source":1038,"_file":1039,"_stem":1040,"_extension":1041,"sitemap":1042},"/docs/tutorials/n8n/whatsapp-cloud-api-webhook","n8n",false,"","n8n WhatsApp Cloud API Webhook Setup","Receive WhatsApp Cloud API webhooks in self-hosted n8n: a stable public URL for Meta, the hub.challenge verify-token handshake answered automatically, and messages streaming into your workflow — no public IP or tunnel.","Receive WhatsApp Cloud API messages in self-hosted n8n — verify token handshake handled, no public IP, no tunnel, no re-verification when n8n restarts.","tutorial","doc",[5,14,15],"WhatsApp","Webhooks",{"type":17,"children":18,"toc":1028},"root",[19,51,70,117,124,177,183,213,219,238,537,549,555,601,607,626,645,915,958,964,1022],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,33,35,40,42,49],{"type":25,"value":26},"text","Meta's WhatsApp Cloud API only delivers webhooks to a ",{"type":20,"tag":28,"props":29,"children":30},"strong",{},[31],{"type":25,"value":32},"public HTTPS URL",{"type":25,"value":34},", and before it sends anything it runs a ",{"type":20,"tag":28,"props":36,"children":37},{},[38],{"type":25,"value":39},"verification handshake",{"type":25,"value":41}," — a GET request your endpoint must answer by echoing the ",{"type":20,"tag":43,"props":44,"children":46},"code",{"className":45},[],[47],{"type":25,"value":48},"hub.challenge",{"type":25,"value":50}," query value. That is two problems for self-hosted n8n: your instance usually is not public, and tunnels with rotating URLs force you to re-verify in the Meta dashboard every time the URL changes.",{"type":20,"tag":21,"props":52,"children":53},{},[54,56,61,63,68],{"type":25,"value":55},"This tutorial solves both with a stable Webhook Relay endpoint: Meta verifies ",{"type":20,"tag":28,"props":57,"children":58},{},[59],{"type":25,"value":60},"one permanent URL",{"type":25,"value":62}," (the handshake is answered by a tiny Function, automatically), and your n8n instance receives every message over an ",{"type":20,"tag":28,"props":64,"children":65},{},[66],{"type":25,"value":67},"outbound WebSocket",{"type":25,"value":69}," — no public IP, no open ports, nothing to re-verify.",{"type":20,"tag":71,"props":72,"children":75},"pre",{"className":73,"code":74,"language":25,"meta":7,"style":7},"language-text shiki shiki-themes github-dark","Meta ──GET hub.challenge──▶ Webhook Relay (Function answers handshake)\nMeta ──POST messages──────▶ Webhook Relay (stable public URL)\n                                 │\n        n8n ──outbound WebSocket─┘   ← n8n connects out; nothing inbound\n",[76],{"type":20,"tag":43,"props":77,"children":78},{"__ignoreMap":7},[79,90,99,108],{"type":20,"tag":80,"props":81,"children":84},"span",{"class":82,"line":83},"line",1,[85],{"type":20,"tag":80,"props":86,"children":87},{},[88],{"type":25,"value":89},"Meta ──GET hub.challenge──▶ Webhook Relay (Function answers handshake)\n",{"type":20,"tag":80,"props":91,"children":93},{"class":82,"line":92},2,[94],{"type":20,"tag":80,"props":95,"children":96},{},[97],{"type":25,"value":98},"Meta ──POST messages──────▶ Webhook Relay (stable public URL)\n",{"type":20,"tag":80,"props":100,"children":102},{"class":82,"line":101},3,[103],{"type":20,"tag":80,"props":104,"children":105},{},[106],{"type":25,"value":107},"                                 │\n",{"type":20,"tag":80,"props":109,"children":111},{"class":82,"line":110},4,[112],{"type":20,"tag":80,"props":113,"children":114},{},[115],{"type":25,"value":116},"        n8n ──outbound WebSocket─┘   ← n8n connects out; nothing inbound\n",{"type":20,"tag":118,"props":119,"children":121},"h2",{"id":120},"_1-install-the-webhook-relay-node-in-n8n",[122],{"type":25,"value":123},"1. Install the Webhook Relay node in n8n",{"type":20,"tag":21,"props":125,"children":126},{},[127,129,134,136,142,144,149,151,160,162,167,169,175],{"type":25,"value":128},"In n8n go to ",{"type":20,"tag":28,"props":130,"children":131},{},[132],{"type":25,"value":133},"Settings → Community Nodes → Install",{"type":25,"value":135}," and enter ",{"type":20,"tag":43,"props":137,"children":139},{"className":138},[],[140],{"type":25,"value":141},"n8n-nodes-webhookrelay",{"type":25,"value":143},". Then create an ",{"type":20,"tag":28,"props":145,"children":146},{},[147],{"type":25,"value":148},"API key",{"type":25,"value":150}," at ",{"type":20,"tag":152,"props":153,"children":157},"a",{"href":154,"rel":155},"https://my.webhookrelay.com/tokens",[156],"nofollow",[158],{"type":25,"value":159},"my.webhookrelay.com/tokens",{"type":25,"value":161}," and add it as a ",{"type":20,"tag":28,"props":163,"children":164},{},[165],{"type":25,"value":166},"Webhook Relay API",{"type":25,"value":168}," credential. (The general setup, with screenshots, is in the ",{"type":20,"tag":152,"props":170,"children":172},{"href":171},"/docs/tutorials/n8n/webhook-trigger",[173],{"type":25,"value":174},"n8n Webhook Trigger tutorial",{"type":25,"value":176},".)",{"type":20,"tag":118,"props":178,"children":180},{"id":179},"_2-create-a-bucket-for-whatsapp",[181],{"type":25,"value":182},"2. Create a bucket for WhatsApp",{"type":20,"tag":21,"props":184,"children":185},{},[186,188,195,197,203,205,211],{"type":25,"value":187},"In ",{"type":20,"tag":152,"props":189,"children":192},{"href":190,"rel":191},"https://my.webhookrelay.com/buckets",[156],[193],{"type":25,"value":194},"my.webhookrelay.com",{"type":25,"value":196}," create a bucket named ",{"type":20,"tag":43,"props":198,"children":200},{"className":199},[],[201],{"type":25,"value":202},"whatsapp",{"type":25,"value":204},". Its default input URL — ",{"type":20,"tag":43,"props":206,"children":208},{"className":207},[],[209],{"type":25,"value":210},"https://xxx.hooks.webhookrelay.com/...",{"type":25,"value":212}," — is permanent. This is the URL Meta will verify once and deliver to forever.",{"type":20,"tag":118,"props":214,"children":216},{"id":215},"_3-answer-the-verify-token-handshake-with-a-function",[217],{"type":25,"value":218},"3. Answer the verify-token handshake with a Function",{"type":20,"tag":21,"props":220,"children":221},{},[222,224,229,231,236],{"type":25,"value":223},"Meta's verification GET must be answered with the raw ",{"type":20,"tag":43,"props":225,"children":227},{"className":226},[],[228],{"type":25,"value":48},{"type":25,"value":230}," value. Attach this Function to the bucket's ",{"type":20,"tag":28,"props":232,"children":233},{},[234],{"type":25,"value":235},"input",{"type":25,"value":237}," so the handshake is handled at the edge (n8n never needs to see it):",{"type":20,"tag":71,"props":239,"children":243},{"className":240,"code":241,"language":242,"meta":7,"style":7},"language-javascript shiki shiki-themes github-dark","// Answer Meta's one-time subscription verification; let real events through.\nvar VERIFY_TOKEN = \"my-verify-token\"; // must match what you enter in Meta\n\nif (r.RequestMethod() === \"GET\") {\n  if (r.RequestQuery(\"hub.verify_token\") === VERIFY_TOKEN) {\n    r.SetResponseStatusCode(200);\n    r.SetResponseBody(r.RequestQuery(\"hub.challenge\"));\n  } else {\n    r.SetResponseStatusCode(403);\n    r.SetResponseBody(\"verification failed\");\n  }\n}\n","javascript",[244],{"type":20,"tag":43,"props":245,"children":246},{"__ignoreMap":7},[247,256,293,302,341,386,414,450,469,494,519,528],{"type":20,"tag":80,"props":248,"children":249},{"class":82,"line":83},[250],{"type":20,"tag":80,"props":251,"children":253},{"style":252},"--shiki-default:#6A737D",[254],{"type":25,"value":255},"// Answer Meta's one-time subscription verification; let real events through.\n",{"type":20,"tag":80,"props":257,"children":258},{"class":82,"line":92},[259,265,271,276,282,288],{"type":20,"tag":80,"props":260,"children":262},{"style":261},"--shiki-default:#F97583",[263],{"type":25,"value":264},"var",{"type":20,"tag":80,"props":266,"children":268},{"style":267},"--shiki-default:#79B8FF",[269],{"type":25,"value":270}," VERIFY_TOKEN",{"type":20,"tag":80,"props":272,"children":273},{"style":261},[274],{"type":25,"value":275}," =",{"type":20,"tag":80,"props":277,"children":279},{"style":278},"--shiki-default:#9ECBFF",[280],{"type":25,"value":281}," \"my-verify-token\"",{"type":20,"tag":80,"props":283,"children":285},{"style":284},"--shiki-default:#E1E4E8",[286],{"type":25,"value":287},"; ",{"type":20,"tag":80,"props":289,"children":290},{"style":252},[291],{"type":25,"value":292},"// must match what you enter in Meta\n",{"type":20,"tag":80,"props":294,"children":295},{"class":82,"line":101},[296],{"type":20,"tag":80,"props":297,"children":299},{"emptyLinePlaceholder":298},true,[300],{"type":25,"value":301},"\n",{"type":20,"tag":80,"props":303,"children":304},{"class":82,"line":110},[305,310,315,321,326,331,336],{"type":20,"tag":80,"props":306,"children":307},{"style":261},[308],{"type":25,"value":309},"if",{"type":20,"tag":80,"props":311,"children":312},{"style":284},[313],{"type":25,"value":314}," (r.",{"type":20,"tag":80,"props":316,"children":318},{"style":317},"--shiki-default:#B392F0",[319],{"type":25,"value":320},"RequestMethod",{"type":20,"tag":80,"props":322,"children":323},{"style":284},[324],{"type":25,"value":325},"() ",{"type":20,"tag":80,"props":327,"children":328},{"style":261},[329],{"type":25,"value":330},"===",{"type":20,"tag":80,"props":332,"children":333},{"style":278},[334],{"type":25,"value":335}," \"GET\"",{"type":20,"tag":80,"props":337,"children":338},{"style":284},[339],{"type":25,"value":340},") {\n",{"type":20,"tag":80,"props":342,"children":344},{"class":82,"line":343},5,[345,350,354,359,364,369,374,378,382],{"type":20,"tag":80,"props":346,"children":347},{"style":261},[348],{"type":25,"value":349},"  if",{"type":20,"tag":80,"props":351,"children":352},{"style":284},[353],{"type":25,"value":314},{"type":20,"tag":80,"props":355,"children":356},{"style":317},[357],{"type":25,"value":358},"RequestQuery",{"type":20,"tag":80,"props":360,"children":361},{"style":284},[362],{"type":25,"value":363},"(",{"type":20,"tag":80,"props":365,"children":366},{"style":278},[367],{"type":25,"value":368},"\"hub.verify_token\"",{"type":20,"tag":80,"props":370,"children":371},{"style":284},[372],{"type":25,"value":373},") ",{"type":20,"tag":80,"props":375,"children":376},{"style":261},[377],{"type":25,"value":330},{"type":20,"tag":80,"props":379,"children":380},{"style":267},[381],{"type":25,"value":270},{"type":20,"tag":80,"props":383,"children":384},{"style":284},[385],{"type":25,"value":340},{"type":20,"tag":80,"props":387,"children":389},{"class":82,"line":388},6,[390,395,400,404,409],{"type":20,"tag":80,"props":391,"children":392},{"style":284},[393],{"type":25,"value":394},"    r.",{"type":20,"tag":80,"props":396,"children":397},{"style":317},[398],{"type":25,"value":399},"SetResponseStatusCode",{"type":20,"tag":80,"props":401,"children":402},{"style":284},[403],{"type":25,"value":363},{"type":20,"tag":80,"props":405,"children":406},{"style":267},[407],{"type":25,"value":408},"200",{"type":20,"tag":80,"props":410,"children":411},{"style":284},[412],{"type":25,"value":413},");\n",{"type":20,"tag":80,"props":415,"children":417},{"class":82,"line":416},7,[418,422,427,432,436,440,445],{"type":20,"tag":80,"props":419,"children":420},{"style":284},[421],{"type":25,"value":394},{"type":20,"tag":80,"props":423,"children":424},{"style":317},[425],{"type":25,"value":426},"SetResponseBody",{"type":20,"tag":80,"props":428,"children":429},{"style":284},[430],{"type":25,"value":431},"(r.",{"type":20,"tag":80,"props":433,"children":434},{"style":317},[435],{"type":25,"value":358},{"type":20,"tag":80,"props":437,"children":438},{"style":284},[439],{"type":25,"value":363},{"type":20,"tag":80,"props":441,"children":442},{"style":278},[443],{"type":25,"value":444},"\"hub.challenge\"",{"type":20,"tag":80,"props":446,"children":447},{"style":284},[448],{"type":25,"value":449},"));\n",{"type":20,"tag":80,"props":451,"children":453},{"class":82,"line":452},8,[454,459,464],{"type":20,"tag":80,"props":455,"children":456},{"style":284},[457],{"type":25,"value":458},"  } ",{"type":20,"tag":80,"props":460,"children":461},{"style":261},[462],{"type":25,"value":463},"else",{"type":20,"tag":80,"props":465,"children":466},{"style":284},[467],{"type":25,"value":468}," {\n",{"type":20,"tag":80,"props":470,"children":472},{"class":82,"line":471},9,[473,477,481,485,490],{"type":20,"tag":80,"props":474,"children":475},{"style":284},[476],{"type":25,"value":394},{"type":20,"tag":80,"props":478,"children":479},{"style":317},[480],{"type":25,"value":399},{"type":20,"tag":80,"props":482,"children":483},{"style":284},[484],{"type":25,"value":363},{"type":20,"tag":80,"props":486,"children":487},{"style":267},[488],{"type":25,"value":489},"403",{"type":20,"tag":80,"props":491,"children":492},{"style":284},[493],{"type":25,"value":413},{"type":20,"tag":80,"props":495,"children":497},{"class":82,"line":496},10,[498,502,506,510,515],{"type":20,"tag":80,"props":499,"children":500},{"style":284},[501],{"type":25,"value":394},{"type":20,"tag":80,"props":503,"children":504},{"style":317},[505],{"type":25,"value":426},{"type":20,"tag":80,"props":507,"children":508},{"style":284},[509],{"type":25,"value":363},{"type":20,"tag":80,"props":511,"children":512},{"style":278},[513],{"type":25,"value":514},"\"verification failed\"",{"type":20,"tag":80,"props":516,"children":517},{"style":284},[518],{"type":25,"value":413},{"type":20,"tag":80,"props":520,"children":522},{"class":82,"line":521},11,[523],{"type":20,"tag":80,"props":524,"children":525},{"style":284},[526],{"type":25,"value":527},"  }\n",{"type":20,"tag":80,"props":529,"children":531},{"class":82,"line":530},12,[532],{"type":20,"tag":80,"props":533,"children":534},{"style":284},[535],{"type":25,"value":536},"}\n",{"type":20,"tag":21,"props":538,"children":539},{},[540,542,547],{"type":25,"value":541},"POST deliveries (the actual messages) pass through untouched and get the bucket's normal ",{"type":20,"tag":43,"props":543,"children":545},{"className":544},[],[546],{"type":25,"value":408},{"type":25,"value":548}," response, which is all Meta needs.",{"type":20,"tag":118,"props":550,"children":552},{"id":551},"_4-point-meta-at-the-bucket",[553],{"type":25,"value":554},"4. Point Meta at the bucket",{"type":20,"tag":21,"props":556,"children":557},{},[558,560,567,569,574,576,581,583,588,590,599],{"type":25,"value":559},"In the ",{"type":20,"tag":152,"props":561,"children":564},{"href":562,"rel":563},"https://developers.facebook.com/apps/",[156],[565],{"type":25,"value":566},"Meta App Dashboard",{"type":25,"value":568},": ",{"type":20,"tag":28,"props":570,"children":571},{},[572],{"type":25,"value":573},"WhatsApp → Configuration → Webhook → Edit",{"type":25,"value":575},". Enter the bucket's input URL as the ",{"type":20,"tag":28,"props":577,"children":578},{},[579],{"type":25,"value":580},"Callback URL",{"type":25,"value":582}," and the same verify token as in the Function, then save — verification succeeds instantly. Click ",{"type":20,"tag":28,"props":584,"children":585},{},[586],{"type":25,"value":587},"Manage",{"type":25,"value":589}," and subscribe to the ",{"type":20,"tag":28,"props":591,"children":592},{},[593],{"type":20,"tag":43,"props":594,"children":596},{"className":595},[],[597],{"type":25,"value":598},"messages",{"type":25,"value":600}," webhook field.",{"type":20,"tag":118,"props":602,"children":604},{"id":603},"_5-receive-messages-in-n8n",[605],{"type":25,"value":606},"5. Receive messages in n8n",{"type":20,"tag":21,"props":608,"children":609},{},[610,612,617,619,624],{"type":25,"value":611},"Add the ",{"type":20,"tag":28,"props":613,"children":614},{},[615],{"type":25,"value":616},"Webhook Relay Trigger",{"type":25,"value":618}," node to a workflow, select the ",{"type":20,"tag":43,"props":620,"children":622},{"className":621},[],[623],{"type":25,"value":202},{"type":25,"value":625}," bucket, and activate. The node opens an outbound WebSocket and every WhatsApp delivery arrives as a workflow execution.",{"type":20,"tag":21,"props":627,"children":628},{},[629,631,636,638,643],{"type":25,"value":630},"Messages sit a few levels deep in Meta's envelope. A ",{"type":20,"tag":28,"props":632,"children":633},{},[634],{"type":25,"value":635},"Set",{"type":25,"value":637}," or ",{"type":20,"tag":28,"props":639,"children":640},{},[641],{"type":25,"value":642},"Code",{"type":25,"value":644}," node right after the trigger tidies that up:",{"type":20,"tag":71,"props":646,"children":648},{"className":240,"code":647,"language":242,"meta":7,"style":7},"// Code node: flatten the Cloud API envelope into one item per message\nconst out = [];\nfor (const entry of $json.body.entry || []) {\n  for (const change of entry.changes || []) {\n    for (const msg of change.value?.messages || []) {\n      out.push({ json: {\n        from: msg.from,\n        type: msg.type,\n        text: msg.text?.body,\n        timestamp: msg.timestamp,\n        contact: change.value.contacts?.[0]?.profile?.name,\n      }});\n    }\n  }\n}\nreturn out;\n",[649],{"type":20,"tag":43,"props":650,"children":651},{"__ignoreMap":7},[652,660,682,724,762,800,818,826,834,842,850,868,876,885,893,901],{"type":20,"tag":80,"props":653,"children":654},{"class":82,"line":83},[655],{"type":20,"tag":80,"props":656,"children":657},{"style":252},[658],{"type":25,"value":659},"// Code node: flatten the Cloud API envelope into one item per message\n",{"type":20,"tag":80,"props":661,"children":662},{"class":82,"line":92},[663,668,673,677],{"type":20,"tag":80,"props":664,"children":665},{"style":261},[666],{"type":25,"value":667},"const",{"type":20,"tag":80,"props":669,"children":670},{"style":267},[671],{"type":25,"value":672}," out",{"type":20,"tag":80,"props":674,"children":675},{"style":261},[676],{"type":25,"value":275},{"type":20,"tag":80,"props":678,"children":679},{"style":284},[680],{"type":25,"value":681}," [];\n",{"type":20,"tag":80,"props":683,"children":684},{"class":82,"line":101},[685,690,695,699,704,709,714,719],{"type":20,"tag":80,"props":686,"children":687},{"style":261},[688],{"type":25,"value":689},"for",{"type":20,"tag":80,"props":691,"children":692},{"style":284},[693],{"type":25,"value":694}," (",{"type":20,"tag":80,"props":696,"children":697},{"style":261},[698],{"type":25,"value":667},{"type":20,"tag":80,"props":700,"children":701},{"style":267},[702],{"type":25,"value":703}," entry",{"type":20,"tag":80,"props":705,"children":706},{"style":261},[707],{"type":25,"value":708}," of",{"type":20,"tag":80,"props":710,"children":711},{"style":284},[712],{"type":25,"value":713}," $json.body.entry ",{"type":20,"tag":80,"props":715,"children":716},{"style":261},[717],{"type":25,"value":718},"||",{"type":20,"tag":80,"props":720,"children":721},{"style":284},[722],{"type":25,"value":723}," []) {\n",{"type":20,"tag":80,"props":725,"children":726},{"class":82,"line":110},[727,732,736,740,745,749,754,758],{"type":20,"tag":80,"props":728,"children":729},{"style":261},[730],{"type":25,"value":731},"  for",{"type":20,"tag":80,"props":733,"children":734},{"style":284},[735],{"type":25,"value":694},{"type":20,"tag":80,"props":737,"children":738},{"style":261},[739],{"type":25,"value":667},{"type":20,"tag":80,"props":741,"children":742},{"style":267},[743],{"type":25,"value":744}," change",{"type":20,"tag":80,"props":746,"children":747},{"style":261},[748],{"type":25,"value":708},{"type":20,"tag":80,"props":750,"children":751},{"style":284},[752],{"type":25,"value":753}," entry.changes ",{"type":20,"tag":80,"props":755,"children":756},{"style":261},[757],{"type":25,"value":718},{"type":20,"tag":80,"props":759,"children":760},{"style":284},[761],{"type":25,"value":723},{"type":20,"tag":80,"props":763,"children":764},{"class":82,"line":343},[765,770,774,778,783,787,792,796],{"type":20,"tag":80,"props":766,"children":767},{"style":261},[768],{"type":25,"value":769},"    for",{"type":20,"tag":80,"props":771,"children":772},{"style":284},[773],{"type":25,"value":694},{"type":20,"tag":80,"props":775,"children":776},{"style":261},[777],{"type":25,"value":667},{"type":20,"tag":80,"props":779,"children":780},{"style":267},[781],{"type":25,"value":782}," msg",{"type":20,"tag":80,"props":784,"children":785},{"style":261},[786],{"type":25,"value":708},{"type":20,"tag":80,"props":788,"children":789},{"style":284},[790],{"type":25,"value":791}," change.value?.messages ",{"type":20,"tag":80,"props":793,"children":794},{"style":261},[795],{"type":25,"value":718},{"type":20,"tag":80,"props":797,"children":798},{"style":284},[799],{"type":25,"value":723},{"type":20,"tag":80,"props":801,"children":802},{"class":82,"line":388},[803,808,813],{"type":20,"tag":80,"props":804,"children":805},{"style":284},[806],{"type":25,"value":807},"      out.",{"type":20,"tag":80,"props":809,"children":810},{"style":317},[811],{"type":25,"value":812},"push",{"type":20,"tag":80,"props":814,"children":815},{"style":284},[816],{"type":25,"value":817},"({ json: {\n",{"type":20,"tag":80,"props":819,"children":820},{"class":82,"line":416},[821],{"type":20,"tag":80,"props":822,"children":823},{"style":284},[824],{"type":25,"value":825},"        from: msg.from,\n",{"type":20,"tag":80,"props":827,"children":828},{"class":82,"line":452},[829],{"type":20,"tag":80,"props":830,"children":831},{"style":284},[832],{"type":25,"value":833},"        type: msg.type,\n",{"type":20,"tag":80,"props":835,"children":836},{"class":82,"line":471},[837],{"type":20,"tag":80,"props":838,"children":839},{"style":284},[840],{"type":25,"value":841},"        text: msg.text?.body,\n",{"type":20,"tag":80,"props":843,"children":844},{"class":82,"line":496},[845],{"type":20,"tag":80,"props":846,"children":847},{"style":284},[848],{"type":25,"value":849},"        timestamp: msg.timestamp,\n",{"type":20,"tag":80,"props":851,"children":852},{"class":82,"line":521},[853,858,863],{"type":20,"tag":80,"props":854,"children":855},{"style":284},[856],{"type":25,"value":857},"        contact: change.value.contacts?.[",{"type":20,"tag":80,"props":859,"children":860},{"style":267},[861],{"type":25,"value":862},"0",{"type":20,"tag":80,"props":864,"children":865},{"style":284},[866],{"type":25,"value":867},"]?.profile?.name,\n",{"type":20,"tag":80,"props":869,"children":870},{"class":82,"line":530},[871],{"type":20,"tag":80,"props":872,"children":873},{"style":284},[874],{"type":25,"value":875},"      }});\n",{"type":20,"tag":80,"props":877,"children":879},{"class":82,"line":878},13,[880],{"type":20,"tag":80,"props":881,"children":882},{"style":284},[883],{"type":25,"value":884},"    }\n",{"type":20,"tag":80,"props":886,"children":888},{"class":82,"line":887},14,[889],{"type":20,"tag":80,"props":890,"children":891},{"style":284},[892],{"type":25,"value":527},{"type":20,"tag":80,"props":894,"children":896},{"class":82,"line":895},15,[897],{"type":20,"tag":80,"props":898,"children":899},{"style":284},[900],{"type":25,"value":536},{"type":20,"tag":80,"props":902,"children":904},{"class":82,"line":903},16,[905,910],{"type":20,"tag":80,"props":906,"children":907},{"style":261},[908],{"type":25,"value":909},"return",{"type":20,"tag":80,"props":911,"children":912},{"style":284},[913],{"type":25,"value":914}," out;\n",{"type":20,"tag":21,"props":916,"children":917},{},[918,920,926,928,934,935,941,943,949,951,956],{"type":25,"value":919},"Status updates (",{"type":20,"tag":43,"props":921,"children":923},{"className":922},[],[924],{"type":25,"value":925},"sent",{"type":25,"value":927},"/",{"type":20,"tag":43,"props":929,"children":931},{"className":930},[],[932],{"type":25,"value":933},"delivered",{"type":25,"value":927},{"type":20,"tag":43,"props":936,"children":938},{"className":937},[],[939],{"type":25,"value":940},"read",{"type":25,"value":942},") arrive on the same bucket with a ",{"type":20,"tag":43,"props":944,"children":946},{"className":945},[],[947],{"type":25,"value":948},"statuses",{"type":25,"value":950}," array instead of ",{"type":20,"tag":43,"props":952,"children":954},{"className":953},[],[955],{"type":25,"value":598},{"type":25,"value":957}," — filter on what is present.",{"type":20,"tag":118,"props":959,"children":961},{"id":960},"notes",[962],{"type":25,"value":963},"Notes",{"type":20,"tag":965,"props":966,"children":967},"ul",{},[968,979,1005],{"type":20,"tag":969,"props":970,"children":971},"li",{},[972,977],{"type":20,"tag":28,"props":973,"children":974},{},[975],{"type":25,"value":976},"Restarts are free.",{"type":25,"value":978}," Meta verified the bucket URL, not your n8n instance — redeploy or move n8n anytime, nothing to re-verify.",{"type":20,"tag":969,"props":980,"children":981},{},[982,987,989,995,997,1003],{"type":20,"tag":28,"props":983,"children":984},{},[985],{"type":25,"value":986},"Verify signatures if you need authenticity",{"type":25,"value":988},": Meta signs POSTs with ",{"type":20,"tag":43,"props":990,"children":992},{"className":991},[],[993],{"type":25,"value":994},"X-Hub-Signature-256",{"type":25,"value":996}," (HMAC-SHA256 of the raw body with your app secret). The header reaches your workflow intact, so you can check it in a Code node — see ",{"type":20,"tag":152,"props":998,"children":1000},{"href":999},"/blog/verify-webhook-signature",[1001],{"type":25,"value":1002},"Verify a webhook signature",{"type":25,"value":1004},".",{"type":20,"tag":969,"props":1006,"children":1007},{},[1008,1013,1015,1021],{"type":20,"tag":28,"props":1009,"children":1010},{},[1011],{"type":25,"value":1012},"Payload reference",{"type":25,"value":1014},": the full setup-and-payload story (including self-hosted gateways like WAHA) is in ",{"type":20,"tag":152,"props":1016,"children":1018},{"href":1017},"/blog/whatsapp-cloud-api-webhooks",[1019],{"type":25,"value":1020},"WhatsApp Cloud API webhooks: setup, verify token and payloads",{"type":25,"value":1004},{"type":20,"tag":1023,"props":1024,"children":1025},"style",{},[1026],{"type":25,"value":1027},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":101,"depth":101,"links":1029},[1030,1031,1032,1033,1034,1035],{"id":120,"depth":92,"text":123},{"id":179,"depth":92,"text":182},{"id":215,"depth":92,"text":218},{"id":551,"depth":92,"text":554},{"id":603,"depth":92,"text":606},{"id":960,"depth":92,"text":963},"markdown","content:docs:tutorials:n8n:whatsapp-cloud-api-webhook.md","content","docs/tutorials/n8n/whatsapp-cloud-api-webhook.md","docs/tutorials/n8n/whatsapp-cloud-api-webhook","md",{"loc":4},[1044],{"_path":1045,"title":1046},"/docs/webhooks/internal/localhost","Receiving webhooks on localhost",[1048,1051],{"_path":1049,"title":1050},"/docs/webhooks/public/public-destination","Forward to public URL",{"_path":1052,"title":1053},"/docs/webhooks/public/multiple-destination-urls","Multiple destinations",[1055,1058,1061,1064,1067,1070,1073,1076],{"_path":1056,"title":1057},"/docs/installation/cli","CLI",{"_path":1059,"title":1060},"/docs/installation/docker","Docker container",{"_path":1062,"title":1063},"/docs/installation/docker-compose","Docker Compose",{"_path":1065,"title":1066},"/docs/installation/kubernetes","Kubernetes",{"_path":1068,"title":1069},"/docs/installation/autostart-windows","Autostart (Windows)",{"_path":1071,"title":1072},"/docs/installation/autostart-linux","Autostart (Linux)",{"_path":1074,"title":1075},"/docs/installation/autostart-macos","Autostart (MacOS)",{"_path":1077,"title":1078},"/docs/installation/behind-proxy","HTTP proxy configuration",[1080,1083,1086,1089,1092,1095,1098],{"_path":1081,"title":1082},"/docs/service-connections","Service Connections",{"_path":1084,"title":1085},"/docs/service-connections/aws_s3","AWS S3",{"_path":1087,"title":1088},"/docs/service-connections/aws_sns","AWS SNS",{"_path":1090,"title":1091},"/docs/service-connections/aws_sqs","AWS SQS",{"_path":1093,"title":1094},"/docs/service-connections/azure","Azure",{"_path":1096,"title":1097},"/docs/service-connections/gcp_gcs","GCP Cloud Storage",{"_path":1099,"title":1100},"/docs/service-connections/gcp_pubsub","GCP Pub/Sub",[1102],{"_path":1103,"title":1104},"/docs/webhooks/cron/using-cron-webhooks","Schedule recurring webhooks",[1106,1109,1112,1115],{"_path":1107,"title":1108},"/docs/webhooks/auth/username-password","Username and password",{"_path":1110,"title":1111},"/docs/webhooks/auth/hmac","HMAC",{"_path":1113,"title":1114},"/docs/webhooks/auth/jwt","JWT authentication",{"_path":1116,"title":1117},"/docs/webhooks/auth/http-method","Auth using request method",[1119,1122,1125,1128],{"_path":1120,"title":1121},"/docs/email","Receive emails as webhooks",{"_path":1123,"title":1124},"/docs/email/payload","Email webhook payload",{"_path":1126,"title":1127},"/docs/email/filtering-and-policy","Sender filtering & policy",{"_path":1129,"title":1130},"/docs/email/cli","Create & poll email addresses from the CLI",[1132,1135],{"_path":1133,"title":1134},"/docs/tunnels/demoing-your-website","Demoing your website",{"_path":1136,"title":1137},"/docs/tunnels/regions","Regions",[1139,1142,1145,1148],{"_path":1140,"title":1141},"/docs/account/account-management","Account management",{"_path":1143,"title":1144},"/docs/account/mfa","Multi-factor authentication (MFA)",{"_path":1146,"title":1147},"/docs/account/team","Teams and sub-accounts",{"_path":1149,"title":1150},"/docs/account/billing-and-subscriptions","Billing & subscriptions",[1152,1155,1158,1161,1164,1167],{"_path":1153,"title":1154},"/docs/tutorials/cicd/jenkins-bitbucket","Jenkins and Bitbucket",{"_path":1156,"title":1157},"/docs/tutorials/cicd/jenkins-github","Jenkins and GitHub",{"_path":1159,"title":1160},"/docs/tutorials/cicd/jenkins-plugin","Jenkins Plugin",{"_path":1162,"title":1163},"/docs/tutorials/cicd/kubernetes-operator","Kubernetes Operator",{"_path":1165,"title":1166},"/docs/tutorials/cicd/terraform-atlantis","Terraform Atlantis",{"_path":1168,"title":1169},"/docs/tutorials/cicd/webhook-exec","Execute scripts on webhook",[1171,1174,1177,1180,1183,1186,1189,1192],{"_path":1172,"title":1173},"/docs/tutorials/email/airtable","Email to Airtable",{"_path":1175,"title":1176},"/docs/tutorials/email/api","Email to API",{"_path":1178,"title":1179},"/docs/tutorials/email/database","Email to Database",{"_path":1181,"title":1182},"/docs/tutorials/email/discord","Email to Discord",{"_path":1184,"title":1185},"/docs/tutorials/email/google-sheets","Email to Google Sheets",{"_path":1187,"title":1188},"/docs/tutorials/email/microsoft-teams","Email to Microsoft Teams",{"_path":1190,"title":1191},"/docs/tutorials/email/notion","Email to Notion",{"_path":1193,"title":1194},"/docs/tutorials/email/slack","Email to Slack",[1196,1199,1202],{"_path":1197,"title":1198},"/docs/tutorials/edge/home-assistant","Home Assistant",{"_path":1200,"title":1201},"/docs/tutorials/edge/javascript-app","JavaScript app",{"_path":1203,"title":1204},"/docs/tutorials/edge/node-red","Node-RED",[1206],{"_path":1207,"title":1208},"/docs/tutorials/warehouse/bigquery","GCP BigQuery",[1210,1213],{"_path":1211,"title":1212},"/docs/tutorials/transform/docker-to-slack","DockerHub webhook to Slack notification",{"_path":1214,"title":1215},"/docs/tutorials/transform/enrich-webhooks","Enrich webhooks from APIs",[1217,1220,1222],{"_path":1218,"title":1219},"/docs/tutorials/n8n/email-trigger","n8n Email Trigger (Inbound Email)",{"_path":171,"title":1221},"n8n Webhook Trigger (No Public IP)",{"_path":4,"title":8},[1224,1227,1230,1233,1236,1239,1242,1245,1248,1251,1253,1256,1259],{"_path":1225,"title":1226},"/docs/webhooks/functions/manipulating-json","JSON encoding",{"_path":1228,"title":1229},"/docs/webhooks/functions/make-http-request","Make HTTP request",{"_path":1231,"title":1232},"/docs/webhooks/functions/modify-request","Read, write request data",{"_path":1234,"title":1235},"/docs/webhooks/functions/multipart-form-data","Multipart form to JSON",{"_path":1237,"title":1238},"/docs/webhooks/functions/url-encoded-data","URL Encoded Form",{"_path":1240,"title":1241},"/docs/webhooks/functions/working-with-time","Working with time",{"_path":1243,"title":1244},"/docs/webhooks/functions/send-emails","Sending emails",{"_path":1246,"title":1247},"/docs/webhooks/functions/crypto-functions","Base64, encryption",{"_path":1249,"title":1250},"/docs/webhooks/functions/integrate-into-cicd","Integrating into CI/CD",{"_path":1252,"title":1208},"/docs/webhooks/functions/big-query",{"_path":1254,"title":1255},"/docs/webhooks/functions/accessing-metadata","Accessing metadata",{"_path":1257,"title":1258},"/docs/webhooks/functions/response-functions","Response (post-delivery) functions",{"_path":1260,"title":1261},"/docs/webhooks/functions","Functions",1783373338186]