Package Information
Documentation
@kirimdev/n8n-nodes-kirim
Official n8n community node for Kirimdev — send WhatsApp messages, manage contacts and conversations, and react to events, all from your n8n workflows.
What's in this package
| Node | Type | Use |
|---|---|---|
| Kirimdev | Action | Send messages, manage contacts/conversations/labels, browse templates, inspect webhook deliveries |
| Kirimdev Trigger | Trigger | Auto-subscribe to events, verify HMAC signatures, fire workflows on inbound activity |
Both nodes share a single Kirimdev API credential (API key + base URL) and work against production, staging, or a self-hosted Kirimdev install.
Install
In n8n:
- Go to Settings → Community Nodes
- Click Install a community node
- Enter
@kirimdev/n8n-nodes-kirim - Agree to the community node risk notice, click Install
- Restart n8n if the node doesn't show up immediately
Or via npm (in your n8n install root):
npm install @kirimdev/n8n-nodes-kirim
Credentials setup
- Generate an API key in the Kirimdev dashboard: Developers → API Keys → Create key (the plaintext is shown once — store it safely).
- In n8n, Credentials → Add Credential → Kirimdev API.
- Paste the
kdv_live_...key. Leave Base URL at its default unless you target staging.
The credential's Test button calls GET /v1/me to confirm the key is valid.
Action node — Kirimdev
Resources & operations
| Resource | Operations |
|---|---|
| Message | Send Text / Send Template / Send Image / Send Document / Send Video / Send Audio / Send Interactive CTA / Send Interactive Reply Buttons / Send Interactive List / Mark as Read / Get / List |
| Contact | Create / Get / List / Update / Delete / Attach Label / Detach Label / Bulk Label |
| Conversation | Get / List / Update (assignment + status) / Attach Label / Detach Label |
| Label | Create / Get / List / Update / Delete |
| Template | Get / List |
| Webhook Delivery | Get / List / Replay |
Example — send a text message
- Drag Kirimdev into your workflow.
- Select credentials.
- Resource: Message, Operation: Send Text.
- Fill To (E.164 with leading
+) and Message. - Wire upstream data into expressions (e.g.
={{ $json.phone }}).
Example — reply to an inbound message (quoted bubble)
After a Kirimdev Trigger (message.received), use Send Text (or any send operation) on the same Kirimdev node and fill:
| Field | Expression |
|---|---|
| From Account | your connected number |
| To | ={{ '+' + $json.entry[0].changes[0].value.messages[0].from }} |
| Reply To Message ID (Wamid) | ={{ $json.entry[0].changes[0].value.messages[0].id }} |
| Message | your reply text |
The node sends context.message_id to the API — same Meta wire shape as the Cloud API. Use the wamid from the webhook, not kirim.message_id (msg_…).
Example — send a template (outside the 24h window)
Template messages are the only way to start a conversation when there is no active 24-hour window.
- Operation: Send Template
- Template Name: pick from the dropdown — the list is loaded live from your selected From account and limited to
approvedtemplates. The label embeds the variable count, e.g.welcome_customer (en_US) [4 var], so you know up front how many slots to fill. Language is derived from the selection. - Components Input: choose how to supply the template variables.
- Guided (default, recommended) — pick Number of Variables to match the
[N var]shown in the dropdown, then fillVariable {{1}}…Variable {{N}}. Optional Header Media entry handles text / image / video / document headers, and Button URL Variables handles dynamic-URL buttons (one entry per button position). - Raw JSON (Advanced) — hand-write the Meta-shaped
componentsarray. Use this for shapes the guided form does not cover (named placeholders, LOCATION header, COPY_CODE / FLOW / QUICK_REPLY buttons, or any new Meta addition).
- Guided (default, recommended) — pick Number of Variables to match the
Use as an AI Agent tool
The Kirimdev node sets usableAsTool: true, so every operation can be dropped into n8n AI Agent nodes. Useful patterns:
- "When a customer asks for the status of order #X, look it up in our DB then send them a templated update via Kirimdev."
- "When the AI categorises an incoming message as a refund request, attach a
refund-requestlabel and assign it to the support team."
Trigger node — Kirimdev Trigger
The Trigger node manages a Kirimdev webhook subscription automatically:
- Drag Kirimdev Trigger into a workflow.
- Select credentials.
- Pick which events to listen for from the multi-select.
- Activate the workflow.
On activation, the node:
- Calls
POST /v1/webhook_subscriptionswith the n8n-generated URL and your selected events. - Stores the returned
signing_secretin workflow static data (never logged). - Verifies every inbound POST against that secret via HMAC-SHA256 in constant time. Bad signatures are dropped with HTTP 401.
On deactivation, the node calls DELETE /v1/webhook_subscriptions/{id} to stop further deliveries.
Manual subscription (Kirimdev dashboard)
If you created the webhook subscription in the Kirimdev dashboard (not via n8n activation):
- Copy the Production URL from the Kirim Trigger node in n8n.
- Create the subscription in Kirimdev with that URL + your events.
- Copy the
initial_secret(whsec_…) shown once at creation. - Paste it into the trigger node's Signing Secret field.
- Activate the workflow.
n8n will verify signatures using that secret and will not call POST /webhook_subscriptions again.
Troubleshooting 401 on deliveries
| Response body | Cause | Fix |
|---|---|---|
webhook not initialised |
No signing secret in n8n | Activate the workflow (auto-managed) or paste Signing Secret (dashboard-managed) |
invalid signature |
Raw body mismatch (old node versions) | Rebuild node (npm run build) and restart n8n |
| Wrong secret | Subscription recreated but n8n still has old secret | Deactivate → re-activate, or paste the current secret |
After fixing, use Replay on failed deliveries in the Kirimdev dashboard.
Available events
| Event | Source | Fires when |
|---|---|---|
message.received |
Meta passthrough | Inbound WhatsApp message from a contact |
message.sent |
Kirimdev | Outbound message accepted by Meta with full body |
message.status |
Meta passthrough | Outbound message status update (sent / delivered / read / failed) |
conversation.assigned |
Kirimdev | A conversation's assignee changed |
conversation.closed |
Kirimdev | A conversation was marked resolved |
contact.created |
Kirimdev | A new contact was added |
contact.updated |
Kirimdev | A contact's fields or metadata changed |
Public webhook URL is required
n8n must be reachable from Kirimdev's network for webhooks to work:
- n8n Cloud: webhooks just work — your workflow URL is already public.
- Self-hosted: set
WEBHOOK_URLin n8n's environment so the URL it advertises is publicly resolvable. For local dev, use ngrok or cloudflared.
If activation fails with URL is not reachable, your n8n instance is not publicly accessible — fix that before retrying.
Compatibility
- n8n: v1.70+
- Node.js: v18+ (matches n8n's own runtime floor)
Development
git clone <this-repo>
cd n8n-nodes-kirim
npm install
npm run dev # starts n8n at http://localhost:5678 with this node hot-loaded
Linting + build:
npm run lint
npm run build
Resources
- Kirimdev API docs — https://docs.kirimdev.com
- Authentication — https://docs.kirimdev.com/authentication/
- Webhooks overview — https://docs.kirimdev.com/webhooks/overview/
- TypeScript SDK (
@kirimdev/sdk) — https://www.npmjs.com/package/@kirimdev/sdk - n8n community nodes — https://docs.n8n.io/integrations/community-nodes/
License
This is a community node. It is published by Kirimdev and not affiliated with, endorsed by, or sponsored by n8n GmbH, Meta Platforms, Inc., or WhatsApp LLC. The package name uses the required n8n-nodes-… prefix for discoverability, which is nominative fair use of the n8n trademark.