LINE Notify shut down on March 31, 2025. The built-in Line node in n8n only ever called LINE Notify, so old workflows that use it now fail, and since n8n 2.40 the node no longer appears in the nodes panel. The way to keep sending LINE notifications from n8n is to create a LINE Official Account, turn on the Messaging API, and call the push message endpoint from an HTTP Request node. This guide walks through the whole thing: creating the Messaging API channel, issuing a channel access token, catching LINE events with an n8n Webhook to find your own userId or a group ID, and finally building a workflow that sends a LINE message to your phone the moment someone submits a form. You need a LINE account and an n8n 2.x instance with a public HTTPS URL. Plan on about 40 minutes the first time.
Facts checked as of October 2026. n8n screens and parameter names follow version 2.43. LINE API behavior and Taiwan Official Account pricing follow the LINE Developers documentation and LINE Taiwan's official announcements, listed at the end.
What changes when you move from LINE Notify to the Messaging API
LINE Notify was simple: you generated a token on your personal account, and messages arrived from the "LINE Notify" account in your own chat or in a group you picked. With the Messaging API, messages come from your own LINE Official Account. That adds two requirements. Whoever receives the message has to add your Official Account as a friend, and to post in a group you first have to invite the Official Account into that group. Old Notify tokens can't be reused; you'll issue a new channel access token.
The second difference is message volume. LINE Notify was free. With the Messaging API, push messages count toward your Official Account's monthly message allowance. The free plan in Taiwan includes 200 messages a month, and the section on push and reply below has the full numbers. If you only send a handful of system alerts to yourself each day, the free plan is usually enough.
On the n8n side, the built-in Line node only supports LINE Notify. n8n marked it deprecated in 1.64.0, and from 2.40 onward you can't find it in the nodes panel anymore; existing workflows show a deprecation notice on the node. n8n has no built-in Messaging API node today. A few community nodes exist on npm (for example @aotoki/n8n-nodes-line-messaging and n8n-nodes-linewebhook), but they are maintained by individuals and updated irregularly. This guide uses the built-in HTTP Request node to call the LINE API directly. It takes only a few fields, adds no extra packages, and if LINE changes something you can adjust it yourself.
Step 1: Create an Official Account and enable the Messaging API
Since September 4, 2024, you can no longer create a Messaging API channel directly in the LINE Developers Console. You create a LINE Official Account first, then turn on the Messaging API from the Official Account side:
- Sign in to LINE Official Account Manager (manager.line.biz) with your LINE account and create a new Official Account. An account name and a business category are enough. The name shows up as the sender of your notifications, so pick something obvious, such as "Company Alerts".
- In Official Account Manager, open Settings, choose Messaging API in the sidebar, and click Enable Messaging API. You'll be asked to pick a provider. If you don't have one, create it; a company name or your own name both work.
- Sign in to the LINE Developers Console (developers.line.biz/console) with the same LINE account and open that provider. A new Messaging API channel is waiting there, and the rest of the setup happens in it.
Think for a moment before choosing the provider. Once an Official Account is assigned to a provider, you can't change it, and LINE issues user IDs per provider. The same person has the same userId across every channel under one provider, whether it's a Messaging API channel or LINE Login, but a different userId under another provider. If you expect to run several Official Accounts, keeping them under one provider lets you share IDs between them.
While you're in Official Account Manager, open the response settings, turn off auto-reply messages, and turn on webhooks. Auto-reply is on by default, and if you leave it on, every test message you send gets a canned response first, which gets confusing fast. LINE's own documentation recommends disabling greeting messages and auto-replies when you build your first bot.
Step 2: Issue a channel access token and create an n8n credential
In the LINE Developers Console, open the channel, switch to the Messaging API tab, scroll to the bottom to "Channel access token (long-lived)", and click Issue. You'll get a long token string. This is the key n8n sends with every LINE API call, so treat it like a password.
A long-lived token never expires. Clicking Issue again revokes the current one, though you can keep the old token valid for up to 24 hours while you swap it out. LINE recommends channel access token v2.1, which lets you set an expiry of up to 30 days and is more secure, but it has to be renewed with a JSON Web Token, which means building a second workflow just to rotate tokens. For personal or small-team notifications, a long-lived token that you keep private is the practical choice. If it ever leaks into a chat or a screenshot, issue a new one.
The Basic settings tab of the same channel has two values you'll need. The Channel secret is used to verify webhook signatures. "Your user ID" is your own userId: a U followed by 32 hexadecimal characters. If you only want to notify yourself, copy that value and you can skip the webhook step. If the field is missing, the Business ID you used to sign in to LINE Developers isn't linked to a LINE account yet; link it and the field appears.
Now create the credential in n8n. Add it from the credentials page, or from the credential field of an HTTP Request node by choosing Create new credential. Search for "Bearer Auth", paste the token into the Bearer Token field, name it "LINE Messaging API", and save. Every node that calls LINE can reuse this credential, the token never appears in the workflow itself, and you won't hand it to someone by accident when you export a workflow.
Step 3: Find your userId or a group ID with an n8n Webhook
To message anyone other than yourself, or to post in a group, you need their ID. LINE has no lookup screen for user IDs. IDs only appear in the events LINE sends to your webhook: when someone adds your Official Account as a friend, sends it a message, or invites it into a group, LINE POSTs an event to your webhook URL, and that event contains the userId or groupId. So the first job is a small n8n workflow that receives events.
- Create a new workflow and add a Webhook node as the trigger. Set HTTP Method to POST, set Path to
line-webhook, and leave Respond at the default, Immediately, which returns 200 as soon as the request arrives. - Under Webhook URLs, switch to Production URL and copy it. It looks like
https://your-name.roamerhost.com/webhook/line-webhook. Then click Publish in the top-right corner of the canvas (in n8n 1.x, turn on the Active toggle instead). The production URL only works after the workflow is published. - Back in the LINE Developers Console, on the Messaging API tab, click Edit under Webhook URL, paste the URL, click Update, then click Verify. Success means LINE can reach your n8n. Finally, turn on "Use webhook". Without it, LINE sends no events at all.
- Scan the QR code on the same tab with your phone, add the Official Account as a friend, and send it any message. In n8n, open the Executions tab, click the newest execution, select the Webhook node, and your userId is at
body.events[0].source.userId.
The incoming data looks roughly like this (trimmed):
{
"body": {
"destination": "U1234...",
"events": [
{
"type": "message",
"message": { "type": "text", "text": "test" },
"source": {
"type": "user",
"userId": "U4af4980629..."
},
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"mode": "active"
}
]
}
}
For a group, first find "Allow bot to join group chats" on the Messaging API tab and click Edit. It takes you to Official Account Manager, where you allow the account to join groups; this is off by default. Then invite the Official Account into your LINE group. LINE sends a join event whose source.type is group, and source.groupId is the group ID, which starts with C. If you invite it into an old multi-person chat, you get a roomId starting with R instead, and it works the same way. Only one Official Account can be in a group at a time.
To use these values in later nodes, write the expressions like this:
{{ $json.body.events[0].source.userId }}
{{ $json.body.events[0].source.groupId }}
If you'd rather see the data right in the editor, you can use the Test URL: click Listen for test event on the Webhook node, then send a message in LINE. The test URL only listens for 120 seconds and accepts a single request per click, the Verify button alone uses that up, and you'd have to switch the URL in the LINE console back and forth between test and production. For a one-off job like collecting IDs, the production URL plus the Executions tab is simpler. The n8n webhook guide explains the two URL types in more detail.
Step 4: Send your first push message with an HTTP Request node
With a token and an ID, you can send messages. Create a workflow (a Manual Trigger is fine for now), add an HTTP Request node, and configure it like this:
- Set Method to POST and URL to
https://api.line.me/v2/bot/message/push. - Set Authentication to Generic Credential Type, Generic Auth Type to Bearer Auth, and pick the "LINE Messaging API" credential.
- Turn on Send Body, set Body Content Type to JSON and Specify Body to Using JSON, then paste the JSON below and replace the value of to with your userId or group ID.
{
"to": "U4af4980629...",
"messages": [
{ "type": "text", "text": "Test push from n8n. If you can read this, it works." }
]
}
Click Execute step. On success, the node outputs a sentMessages array with the message ID, and your phone buzzes at the same moment. n8n sets the Content-Type header from the Body Content Type, so you don't add it yourself. If you prefer copying examples from the LINE docs, the node's Import cURL option accepts the curl command as-is and fills in the URL, headers, and body. Delete the hard-coded Authorization header it creates and select the credential instead.
A single push can carry up to 5 message objects, and a text message can be up to 5,000 characters. Besides text there are image, sticker, Flex Message, and other types. Get plain text working first and add layout later.
Example: get a LINE message when someone submits a form
The most common LINE Notify use case was "tell me when someone fills in a form". The example below uses the form built into n8n, so you don't need a website. Once it's running, share the form link with customers or put it on your site.
Create a workflow and pick the n8n Form trigger, On form submission. Set Form Title to "Contact us" and add three entries under Form Elements: "Name" and "Contact" as required Text Input fields, and "Message" as a Textarea. After a submission, the node's output fields are named after the labels, so later nodes read them as $json['Name'] and so on.
Add an HTTP Request node configured exactly as in step 4, with this JSON body:
{
"to": "U4af4980629...",
"messages": [
{
"type": "text",
"text": {{ JSON.stringify('📩 New inquiry\nName: ' + $json['Name'] + '\nContact: ' + $json['Contact'] + '\nMessage: ' + ($json['Message'] || '(empty)')) }}
}
]
}
Notice that the text line has no quotes of its own. The whole string goes through JSON.stringify(), which turns it into a valid JSON string. If you wrote "text": "{{ $json['Message'] }}" instead, a line break or a double quote in the visitor's message would break the JSON, and the node would fail with The value in the "JSON Body" field is not valid JSON and the detail Bad control character in string literal. This is the most common trap when moving from LINE Notify: the old Line node took a plain message field and handled formatting for you, while now you own the JSON. We tested this pattern on n8n 2.43 with form input containing line breaks, double quotes, and emoji, and LINE delivered a clean multi-line message.
To save time, copy the whole block below, click an empty spot on the n8n canvas, and press Ctrl+V (Cmd+V on a Mac). Both nodes appear already connected. Pick the credential in the HTTP Request node, replace the value of to with your ID, and click Publish:
{
"nodes": [
{
"parameters": {
"formTitle": "Contact us",
"formFields": {
"values": [
{
"fieldLabel": "Name",
"requiredField": true
},
{
"fieldLabel": "Contact",
"requiredField": true
},
{
"fieldLabel": "Message",
"fieldType": "textarea"
}
]
},
"options": {}
},
"name": "Contact form",
"type": "n8n-nodes-base.formTrigger",
"typeVersion": 2.3,
"position": [
0,
0
],
"webhookId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b"
},
{
"parameters": {
"method": "POST",
"url": "https://api.line.me/v2/bot/message/push",
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"to\": \"YOUR_USER_ID_OR_GROUP_ID\",\n \"messages\": [\n {\n \"type\": \"text\",\n \"text\": {{ JSON.stringify('📩 New inquiry\\nName: ' + $json['Name'] + '\\nContact: ' + $json['Contact'] + '\\nMessage: ' + ($json['Message'] || '(empty)')) }}\n }\n ]\n}",
"options": {}
},
"name": "Push to LINE",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
240,
0
]
}
],
"connections": {
"Contact form": {
"main": [
[
{
"node": "Push to LINE",
"type": "main",
"index": 0
}
]
]
}
}
}
After publishing, switch the form trigger to Production URL to get the public form link. If your website already has a form, for example a WordPress form plugin, you can have it send submissions to an n8n Webhook node instead and reuse the same HTTP Request node, reading fields from $json.body.
Swap the trigger and the same setup becomes a morning to-do digest. Replace the form trigger with a Schedule Trigger set to run every day at 8 AM, read today's items from a Google Sheet or a database in between, and push them as one text message. Schedules follow n8n's time zone setting. A self-hosted n8n without GENERIC_TIMEZONE defaults to America/New_York, so 8 AM there is evening in Taiwan. RoamerHost's managed n8n ships with Asia/Taipei preset. To post in a family or team group, put the group ID in to, but read the next section first, because groups are counted differently.
Push vs. reply, and how the free allowance is counted
The Messaging API has two main ways to send. A push message can go out at any time as long as you know the recipient's ID. A reply message answers a specific event and needs the replyToken that LINE includes in the webhook event; a reply token can be used once and should be used within one minute of receiving the event. The difference that matters most is billing: push, multicast, and broadcast messages count toward your monthly allowance, and reply messages don't.
So for a workflow where a user messages first and n8n looks something up and answers, use reply and it costs nothing. Notification workflows have no incoming message to answer, so they have to use push. A reply looks almost the same as a push: change the URL to https://api.line.me/v2/bot/message/reply and replace to with replyToken. It plugs straight into the Webhook workflow from step 3:
{
"replyToken": "{{ $json.body.events[0].replyToken }}",
"messages": [
{ "type": "text", "text": "Got it. We will get back to you shortly." }
]
}
Groups need extra care, because LINE counts messages by the number of people who receive them. One push to a group of 5 counts as 5 messages, no matter how many message objects the request contains. A daily push to a 6-person family group adds up to about 180 messages a month, nearly all of the 200 free ones.
LINE Official Accounts in Taiwan currently come in three plans. Starting November 1, 2026, the monthly fees of the two paid plans go up, while the included messages stay the same:
| Plan | Monthly fee (before tax) | Free messages per month | After the allowance |
|---|---|---|---|
| Light | Free | 200 | No extra messages; push is blocked for the rest of the month |
| Medium | NT$800, NT$1,000 from Nov 1 | 3,000 | No extra messages; move to the High plan |
| High | NT$1,200, NT$1,400 from Nov 1 | 6,000 | Extra messages available; from November, NT$0.2 each for the first 50,000, then NT$0.15 each |
The table follows LINE Taiwan's September 2026 pricing announcement for Official Accounts. All amounts exclude tax, and the plan page in Official Account Manager is the final word. To check how many messages you've sent this month, call GET https://api.line.me/v2/bot/message/quota/consumption from an HTTP Request node with the same Bearer credential. The totalUsage field is this month's count; LINE describes it as approximate, and the exact number is in Official Account Manager.
Optional: verify the webhook signature to reject forged requests
A webhook URL is public, so anyone who knows it can POST fake events. If your workflow acts on incoming messages, for example looking up records or changing an order status when it sees a keyword, verify the x-line-signature header. LINE computes an HMAC-SHA256 of the entire request body with your Channel secret and encodes it in Base64. Compute the same value in n8n and continue only when the two match.
- In the Webhook node, add the Raw Body option and turn it on. The signature is calculated over the raw body. If n8n parses the JSON and you turn it back into a string, whitespace and escaping can differ and the hash won't match, so always hash the raw body.
- Add a Crypto node: set Action to Hmac, turn on Binary File, set Binary Property Name to data, Type to SHA256, Property Name to expectedSignature, and Encoding to BASE64. Create a new Crypto credential and paste the Channel secret into its Hmac Secret field.
- Add an IF node with a string "is equal to" condition:
{{ $json.expectedSignature }}on the left and{{ $json.headers['x-line-signature'] }}on the right. Continue from the true branch and leave the false branch empty so the run stops there.
We tested this setup on n8n 2.43 with the sample signature from the LINE documentation and with events containing non-Latin text, emoji, line breaks, and double quotes. Valid signatures went to the true branch, and tampered ones went to false. With Raw Body turned on, $json.body is still the parsed JSON, so later nodes read fields as usual. On n8n versions before 2.7, the Crypto node takes the secret in its own Secret field instead of a credential.
Common errors and how to fix them
401: wrong or missing token
The HTTP Request node shows "Authorization failed - please check your credentials", and the error details contain LINE's message, Authentication failed. Confirm that the access token in the authorization header is valid. Usually the pasted token has an extra space or is cut short, the token was reissued (which revokes the old one), or the Channel secret was pasted instead of the token. If the message is Authorization header required, the request carried no header at all, most often because Authentication is still set to None or no credential is selected.
400: wrong userId or group ID
The node shows "Bad request - please check your parameters", and LINE usually returns Failed to send messages. The cause is almost always the to field: someone used the searchable LINE ID from a profile instead of the userId, the userId came from a channel under a different provider, or the Official Account was removed from the group. A userId always starts with U followed by 32 characters, and a group ID starts with C. If the message is The request body has 1 error(s), the JSON structure itself is wrong; the property field in details points at the culprit.
The node succeeds but nothing arrives
If the recipient blocked your Official Account, never added it as a friend, or deleted their LINE account, push still returns 200, but the message isn't delivered. When the node shows success and the phone stays silent, check that the person is still a friend and hasn't blocked the account. If you blocked the account yourself to test unfollow events, remember to unblock it.
429: monthly limit reached or too many requests
You have reached your monthly limit. means this month's free messages are used up. The Light plan can't buy extra messages, so you wait for next month or change plans. The API rate limit has been exceeded. Try again later. means too many calls in a short time. The push endpoint allows 2,000 requests per second, which normal notification workflows never approach, but if you loop over many recipients, add the Batching option to the HTTP Request node to control batch size and interval.
Webhook verification fails
When you click Verify, LINE sends a test request whose events array is empty, and any 200 response counts as success. Failures usually come from one of these: the Test URL was pasted but nobody clicked Listen for test event, so n8n returned 404; the workflow isn't published yet, so the production URL doesn't exist; the HTTP Method isn't POST; or the Webhook node has authentication such as Header Auth, which LINE can't provide. LINE also rejects self-signed certificates, so the URL needs a certificate from a trusted CA.
Response time matters too. If LINE gets no response within 2 seconds, it records a timeout, which you can see under Statistics in the LINE Developers Console. Keep the Webhook node's Respond setting on Immediately so n8n answers 200 right away and runs the rest in the background. With When Last Node Finishes, a single database lookup or AI call can push you past 2 seconds. Free hosts that go to sleep have the same problem, since a cold start alone can exceed the limit. Where to host a LINE bot covers this in detail.
Lots of empty executions
The empty event from Verify and the unfollow event when someone blocks you also trigger the workflow, and any node that reads events[0] fails on an empty array. Add a Filter node after the Webhook with the condition {{ $json.body.events.length }} greater than 0, and if needed check that events[0].type is message. A single request can also carry more than one event, so busy accounts should use a Split Out node to process events one by one. Executions pile up over time and grow the database; see n8n execution data growth and cleanup for how to prune them.
If you'd rather not run the server yourself
LINE webhooks need a public HTTPS URL with a valid certificate that stays up around the clock, and n8n itself needs regular updates; October 2026 alone brought two security advisories (see n8n October security updates). If you want to spend your time on workflows instead of servers, certificates, and updates, RoamerHost's managed n8n runs in an isolated container with its own HTTPS subdomain, so the webhook URL is ready to paste into the LINE console. It comes with the Asia/Taipei time zone preset, unlimited executions and workflows, automatic updates, automatic backups, and support in Chinese, for NT$5,988 per year (avg. NT$499/mo). New to n8n? Start with building your first workflow. Once notifications are running, you can connect the Webhook to an AI Agent that looks things up and answers users with reply messages.
FAQ
Q: Can I still use my LINE Notify token?
No. LINE Notify ended service on March 31, 2025, so old tokens and the built-in n8n Line node can no longer send anything. Switch to the Messaging API: create an Official Account and issue a channel access token. People who used to receive your notifications need to add the Official Account as a friend, or you need to invite it into the existing group.
Q: Are 200 free messages a month enough?
For alerts sent only to yourself, 5 a day comes to about 150 a month, which fits. Group messages are multiplied by the number of members and run out quickly. Use reply whenever someone messages first, because replies don't count. If you still run short, consider the Medium or High plan.
Q: Can I message people who haven't added my Official Account?
Generally no. Push recipients must be friends of the Official Account or members of a group it belongs to. The exception is a user who sent your account a message in a one-to-one chat; you can push to them for 7 days afterward. For anyone else the API still returns 200, but nothing is delivered.
Q: Does this work on n8n Cloud?
Yes, the steps are the same. The HTTP Request node only needs outbound access to the LINE API, and the webhook uses the URL n8n Cloud gives you. The difference is pricing: n8n Cloud charges by workflow executions, and every webhook event is one execution, so estimate your volume first if busy groups are involved.
Q: Can I send images or messages with buttons?
Yes. Set type to image and provide two HTTPS image URLs in originalContentUrl and previewImageUrl to send a picture. For layouts and buttons, use a Flex Message. Get the workflow running with plain text first, then design the layout in LINE's Flex Message Simulator and paste the generated JSON into messages.
Sources
- LINE: LINE Notify end-of-service announcement
- LINE Developers: Get started with the Messaging API, Get user IDs, Group chats, Verify webhook signature
- LINE Developers: Messaging API reference (push, reply, errors, rate limits), Messaging API pricing, Webhook error statistics
- LINE Taiwan: 2026 Official Account pricing update
- n8n docs: Line node (deprecated), Webhook node, HTTP Request credentials, Save and publish workflows