[{"data":1,"prerenderedAt":157},["ShallowReactive",2],{"pseo:platforms:n8n:send-group-message":3},{"ban_risk":4,"faqs":5,"feature":15,"goal":19,"platform":20,"prerequisites":26,"related":30,"seo":81,"steps":97,"test":132,"tier":133,"troubleshooting":134,"updated":95,"url":91,"verified":156},"medium",[6,9,12],{"a":7,"q":8},"Yes, with the same shape: post to the media endpoint for the type you want, with the group id as the recipient and a media id or a public URL for the file. Upload the file once and reuse its media id when the same asset goes to several groups, rather than re-uploading it in every execution, which is slower and counts against the same quotas.","Can I send an image or a document to the group from n8n?",{"a":10,"q":11},"The send is refused with a forbidden error unless the linked number is an admin of that group. Wapito cannot promote itself; another admin has to do it from the phone or through the admins endpoint from a channel that is already an admin. Check the group's settings once before the workflow goes live rather than discovering it from the failure branch.","What happens if the group only allows admins to post?",{"a":13,"q":14},"There is no published number, and the honest answer is that a group message is one send against the same per-channel queue as everything else. A daily digest is unremarkable; a message every few minutes from a number that joined the group last week is the pattern that draws a restriction. Wapito paces the queue, but it cannot make a burst look like a person.","How often can a workflow post to a group without getting the number restricted?",{"name":16,"slug":17,"url":18},"Send Group Message","send-group-message","\u002Fwhatsapp-api\u002Fsend-group-message\u002F","Post a message into an existing WhatsApp group from n8n on a schedule or when something happens elsewhere. The group id is the recipient, so the same HTTP Request node that sends to a person sends to the group; a Schedule Trigger, a Code node that writes the digest and one send node are the whole workflow.",{"http_module":21,"name":24,"slug":24,"url":25},{"docs_url":22,"name":23},"https:\u002F\u002Fdocs.n8n.io\u002Fintegrations\u002Fbuiltin\u002Fcore-nodes\u002Fn8n-nodes-base.httprequest\u002F","HTTP Request node","n8n","\u002Fintegrations\u002Fn8n\u002F",[27,28,29],"An n8n instance with a Header Auth credential already holding your Wapito channel token.","The id of the target group, ending in @g.us, read from the groups endpoint or from the group's own create response.","The linked number has to be a member of the group; it does not need to be an admin unless the group is set to admins-only posting.",{"errors":31,"operations":47,"pillar":18,"platform":25},[32,35,38,41,44],{"title":33,"url":34},"rate_limited (429)","\u002Fdocs\u002Ferrors\u002Frate-limited\u002F",{"title":36,"url":37},"send_rate_limited (429)","\u002Fdocs\u002Ferrors\u002Fsend-rate-limited\u002F",{"title":39,"url":40},"invalid_request (400)","\u002Fdocs\u002Ferrors\u002Finvalid-request\u002F",{"title":42,"url":43},"invalid_recipient (400)","\u002Fdocs\u002Ferrors\u002Finvalid-recipient\u002F",{"title":45,"url":46},"unauthorized (401)","\u002Fdocs\u002Ferrors\u002Funauthorized\u002F",[48,51,54,57,60,63,66,69,72,75,78],{"title":49,"url":50},"POST \u002Fmessages\u002Ftext","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-text\u002F",{"title":52,"url":53},"POST \u002Fmessages\u002Fimage","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-image\u002F",{"title":55,"url":56},"POST \u002Fmessages\u002Fvideo","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-video\u002F",{"title":58,"url":59},"POST \u002Fmessages\u002Fdocument","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-document\u002F",{"title":61,"url":62},"POST \u002Fmessages\u002Fsticker","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-sticker\u002F",{"title":64,"url":65},"POST \u002Fmessages\u002Faudio","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-audio\u002F",{"title":67,"url":68},"POST \u002Fmessages\u002Fvoice","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-voice\u002F",{"title":70,"url":71},"POST \u002Fmessages\u002Flink","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-link\u002F",{"title":73,"url":74},"POST \u002Fmessages\u002Flocation","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-location\u002F",{"title":76,"url":77},"POST \u002Fmessages\u002Fcontact","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-contact\u002F",{"title":79,"url":80},"POST \u002Fmessages\u002Fpoll","\u002Fdocs\u002Fapi\u002Fmessages\u002Fsend-poll\u002F",{"breadcrumb":82,"canonical":92,"description":93,"h1":94,"lastmod":95,"title":96},[83,86,89,90],{"name":84,"url":85},"Home","\u002F",{"name":87,"url":88},"Integrations","\u002Fintegrations\u002F",{"name":24,"url":25},{"name":16,"url":91},"\u002Fintegrations\u002Fn8n\u002Fsend-group-message\u002F","https:\u002F\u002Fwapito.com\u002Fintegrations\u002Fn8n\u002Fsend-group-message\u002F","Post a message into an existing WhatsApp group from n8n on a schedule or when something happens elsewhere. 6 steps, a test run and the errors to expect.","Send a message to a WhatsApp group from n8n","2026-09-16","Send WhatsApp Group Messages from n8n | Wapito",[98,103,107,113,121,127],{"body":99,"field_map":100,"title":102},"Add a one-off HTTP Request node that calls GET https:\u002F\u002Fapi.wapito.com\u002Fv1\u002Fgroups with the Wapito credential, run it, and copy the id of the group you want from the results. Paste it into a workflow variable or a Set node at the top of the real workflow rather than into every send node, because a group id is text you will want to change in exactly one place.",{"group_id":101},"The id field of the matching entry in the GET \u002Fgroups response, for example 120363041234567890@g.us","Find the group id once and keep it",{"body":104,"field_map":105,"title":106},"For a daily digest use a Schedule Trigger set to the hour your team reads the group; for an alert use whatever node observes the event, such as a Postgres trigger or a Webhook node. Either way the trigger should fire once per message you intend to send, because a loop that produces one item per row will send one group message per row.",{},"Trigger on a schedule or on an event",{"body":108,"field_map":109,"title":112},"Write the body in a Code node so the formatting lives in one place: join the rows into lines, use WhatsApp markdown such as asterisks for bold, and keep it under a screen or two, since a group reads a wall of text as noise. If you want to notify specific members, put their numbers in a mentions array and write each one as an at sign followed by the digits inside the body.",{"body":110,"mentions":111},"The string the Code node returns as json.body, with *bold* and _italic_ passed through","Optional array of digit-only numbers, each also written as @15551234567 in the body","Compose the message in a Code node",{"body":114,"field_map":115,"title":120},"Add an HTTP Request node with POST https:\u002F\u002Fapi.wapito.com\u002Fv1\u002Fmessages\u002Ftext, the Wapito credential under Generic Credential Type, and a JSON body built from expressions. The recipient is the stored group id; nothing else about the request differs from a message to a person. A typing_time of a few seconds spaces the send out on a busy morning.",{"body":116,"mentions":117,"to":118,"typing_time":119},"{{ $json.body }} — the text from the Code node","{{ $json.mentions }} — omit the field when there are none","{{ $('Set').item.json.group_id }} — the @g.us id","2","Send it to the group with an HTTP Request node",{"body":122,"field_map":123,"title":126},"The 201 response carries the message id, chat_id and a status of sent; write the id somewhere with a Set node so a later status event can be matched to this send. Turn on Continue On Fail and route the error output to a notification node, and read error.code there, because a send_rate_limited or reachout_timelocked answer means the number needs slowing down rather than retrying.",{"error.code":124,"message_id":125},"{{ $json.error.code }} on the failure branch","{{ $json.id }} from the send response","Record the message id and branch on the outcome",{"body":128,"field_map":129,"title":131},"In a group, the messages.status event arrives once per participant, so a single digest to a large group produces a burst of receipts on your Webhook node. If you subscribe to status events, follow the Webhook node with an Aggregate node keyed on the message id and count delivered versus failed, rather than writing every receipt to a table that will fill up within a week.",{"status.message_id":130},"The id you stored in the previous step, used as the aggregate key","Aggregate the delivery receipts, do not store them all","Point the workflow at a test group that contains only your own two numbers and execute it manually. The HTTP Request node should return a 201 with a message id, the text should appear in the group on both phones with the bold formatting intact, and if a mention was included the mentioned phone should show a notification.","t3b",[135,139,143,146,151],{"code":136,"http_status":137,"title":138,"url":43},"invalid_recipient",400,"Recipient is not valid",{"code":140,"http_status":141,"title":142,"url":37},"send_rate_limited",429,"Send queue saturated",{"code":144,"http_status":141,"title":145,"url":34},"rate_limited","Too many requests",{"code":147,"http_status":148,"title":149,"url":150},"channel_not_connected",409,"Channel not connected","\u002Fdocs\u002Ferrors\u002Fchannel-not-connected\u002F",{"code":152,"http_status":153,"title":154,"url":155},"forbidden",403,"Action not allowed","\u002Fdocs\u002Ferrors\u002Fforbidden\u002F",false,1790464904432]