n8n-nodes-easyhook
v0.2.7
Published
Official n8n nodes for the Easyhook messaging API.
Maintainers
Readme
n8n-nodes-easyhook
Official Easyhook integration for n8n.
Easyhook is a lightweight messaging API for WhatsApp Business Platform and other Meta messaging channels. This node focuses on the workflows developers normally automate:
Messagegroups cross-channel text and media actions.WhatsApp Onlygroups templates, Flows, read receipts, and typing indicators.- Use standard or humanized WhatsApp text delivery
- Schedule messages with Easyhook's
atparameter - Upload reusable media and send it later by
media_name - List/sync templates and media
- Cancel scheduled messages
- Receive Easyhook webhook events in n8n with the Easyhook Trigger node
Install
In n8n, open Settings > Community Nodes and install:
n8n-nodes-easyhookFor self-hosted n8n, you can also install it manually in your n8n custom nodes folder.
Credentials
Create an Easyhook API credential:
- API Key: your
eh_live_...key from Easyhook - API Base URL:
https://api.easyhook.dev
n8n validates the credential with GET /v1/me, so no WhatsApp number is needed just to test the API key.
Common Examples
Receive Webhooks
Use Easyhook Trigger as the first node in a workflow.
- Add the Easyhook Trigger node.
- Select your Easyhook API credential.
- Choose a provider. Easyhook filters the available events and scope types automatically.
- Choose a scope. For WABAs, WhatsApp numbers, Messenger Pages, or Instagram accounts, select a connected account from the list loaded with your API credential.
- Activate the workflow.
n8n registers its Production URL in Easyhook automatically and stores the HMAC signing secret in the workflow's private static data. Deactivating or deleting the workflow removes the Easyhook subscription. No portal setup or secret copy/paste is required.
WhatsApp uses the same three levels as the Easyhook portal: Entire Organization → WABA → WhatsApp Number. Selecting a WABA receives matching events from all numbers connected to it. Meta Business Portfolios stay internal and never appear as n8n scopes.
The trigger outputs the normalized Easyhook webhook JSON directly.
Send Text
- Resource:
Message - Operation:
Send Text - From:
5218661479075 - To:
5215660069997 - Body:
Hello from n8n
Choose Delivery: Humanized when you want Easyhook to mark the latest inbound WhatsApp message as read, wait a human-like read/typing delay, show typing, and then send the text. If you already know the inbound WhatsApp wamid, put it in Inbound Message ID; otherwise Easyhook uses the latest inbound message from To.
Send Read Or Typing
- Resource:
WhatsApp Only - Operation:
Send Read ReceiptorSend Typing Indicator - From: your WhatsApp sender number
- Inbound Message ID: the inbound WhatsApp
wamid
Send Reusable Media
First upload media:
- Resource:
Media - Operation:
Upload - From: your WhatsApp sender number
- Name:
promo_image - Type:
Image - Source:
Binary Property - Binary Property:
data
Then send it:
- Resource:
Message - Operation:
Send Media - From: your WhatsApp sender number
- To: customer WhatsApp ID
- Type:
Image - Media Reference Type:
Reusable Media Name - Media Name:
promo_image
Send Template
- Resource:
WhatsApp Only - Operation:
Send Template - Template Source:
Enter Manually - Template Name: the approved template name in Easyhook/Meta
- Language: select the Meta language code from the list, for example
es_MXoren_US - Template Data: choose
Map Automaticallyto load the template definition by name and language, orCustom Components (JSON)to provide raw components.
Both template sources support the same data modes. Choose From Easyhook selects an approved template from a list; Enter Manually resolves the approved template using the typed name and selected language. Map Automatically then creates only the fields required at send time:
- Header text variables
- Header image, video, or document URL and optional document filename
- Header location fields
- Body variables, including named variables
- Dynamic URL button values
- Quick reply payloads
- Copy-code coupon values
Use Custom Components (JSON) when you need to provide raw Meta components. The value can be a components array or { "components": [...] }. Template text itself remains fixed by the approved Meta template.
Text header, body variables, and dynamic URL button:
[
{
"type": "header",
"parameters": [{ "type": "text", "text": "PED-1048" }]
},
{
"type": "body",
"parameters": [
{ "type": "text", "text": "Benjamin" },
{ "type": "text", "text": "15 July" }
]
},
{
"type": "button",
"sub_type": "url",
"index": "0",
"parameters": [{ "type": "text", "text": "PED-1048" }]
}
]Media header and named body variable:
{
"components": [
{
"type": "header",
"parameters": [
{
"type": "document",
"document": {
"link": "https://cdn.example.com/invoice.pdf",
"filename": "invoice.pdf"
}
}
]
},
{
"type": "body",
"parameters": [
{
"type": "text",
"parameter_name": "customer_name",
"text": "Benjamin"
}
]
}
]
}Media links must use HTTPS and be downloadable by Meta without authentication. A dynamic URL button value is the variable suffix, not the complete URL. Use [] when the template has no runtime components.
Send WhatsApp Flow
- Resource:
WhatsApp Only - Operation:
Send Flow - From: your WhatsApp sender number
- To: customer WhatsApp number
- Flow Name: the Easyhook flow name
- Message Body: the text above the flow button
- Button Text: the flow button label
- Flow Data: optional key/value fields sent as the flow payload
Webhook Automation
Easyhook webhooks are handled with Easyhook Trigger. It is not a polling node: activation creates a /v1/webhooks subscription for the n8n Production URL and deactivation removes it. Deliveries are authenticated automatically with X-Easyhook-Signature: sha256=<hex>.
Useful event scopes:
message.*: incoming WhatsApp/Messenger/Instagram messagesstatus.*: message delivery/read/failure statustemplate.*: template status changesflow.submission.*: WhatsApp Flow responsessmb_message_echo.*: WhatsApp Business App coexistence message echoessmb_app_state_sync.*: WhatsApp Business App coexistence contact/app state synchistory.*: coexistence history sync eventsaccount_update.*: WhatsApp account updatesmedia.*: media lifecycle events, when enabled in Easyhookmessage.text,message.image,status.failed: narrower event filters matching the Easyhook portal
Messenger and Instagram hooks are configured in the Easyhook portal with the provider filter. In n8n you can also label a trigger as messenger.message.* or instagram.message.* for workflow clarity.
Receive Coexistence History
Configure the Easyhook Trigger before connecting the WhatsApp Business App number or requesting coexistence sync:
- Select
Provider: WhatsApp. - Select
Event: Coexistence history (history.*). - Choose the organization, WABA, or WhatsApp number scope.
- Activate the workflow.
- Allow history sharing in the WhatsApp Business App and keep the app open while synchronization starts.
Easyhook creates the webhook subscription and stores its HMAC secret in n8n automatically. Do not create a second portal webhook. message.* only covers live messages; it does not include history imports.
Each synchronized message starts one workflow execution. Historical inbound messages use type: message.received; historical outbound messages use type: message.echo. Both include message.source: history:
{
"id": "event_uuid",
"type": "message.echo",
"channel": "whatsapp",
"account": { "id": "980912725115744", "phone": "5218661479075" },
"contact": { "id": "5214445087305" },
"message": {
"id": "wamid...",
"direction": "out",
"source": "history",
"type": "text",
"text": "Previous reply",
"history": {
"thread_id": "5214445087305",
"status": "READ",
"phase": 1,
"chunk_order": 2,
"progress": 80
}
}
}If the business disables history sharing, Meta can return error 2593109; the trigger receives it as type: sync.failed under the same history.* selection.
Development
npm ci
npm run lint
npm run typecheck
npm run build
npm pack --dry-runReleases are published from GitHub Actions with npm provenance. See CONTRIBUTING.md for the validation and release workflow.
