dibales-ai

n8n community nodes for dibales.ai — simplified flow-builder with matcher triggers and chainable senders for chat automation across Instagram, WhatsApp, and TikTok.

Documentation

n8n-nodes-dibales-ai

Simplified flow-builder nodes for dibales.ai chat platforms — Instagram, WhatsApp, and TikTok.

This package is the opinionated, chatbot-first companion to n8n-nodes-pake-ai. Where the base package gives you raw webhook ports and a single monolithic action node, this one gives you a matcher trigger and chainable sender nodes with automatic postback routing — wire button outputs straight to the next Send Buttons node and the multi-level menu just works.

When to use which package

Need Package
Raw access to every event type on its own output port n8n-nodes-pake-ai
Build a chatbot flow with keyword matching and tappable button menus n8n-nodes-dibales-ai
Both — they install side by side install both

Install

In n8n, go to Settings → Community Nodes → Install and enter the package name:

@pake-ai/n8n-nodes-dibales-ai

After installing, search the node palette for "dibales.ai" — the triggers and action nodes for Instagram, WhatsApp, and TikTok will appear.

Requires n8n with community nodes enabled (N8N_COMMUNITY_PACKAGES_ENABLED=true, the default on most setups).

Local install (development)

  1. Build this package:

    cd /path/to/dibales-ai-flow
    npm install
    npm run build
    
  2. Make it available as a global link:

    npm link
    
  3. In your n8n custom-nodes directory, link against it:

    mkdir -p ~/.n8n/custom
    cd ~/.n8n/custom
    npm init -y     # only the first time
    npm link n8n-nodes-dibales-ai
    
  4. Start (or restart) n8n:

    n8n start
    
  5. In the n8n editor, search the node palette for "dibales.ai". The trigger and the consolidated Instagram action node will appear.

Setup in a workflow

  1. Add dibales.ai - Instagram Trigger to a new workflow.
  2. Copy the test webhook URL that n8n generates.
  3. Open Webhooks in the dibales.ai dashboard (cs.pake.ai), create a new webhook:
    • Paste the URL.
    • Select the Instagram events you want to receive.
    • Save. The dashboard shows a Webhook Secret once.
  4. (Recommended) Copy the Webhook Secret into the node's "Webhook Secret" field for HMAC-SHA256 verification.
  5. Add one or more Triggers in the matcher — each rule gets its own internal index and routes the matched event out through the Match port. Unmatched events leave through No Match.
  6. Wire Match → dibales.ai - Instagram (operation: Send Buttons or Send Text). For multi-level menus, wire each button output of a Send Buttons node to another Send Buttons node — postback routing happens automatically by walking the workflow graph.

Nodes

dibales.ai - Instagram Trigger

Single-webhook trigger with a per-rule matcher. Each entry in the Triggers collection is either:

  • User Comments on Post or Reel — pick a post/reel, choose "Any Comment" or filter by include/exclude keywords (case-insensitive).
  • User Sends a Direct Message — match DMs by exact text or substring against one or more keywords.

The first rule that matches wins; re-order entries to control precedence. Matched events leave on Match with a _trigger annotation ({ index, type }). Unmatched DMs and comments exit on No Match.

Postbacks and quick replies are a special case: they always pass through Match with a passthrough: true flag, because downstream Send Buttons / Send Text (with quick replies) nodes need them to decode and route the click.

Forward Events (opt-in passive event ports)

The Forward Events parameter (multi-checkbox) lets you surface three passive event types on dedicated output ports:

Option Event type Use case
Outbound Echo instagram.message.echo Log outbound messages, sync to CRM
Reactions instagram.message.reaction Tag engaged users, trigger follow-ups
Read Receipts instagram.message.read Schedule unread follow-ups

Each checked option adds an output port between Match and No Match, in declaration order (Echo → Reactions → Reads).

Port layout examples:

Forward Events selected Output ports
(none — default) Match, No Match
Reactions Match, Reactions, No Match
Echo + Read Match, Echo, Reads, No Match
All three Match, Echo, Reactions, Reads, No Match

Routing rules (full)

  • message.received / comment.created matching a rule → Match (with _trigger: { index, type })
  • message.received / comment.created not matching any rule → No Match
  • message.postback / message.quick_reply → Match (with _trigger: { passthrough: true })
  • message.echo / message.reaction / message.read → dedicated port if opted in; otherwise dropped silently (HTTP 200, no workflow emission)
  • Everything else (story.reply, story.mention, live_comment.created, unknown event types) → dropped silently

"Drop silently" means the node returns HTTP 200 OK to the dibales.ai backend (no retry) but does not emit on any output. No Match therefore has a single clean meaning: "the user sent content that didn't match any rule." Wire a default-reply Send Text to it without worrying about misfiring on reactions or read receipts.

dibales.ai - Instagram

Single action node for all Instagram outbound calls. Pick the Operation in the node panel:

Recipient Mode (Send Text / Send Buttons / Send Attachment)

All three Send operations expose a Recipient Mode selector with two choices:

  • User ID (Direct Message) — default. Send a regular DM addressed by IGSID. Auto-extracts from upstream DM / postback / quick-reply events.
  • Comment ID (Private Reply) — send the message as a "private reply" to a comment author. Backend posts to Meta with to.comment_id; Meta delivers the DM to the comment author. Auto-extracts from upstream instagram.comment.created events.

Use Comment ID only at the entry of a comment-triggered flow. Once the user is in DM context (after the first reply), subsequent menu / follow-up nodes should switch back to User ID mode — postback events don't carry a comment ID.

Operation: Send Text

Send a plain text DM. Recipient is auto-extracted from the upstream event by default. Optionally attach up to 13 Quick Replies — each chip becomes its own output port and fires when tapped (chips disappear after one tap).

Operation: Send Buttons

Send a button template (1–3 buttons). Each Postback button gets its own output port; Web URL buttons open a link and have no port. The node runs in one of three modes per execution:

  • SEND — initial event or an upstream Send Buttons just routed a click here. Delivers the template via the public API.
  • ROUTE — an inbound postback's encoded payload addresses this node. Emits on the matching button output with a _routed marker so downstream Send Buttons can detect "this click is for me" and fall through to SEND for the next page.
  • FORWARD — the postback belongs to a descendant Send Buttons reachable through one of this node's button outputs. Walks the workflow graph and re-emits on the right output with _forward: true so intermediate nodes (Set, IF, HTTP, etc.) can skip themselves during routing passes.

The net effect: wire button output → next Send Buttons → its button output → another Send Buttons, and the multi-level menu works without any manual postback fan-out.

Operation: Send Attachment

Send a media DM by public URL. Type picks the matching API endpoint: Image (JPG/PNG/GIF), Video (MP4), Audio (MP3/M4A/OGG), or File (PDF/document).

Operation: Reply to a Comment

Post a public reply to a comment. Comment ID auto-extracts from upstream instagram.comment.created events.

Operation: Hide / Unhide a Comment

Hide a comment from public view (only the author still sees it) or restore a previously-hidden one. Reversible — use for moderating spam, abuse, or off-topic replies. Comment ID auto-extracts from the upstream event.

Operation: Delete a Comment

Permanently delete a comment. The author is NOT notified, but the action is irreversible — prefer Hide for cases where you may want to undo. Comment ID auto-extracts from the upstream event.

Operation: Get Profile

Look up an Instagram user's public profile. Pick which fields to fetch from: name, username, profile_pic, follower_count, is_user_follow_business, is_business_follow_user, is_verified_user. Defaults to name + username.

Some fields (follower count, follow flags, verified) are only populated for business / professional accounts and may return null for personal accounts.

Operation: Check If User Is Following

Convenience wrapper around Get Profile that requests only is_user_follow_business. Has two output ports for direct branching:

  • Yes — Meta confirmed the user follows the business account.
  • No — Meta said they don't, OR returned null (e.g. personal account where the flag isn't available).

Each item still carries { user_id, is_following, raw } so you have full context downstream. If you need to distinguish "definitely not following" from "couldn't determine", use Get Profile with is_user_follow_business and inspect the field yourself.

Credential: dibales.ai API

One credential powers every action node in this package. Configure once.

Field Description
Host URL Base URL with /v1 suffix. Default: https://public-api.dibales.ai/v1.
API Key Personal access token from cs.pake.ai scoped to a specific agent.

If you also install n8n-nodes-pake-ai, both packages declare a dibales.ai API credential — they are independent (configure each, even though the values can be identical).

Deduplication

Webhook events may be delivered more than once. Each delivery carries a unique event_id in both the envelope and the X-Dibales-Event-Id header — use that as a dedup key downstream (e.g. upsert into a database).

Security

When a Webhook Secret is configured, the request body is verified against X-Dibales-Signature (format: sha256=<hex>, HMAC-SHA256). Mismatch → HTTP 401, workflow does not run.

Development

npm test           # run Jest unit tests
npm run dev        # tsc watch
npm run build      # tsc + copy SVG assets

Discussion