Skip to main content
The CLI covers the outbound WhatsApp surface: templates (reusable HSM messages that Meta must approve to send outside the 24-hour window) and campaigns (bulk sends to recipient lists using an approved template).
The --bot-id these commands ask for is the referenceId that appears in jelou channels list --type Whatsapp.

jelou channels testers

Before connecting a real WhatsApp Business number, you can use the shared Jelou sandbox to test sending and receiving messages with your own phone.
<channel-id> is the channel’s own id, not the --bot-id/referenceId used by template and campaign. It only applies to sandbox channels — once you connect a real WhatsApp Business number, the tester whitelist is no longer needed. The phone must be in E.164 format (+14155550100).

jelou template

Categories: UTILITY, MARKETING, AUTHENTICATION. Statuses: APPROVED, PENDING, REJECTED. Content types (--type): text (default), IMAGE, VIDEO, DOCUMENT, CAROUSEL. Use --header to add a text header, and {{1}}, {{2}}, … as placeholders in the body. Just like campaign create, --from-file takes the path to a JSON file with the full template payload instead of passing every flag individually.
Only APPROVED or REJECTED templates can be edited; PENDING ones are locked. Templates without --draft go to Meta immediately, and the approval quota is finite per company (rejections count). Meta prepends a random 4-character prefix to the elementName — use the returned elementName (with prefix) in campaigns.

Updating a template

jelou template update only accepts discrete flags: --display-name, --template, --header, --footer, --media-url, and --draft. The CLI fetches the template’s current state, applies only the overrides you pass, and PATCHes the full payload — you don’t need to repeat fields that stay the same.

Header with media

jelou campaign

--type filters by campaign type (text, carousel, …), --name by the template’s display name, and --element-name by its elementName. Statuses: SCHEDULEDIN_PROGRESSCOMPLETED; CANCELLED is terminal unless you use --revive.
--start-at and --end-at filter by the campaign’s creation date (createdAt), not its scheduled send date (scheduledAt). If you’re looking for “campaigns scheduled for next week”, these filters won’t get you there — they return campaigns created in that range, regardless of when they’re scheduled to send.

Campaign file structure

campaign.json
recipients.csv
The CSV includes a phone column in E.164 format. The parameter mapping is explicit: { "param": <n>, "column": "<column>" }. Use the date field to schedule (omit it for immediate sending).
A campaign consumes real credits when dispatched. Review the recipient count and cost before creating it. A wrong parameter mapping sends the literal placeholder text (Hi {{1}}) to thousands of people — verify first. Cancelling an IN_PROGRESS campaign produces a partial send.