@funnelchat-hq/n8n-nodes-funnelchat 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -35
- package/dist/nodes/Funnelchat/description.js +3 -3
- package/dist/nodes/Funnelchat/description.js.map +1 -1
- package/dist/nodes/Funnelchat/generated/operations.js +755 -32
- package/dist/nodes/Funnelchat/generated/operations.js.map +1 -1
- package/dist/nodes/Funnelchat/operationTypes.d.ts +2 -0
- package/dist/package.json +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,13 +16,15 @@ know when they are read, receive messages and work with your groups, from your w
|
|
|
16
16
|
of the result: the page shows a QR code. Scan it with WhatsApp on your phone (**Linked devices**). The number's `id`
|
|
17
17
|
is then in **List numbers**, and in **Get a connect link** (`device_id`).
|
|
18
18
|
5. **Send a message and know when it was read**: a workflow with two nodes.
|
|
19
|
-
- **Funnelchat**: **Conversations and Messages → Send a message**. **Number ID**: your number's `id`. **
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
- **Funnelchat**: **Conversations and Messages → Send a message**. **Number ID**: your number's `id`. **Phone**:
|
|
20
|
+
the recipient's, with the country code (`5491100000000`). No need to create the contact first: if the phone is
|
|
21
|
+
new, Funnelchat creates it in your key's workspace (that takes `conversations:write`). **Additional Fields**:
|
|
22
|
+
**Text** `Hello!` and **Client Reference** `order-981`.
|
|
22
23
|
- **Funnelchat Trigger**: **Event Names or IDs**: Message status changed (`message.status_changed`).
|
|
23
24
|
|
|
24
25
|
Activate the workflow (that subscribes the trigger) and click **Execute step** on the **Funnelchat** node. The send
|
|
25
|
-
answers at once with the message in `status: "queued"`. Then the trigger starts once per
|
|
26
|
+
answers at once with the message in `status: "queued"` and its `contact_id`. Then the trigger starts once per
|
|
27
|
+
status, `sent`,
|
|
26
28
|
`delivered` and `read` (or `failed`, with its `error`), with your `client_reference` and your workspace:
|
|
27
29
|
|
|
28
30
|
```json
|
|
@@ -46,7 +48,9 @@ know when they are read, receive messages and work with your groups, from your w
|
|
|
46
48
|
```
|
|
47
49
|
|
|
48
50
|
The trigger needs n8n reachable from the internet over `https` (in self-hosted n8n, `WEBHOOK_URL`): see
|
|
49
|
-
[What you need](#what-you-need).
|
|
51
|
+
[What you need](#what-you-need). With an official WhatsApp number, the first message to a new contact has to be a
|
|
52
|
+
template (**Templates → Send a template**, with the same **Phone**): a free message only goes out within 24 hours
|
|
53
|
+
of the contact's last message. A number connected by QR has no such rule.
|
|
50
54
|
|
|
51
55
|
<details><summary>The same two nodes, to paste on the canvas (then choose your credential in both)</summary>
|
|
52
56
|
|
|
@@ -62,7 +66,7 @@ know when they are read, receive messages and work with your groups, from your w
|
|
|
62
66
|
"resource": "conversation",
|
|
63
67
|
"operation": "message.sendMessage",
|
|
64
68
|
"device_id": "4",
|
|
65
|
-
"
|
|
69
|
+
"phone": "5491100000000",
|
|
66
70
|
"additionalFields": { "text": "Hello!", "client_reference": "order-981" }
|
|
67
71
|
}
|
|
68
72
|
},
|
|
@@ -81,9 +85,11 @@ know when they are read, receive messages and work with your groups, from your w
|
|
|
81
85
|
</details>
|
|
82
86
|
|
|
83
87
|
**What the key needs** for all of this: `accounts:read` (list numbers, and the credential test), `accounts:operate`
|
|
84
|
-
(connect a number), `conversations:write` (
|
|
85
|
-
`conversations:
|
|
86
|
-
|
|
88
|
+
(connect a number), `conversations:write` (sending to a phone that is not a contact yet creates the contact, as
|
|
89
|
+
**Create or update a contact** does; it includes `conversations:send`, and without it that send answers `403`),
|
|
90
|
+
`conversations:read`, `webhooks:read` and `webhooks:write` (the trigger on message events). Sending to a phone or a
|
|
91
|
+
contact you already have, in your key's workspace, only needs `conversations:send`. A key with full access has them
|
|
92
|
+
all.
|
|
87
93
|
|
|
88
94
|
### Receive messages
|
|
89
95
|
|
|
@@ -95,13 +101,22 @@ disconnect with **Number connected** (`device.connected`) and **Number disconnec
|
|
|
95
101
|
|
|
96
102
|
### Groups
|
|
97
103
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
Everything starts from your number, without the panel:
|
|
105
|
+
|
|
106
|
+
1. **Groups → List the groups a number manages** (**Number ID**): the number's WhatsApp groups, read live (with a key
|
|
107
|
+
the list is reused for one minute). Each one brings its `uid`; the ones already in your account also bring
|
|
108
|
+
`device_id`. Your account's groups are in **Groups → List groups**.
|
|
109
|
+
2. **Groups → Send a message to a group**: **Group UID** (from that list), **Number ID** (connected, and an admin of
|
|
110
|
+
the group if it is a QR number), **Type** `text` and **Additional Fields → Text**. A group that is not in your
|
|
111
|
+
account yet is imported first. It answers at once with an `action_id`; **Groups → Get a group action** says how it
|
|
112
|
+
went, and so do the `group_action.completed` and `group_action.failed` events.
|
|
113
|
+
3. **Groups → Follow a group** (**Group UID**, **Number ID**) to know who joins and who leaves without writing to it:
|
|
114
|
+
it imports the group (QR numbers only), and from then on a **Funnelchat Trigger** with **Participant joined**
|
|
115
|
+
(`group_participant.joined`) and **Participant left** (`group_participant.left`) receives them.
|
|
116
|
+
|
|
117
|
+
The key needs `communities:read` to list and receive the events, `communities:send` to send, and
|
|
118
|
+
`communities:operate` to import a group, which is what following it, or writing to one not yet in your account, does
|
|
119
|
+
(without it, `403 import_permission_required`). A number imports up to 5 groups per minute.
|
|
105
120
|
|
|
106
121
|
### Workspaces
|
|
107
122
|
|
|
@@ -159,10 +174,10 @@ git clone https://github.com/Funnelchat20/n8n-nodes-funnelchat.git
|
|
|
159
174
|
cd n8n-nodes-funnelchat
|
|
160
175
|
npm ci
|
|
161
176
|
npm run build
|
|
162
|
-
npm pack # creates funnelchat-hq-n8n-nodes-funnelchat-0.2.
|
|
177
|
+
npm pack # creates funnelchat-hq-n8n-nodes-funnelchat-0.2.1.tgz
|
|
163
178
|
```
|
|
164
179
|
|
|
165
|
-
Then, in n8n's nodes folder, `npm install /path/to/funnelchat-hq-n8n-nodes-funnelchat-0.2.
|
|
180
|
+
Then, in n8n's nodes folder, `npm install /path/to/funnelchat-hq-n8n-nodes-funnelchat-0.2.1.tgz`.
|
|
166
181
|
|
|
167
182
|
## Credential
|
|
168
183
|
|
|
@@ -224,7 +239,7 @@ The node can also be used as a tool of an n8n AI agent.
|
|
|
224
239
|
|
|
225
240
|
<!-- operations:start (generated by npm run generate) -->
|
|
226
241
|
|
|
227
|
-
|
|
242
|
+
154 operations generated from the specification (sha256 `0ffaad2b2573`) and its supplements. The ones marked ⚠ show a notice in the node (what the code requires and the specification does not say, a route closed to keys, or an irreversible operation).
|
|
228
243
|
|
|
229
244
|
<details><summary><strong>Contacts</strong> (15)</summary>
|
|
230
245
|
|
|
@@ -341,21 +356,36 @@ The node can also be used as a tool of an n8n AI agent.
|
|
|
341
356
|
|
|
342
357
|
</details>
|
|
343
358
|
|
|
344
|
-
<details><summary><strong>Groups</strong> (
|
|
359
|
+
<details><summary><strong>Groups</strong> (31)</summary>
|
|
345
360
|
|
|
346
361
|
| Operation | Route | Permission |
|
|
347
362
|
|---|---|---|
|
|
348
363
|
| List groups "return all" | `GET /api/v1/groups` | `communities:read` |
|
|
349
|
-
| List the groups a number manages "return all" | `GET /api/v1/devices/{device}/groups` | `communities:read` |
|
|
364
|
+
| List the groups a number manages ⚠ "return all" | `GET /api/v1/devices/{device}/groups` | `communities:read` |
|
|
350
365
|
| List a number's announcement groups "return all" | `GET /api/v1/devices/{device}/ad-groups` | `communities:read` |
|
|
351
366
|
| List a number's channels "return all" | `GET /api/v1/devices/{device}/channels` | `communities:read` |
|
|
352
367
|
| Get a group's current data on WhatsApp | `GET /api/v1/groups/{groupUid}/metadata` | `communities:read` |
|
|
368
|
+
| Follow a group ⚠ | `POST /api/v1/groups/{group}/import` | `communities:operate` |
|
|
353
369
|
| Get a group | `GET /api/v1/groups/{group}` | `communities:read` |
|
|
354
370
|
| List the session actions on a group "return all" | `GET /api/v1/groups/{group}/actions` | `communities:read` |
|
|
355
371
|
| List the messages sent to a group "return all" | `GET /api/v1/groups/{group}/messages` | `communities:read` |
|
|
356
372
|
| List the scheduled sends that include a group "return all" | `GET /api/v1/groups/{group}/scheduled-messages` | `communities:read` |
|
|
373
|
+
| Create a group ⚠ | `POST /api/v1/groups` | `communities:operate` |
|
|
357
374
|
| Send a message to a group ⚠ | `POST /api/v1/groups/{group}/messages` | `communities:send` |
|
|
358
375
|
| Get a group action ⚠ | `GET /api/v1/groups/actions/{action}` | `communities:read` |
|
|
376
|
+
| Add participants to a group ⚠ | `POST /api/v1/groups/{group}/participants` | `communities:operate` |
|
|
377
|
+
| Remove participants from a group ⚠ | `POST /api/v1/groups/{group}/participants/remove` | `communities:operate` |
|
|
378
|
+
| Make participants admins ⚠ | `POST /api/v1/groups/{group}/admins` | `communities:operate` |
|
|
379
|
+
| Remove the admin role ⚠ | `POST /api/v1/groups/{group}/admins/remove` | `communities:operate` |
|
|
380
|
+
| Rename a group ⚠ | `PUT /api/v1/groups/{group}/name` | `communities:operate` |
|
|
381
|
+
| Change a group's description ⚠ | `PUT /api/v1/groups/{group}/description` | `communities:operate` |
|
|
382
|
+
| Change a group's photo ⚠ | `PUT /api/v1/groups/{group}/photo` | `communities:operate` |
|
|
383
|
+
| Change who can write in a group ⚠ | `PUT /api/v1/groups/{group}/settings` | `communities:operate` |
|
|
384
|
+
| Renew a group's invite link ⚠ | `POST /api/v1/groups/{group}/invite-link/renew` | `communities:operate` |
|
|
385
|
+
| Get a group's live invite link ⚠ | `GET /api/v1/groups/{group}/invite-link/live` | `communities:read` |
|
|
386
|
+
| List a group's join requests ⚠ | `GET /api/v1/groups/{group}/join-requests` | `communities:read` |
|
|
387
|
+
| Approve join requests ⚠ | `POST /api/v1/groups/{group}/join-requests/approve` | `communities:operate` |
|
|
388
|
+
| Reject join requests ⚠ | `POST /api/v1/groups/{group}/join-requests/reject` | `communities:operate` |
|
|
359
389
|
| List a campaign's participants "return all" | `GET /api/v1/campaigns/{campaign}/participants` | `communities:read` |
|
|
360
390
|
| List participants with their current group "return all" | `GET /api/v1/campaigns/{campaign}/campaign-participants` | `communities:read` |
|
|
361
391
|
| List a campaign's joins and leaves "return all" | `GET /api/v1/campaigns/{campaign}/participant-events` | `communities:read` |
|
|
@@ -517,11 +547,9 @@ than 300 seconds away from n8n's clock: keep the server's clock in sync. The cod
|
|
|
517
547
|
|
|
518
548
|
1. **Funnelchat Trigger** — Events: "Message received (message.received)".
|
|
519
549
|
2. **If** (optional) — continue only if `{{ $json.data.message.type }}` is `text`.
|
|
520
|
-
3. **Funnelchat** — resource "Conversations and Messages", operation "Send a message
|
|
521
|
-
- Contact ID (in the route and in the body): `{{ $json.data.contact.id }}`
|
|
550
|
+
3. **Funnelchat** — resource "Conversations and Messages", operation "Send a message":
|
|
522
551
|
- Number ID: `{{ $json.data.device_id }}` (it may be `null`; then, the ID from "Numbers → List numbers").
|
|
523
|
-
-
|
|
524
|
-
must be the contact's: otherwise, `422 recipient_mismatch`.
|
|
552
|
+
- Phone: `{{ $json.data.contact.phone }}` (with or without `+`).
|
|
525
553
|
- Additional Fields → Text: `Thanks for writing to us! We will get back to you shortly.`
|
|
526
554
|
|
|
527
555
|
Reply within the contact's 24-hour window: outside it, WhatsApp requires a template ("Templates → Send a template") and
|
|
@@ -599,7 +627,7 @@ its README. By default it listens on `http://localhost:4010`.
|
|
|
599
627
|
`npx @funnelchat-hq/sandbox --require-https`).
|
|
600
628
|
|
|
601
629
|
The end-to-end tests (`npm run test:e2e`, see [Development](#development)) passed on 2026-11-04 against the sandbox
|
|
602
|
-
`0.2.0` (`main` @ `b3b4513`): the first use of
|
|
630
|
+
`0.2.0` (`main` @ `b3b4513`): the first use of 0.2.0 (**Send a message** to a contact and the trigger up to `read`, with the
|
|
603
631
|
`client_reference`), a number created by QR, its QR and `device.connected` through the trigger, a connect link
|
|
604
632
|
created, read, listed by reference and revoked, the group participant events, sending and reading a message, file by
|
|
605
633
|
URL, `X-Request-Id` in errors, and a WhatsApp form created, published, sent and completed through the trigger. By
|
|
@@ -634,7 +662,7 @@ What changes on its own, without touching code: new operations, permissions, fie
|
|
|
634
662
|
`fieldDefaults` (the option shown first) and `extraParameters` (query fields the code reads and the specification
|
|
635
663
|
does not list).
|
|
636
664
|
- **Supplements.** `spec/supplements/` has what the specification does not have yet: from conversations, the WhatsApp
|
|
637
|
-
forms and the poll and event invitation, which the node keeps
|
|
665
|
+
forms and the poll and event invitation, which the node keeps.
|
|
638
666
|
They are written in English. If a new specification includes a route of a supplement, the generator uses the
|
|
639
667
|
specification's and says the supplement is no longer needed: remove it from the config then. A supplement with
|
|
640
668
|
`"replaces": true` wins over the specification instead, with the same `operationId`; none has it today.
|
|
@@ -678,13 +706,13 @@ npm run dev # starts n8n on http://localhost:5678 with the nod
|
|
|
678
706
|
|
|
679
707
|
## Sources and what is left to verify
|
|
680
708
|
|
|
681
|
-
| What | Where it comes from
|
|
682
|
-
| ------------------------------------------------------- |
|
|
683
|
-
| The full unified specification (most operations) | developers-portal `main` @ `
|
|
684
|
-
| WhatsApp forms, poll and event invitation | conversations tag `v1.18.10`, read from the code and checked again against `v1.19.7` (production); the 15-10 copy of the specification
|
|
685
|
-
| A message to a group, and the group
|
|
686
|
-
| The trigger's fallback event catalog | accounts tag `v1.5.97`, extracted from the code
|
|
687
|
-
| The signature algorithm and vectors, the event envelope | developers-portal (`snippets/verificar-firma.js`, `tests/test_firmas.py`)
|
|
688
|
-
| The local sandbox of "Testing with the sandbox" | funnelchat-sandbox `0.2.0` (`main` @ `b3b4513`)
|
|
709
|
+
| What | Where it comes from | Status on 2026-11-04 |
|
|
710
|
+
| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
711
|
+
| The full unified specification (most operations) | developers-portal `main` @ `99928866` (`v0.6.3`), with the snapshots of accounts `v1.5.97`, conversations `v1.19.21` and communities `v2.35.7` | The versions in production on 2026-11-05: sending by phone (conversations `v1.19.21`) and following a group (communities `v2.35.7`) |
|
|
712
|
+
| WhatsApp forms, poll and event invitation | conversations tag `v1.18.10`, read from the code and checked again against `v1.19.7` (production); the 15-10 copy of the specification | Forms open to API keys, routed by api-edge; the portal leaves them out (its edge table is from 13-10). Poll and event are still closed to keys. `operationId`s of the forms not checked against a generated specification |
|
|
713
|
+
| A message to a group, and the other group actions | The specification (communities `v2.35.5`) | Open to API keys in production (`communities:send` to send, `communities:operate` to act on a group) |
|
|
714
|
+
| The trigger's fallback event catalog | accounts tag `v1.5.97`, extracted from the code | 59 types, 54 being emitted; every event carries `data.workspace_id` |
|
|
715
|
+
| The signature algorithm and vectors, the event envelope | developers-portal (`snippets/verificar-firma.js`, `tests/test_firmas.py`) | Published |
|
|
716
|
+
| The local sandbox of "Testing with the sandbox" | funnelchat-sandbox `0.2.0` (`main` @ `b3b4513`) | No group messages nor `workspace_id` yet |
|
|
689
717
|
|
|
690
718
|
The details of each source are in [`spec/PROVENANCE.md`](spec/PROVENANCE.md).
|
|
@@ -5,7 +5,7 @@ exports.hasJsonBodyOption = hasJsonBodyOption;
|
|
|
5
5
|
exports.hasPagination = hasPagination;
|
|
6
6
|
exports.buildProperties = buildProperties;
|
|
7
7
|
function isTopLevel(param) {
|
|
8
|
-
return param.location === 'path' || param.required;
|
|
8
|
+
return param.location === 'path' || param.required || param.topLevel === true;
|
|
9
9
|
}
|
|
10
10
|
function hasJsonBodyOption(op) {
|
|
11
11
|
var _a;
|
|
@@ -138,7 +138,7 @@ function operationProperties(op) {
|
|
|
138
138
|
return props;
|
|
139
139
|
}
|
|
140
140
|
function buildProperties(resources, operations) {
|
|
141
|
-
var _a, _b, _c;
|
|
141
|
+
var _a, _b, _c, _d;
|
|
142
142
|
const defaultResource = (_b = (_a = resources[0]) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
|
|
143
143
|
const props = [
|
|
144
144
|
{
|
|
@@ -160,7 +160,7 @@ function buildProperties(resources, operations) {
|
|
|
160
160
|
.sort((a, b) => a.name.localeCompare(b.name, 'es'));
|
|
161
161
|
if (ops.length === 0)
|
|
162
162
|
continue;
|
|
163
|
-
const defaultOperation = (
|
|
163
|
+
const defaultOperation = (_c = resource.defaultOperation) !== null && _c !== void 0 ? _c : ((_d = ops.find((o) => o.list)) !== null && _d !== void 0 ? _d : ops[0]).value;
|
|
164
164
|
props.push({
|
|
165
165
|
displayName: 'Operation',
|
|
166
166
|
name: 'operation',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"description.js","sourceRoot":"","sources":["../../../nodes/Funnelchat/description.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"description.js","sourceRoot":"","sources":["../../../nodes/Funnelchat/description.ts"],"names":[],"mappings":"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"}
|