Toingg Ops Toolkit
This skill bundles everything needed to manage Toingg campaigns from Claw:
- Campaign creation via
create_campaign.py
- Campaign discovery via
fetch_campaigns.py when you need to list active IDs for users
- On-demand calls via
make_call.py (after collecting name, phone, and campaign)
- Optional analytics cron (7 PM daily) powered by
get_campaign_analytics.py
- Contact upload + WhatsApp broadcast using
xlsx_to_contacts.py, add_contacts.py, and send_whatsapp_templates.py
All HTTP calls reuse the TOINGG_API_TOKEN bearer token.
Setup
- Export your token in every environment that runs these scripts (gateway, cron, terminals).
export TOINGG_API_TOKEN="tg_..."
- Install Python deps once if you will ingest Excel files:
pip install openpyxl requests
- Keep payloads (campaign JSON, analytics snapshots, contact exports) in version control or shared storage per your security rules.
Campaign discovery workflow
Use this whenever the user wants to see active campaigns or needs a campaign ID before launching a call.
- Ask whether they already know the campaign ID. If not, offer to fetch the latest list (default pagination is fine unless they request a different page size).
- Run:
./scripts/fetch_campaigns.py --skip 0 --limit 10 --sort -1 > responses/campaigns-$(date +%s).json
Adjust --skip/--limit/--sort if the user needs deeper pages or a different ordering.
- Summarize the response back to the user: surface at least
campID, name, status, and any relevant dates so they can choose confidently.
- Store the JSON output when ongoing work depends on the snapshot.
On-demand call workflow
When the user asks you to place a call, gather three pieces of information before touching the API:
- Caller name (string shown in Toingg logs).
- Phone number in international format.
- Campaign selection. If they do not supply a campaign, ask whether they want the latest list. Use the campaign discovery workflow above to provide options, then confirm their pick.
Once those details are confirmed, trigger the API:
./scripts/make_call.py "Recipient Name" +919999999999 64fd3f9...
The helper always sends asr=AZURE, startMessage=true, clearMemory=false, and extraParams={} per the product team’s defaults. Echo the API response (success or failure) back to the user so they know the call status.
Campaign creation workflow
- Gather campaign fields from the user (title, voice, language, script, purpose, tone,
post-call schema, notification numbers, autopilot flags, etc.).
- Draft a payload JSON using
references/payload-template.md as the scaffold.
- Run the helper:
cd skills/toingg-create-campaign
./scripts/create_campaign.py payloads/my_campaign.json > responses/create-$(date +%s).json
- Return the API response (campaign ID, status, or validation errors) to the user and log it.
Opt-in analytics cron (7 PM daily)
Only offer this when the user explicitly asks for daily analytics.
- Confirm desired schedule/output directory.
- Follow
references/analytics-cron.md to create openclaw cron create toingg-analytics-digest ... with the provided command snippet. Adjust paths if needed.
- Double-check
TOINGG_API_TOKEN is visible to the gateway before enabling the cron.
- After the first run, share where the JSON snapshots live and how to disable the cron (
openclaw cron delete ...).
get_campaign_analytics.py can also be run ad-hoc for on-demand pulls:
./scripts/get_campaign_analytics.py > analytics.json
Contact upload + WhatsApp templates
When a user supplies an Excel sheet (name / phone / context columns) and wants to blast a WhatsApp template:
Convert Excel → JSON
./scripts/xlsx_to_contacts.py ~/Downloads/leads.xlsx contacts.json
See references/contact-workflow.md for the exact column expectations and troubleshooting. The script skips blank rows and normalizes phone numbers.
Upload contacts to a Toingg contact list (auto-creates if missing):
./scripts/add_contacts.py ClawTest contacts.json
Send WhatsApp templates once the list is ready:
./scripts/send_whatsapp_templates.py \
231565687 \
bfesfbgf \
en-US \
ClawTest \
--payload template-variables.json
- Omit
--payload (defaults to []) if the template has no variables.
- Pass
--resend only when the user explicitly wants to re-contact existing recipients.
Confirm delivery status in Toingg and report any errors back to the user (the helper prints full JSON responses for logging).
File map
| Script |
Purpose |
scripts/create_campaign.py |
POST /api/v3/create_campaign with arbitrary payloads |
scripts/fetch_campaigns.py |
GET /api/v3/get_campaigns for quick campaign listings |
scripts/make_call.py |
POST /api/v3/make_call once you have name/phone/campaign |
scripts/get_campaign_analytics.py |
GET /api/v3/get_campaign_analytics (cron-friendly) |
scripts/xlsx_to_contacts.py |
Convert Excel sheets into Toingg contact JSON |
scripts/add_contacts.py |
Upload contact lists via /api/v3/add_contacts |
scripts/send_whatsapp_templates.py |
Trigger /api/v3/send_whatsapp_templates |
Keep this toolkit lightweight: update the references when Toingg adds new fields or workflows so other operators can follow the same patterns.
1---2name: toingg-create-campaign3description: End-to-end Toingg ops: create campaigns, (optionally) schedule daily analytics pulls, and turn Excel contact sheets into WhatsApp outreach via add_contacts + send_whatsapp_templates. Use when Codex needs to automate Toingg voice/WhatsApp workflows and requires scripts for campaign POSTs, analytics cron setup, or bulk contact uploads.4---5
6
7# Toingg Ops Toolkit
8
9This skill bundles everything needed to manage Toingg campaigns from Claw:
10
11- **Campaign creation** via `create_campaign.py`
12- **Campaign discovery** via `fetch_campaigns.py` when you need to list active IDs for users
13- **On-demand calls** via `make_call.py` (after collecting name, phone, and campaign)
14- **Optional analytics cron** (7 PM daily) powered by `get_campaign_analytics.py`
15- **Contact upload + WhatsApp broadcast** using `xlsx_to_contacts.py`, `add_contacts.py`, and `send_whatsapp_templates.py`
16
17All HTTP calls reuse the `TOINGG_API_TOKEN` bearer token.
18
19## Setup
20
211. Export your token in every environment that runs these scripts (gateway, cron, terminals).
22 ```bash
23 export TOINGG_API_TOKEN="tg_..."
24 ```
252. Install Python deps once if you will ingest Excel files:
26 ```bash
27 pip install openpyxl requests
28 ```
293. Keep payloads (campaign JSON, analytics snapshots, contact exports) in version control or shared storage per your security rules.
30
31## Campaign discovery workflow
32
33Use this whenever the user wants to see active campaigns or needs a campaign ID before launching a call.
34
351. Ask whether they already know the campaign ID. If not, offer to fetch the latest list (default pagination is fine unless they request a different page size).
362. Run:
37 ```bash
38 ./scripts/fetch_campaigns.py --skip 0 --limit 10 --sort -1 > responses/campaigns-$(date +%s).json
39 ```
40 Adjust `--skip/--limit/--sort` if the user needs deeper pages or a different ordering.
413. Summarize the response back to the user: surface at least `campID`, `name`, status, and any relevant dates so they can choose confidently.
424. Store the JSON output when ongoing work depends on the snapshot.
43
44## On-demand call workflow
45
46When the user asks you to place a call, gather *three* pieces of information before touching the API:
47
481. **Caller name** (string shown in Toingg logs).
492. **Phone number** in international format.
503. **Campaign selection.** If they do not supply a campaign, ask whether they want the latest list. Use the campaign discovery workflow above to provide options, then confirm their pick.
51
52Once those details are confirmed, trigger the API:
53
54```bash
55./scripts/make_call.py "Recipient Name" +919999999999 64fd3f9...
56```
57
58The helper always sends `asr=AZURE`, `startMessage=true`, `clearMemory=false`, and `extraParams={}` per the product team’s defaults. Echo the API response (success or failure) back to the user so they know the call status.
59
60## Campaign creation workflow
61
621. Gather campaign fields from the user (title, voice, language, script, purpose, tone,
63 post-call schema, notification numbers, autopilot flags, etc.).
642. Draft a payload JSON using [`references/payload-template.md`](references/payload-template.md) as the scaffold.
653. Run the helper:
66 ```bash
67 cd skills/toingg-create-campaign
68 ./scripts/create_campaign.py payloads/my_campaign.json > responses/create-$(date +%s).json
69 ```
704. Return the API response (campaign ID, status, or validation errors) to the user and log it.
71
72## Opt-in analytics cron (7 PM daily)
73
74Only offer this when the user explicitly asks for daily analytics.
75
761. Confirm desired schedule/output directory.
772. Follow [`references/analytics-cron.md`](references/analytics-cron.md) to create `openclaw cron create toingg-analytics-digest ...` with the provided command snippet. Adjust paths if needed.
783. Double-check `TOINGG_API_TOKEN` is visible to the gateway before enabling the cron.
794. After the first run, share where the JSON snapshots live and how to disable the cron (`openclaw cron delete ...`).
80
81`get_campaign_analytics.py` can also be run ad-hoc for on-demand pulls:
82```bash
83./scripts/get_campaign_analytics.py > analytics.json
84```
85
86## Contact upload + WhatsApp templates
87
88When a user supplies an Excel sheet (name / phone / context columns) and wants to blast a WhatsApp template:
89
901. **Convert Excel → JSON**
91 ```bash
92 ./scripts/xlsx_to_contacts.py ~/Downloads/leads.xlsx contacts.json
93 ```
94 See [`references/contact-workflow.md`](references/contact-workflow.md) for the exact column expectations and troubleshooting. The script skips blank rows and normalizes phone numbers.
95
962. **Upload contacts** to a Toingg contact list (auto-creates if missing):
97 ```bash
98 ./scripts/add_contacts.py ClawTest contacts.json
99 ```
100
1013. **Send WhatsApp templates** once the list is ready:
102 ```bash
103 ./scripts/send_whatsapp_templates.py \
104 231565687 \
105 bfesfbgf \
106 en-US \
107 ClawTest \
108 --payload template-variables.json
109 ```
110 - Omit `--payload` (defaults to `[]`) if the template has no variables.
111 - Pass `--resend` only when the user explicitly wants to re-contact existing recipients.
112
1134. Confirm delivery status in Toingg and report any errors back to the user (the helper prints full JSON responses for logging).
114
115## File map
116
117| Script | Purpose |
118|--------|---------|
119| `scripts/create_campaign.py` | POST `/api/v3/create_campaign` with arbitrary payloads |
120| `scripts/fetch_campaigns.py` | GET `/api/v3/get_campaigns` for quick campaign listings |
121| `scripts/make_call.py` | POST `/api/v3/make_call` once you have name/phone/campaign |
122| `scripts/get_campaign_analytics.py` | GET `/api/v3/get_campaign_analytics` (cron-friendly) |
123| `scripts/xlsx_to_contacts.py` | Convert Excel sheets into Toingg contact JSON |
124| `scripts/add_contacts.py` | Upload contact lists via `/api/v3/add_contacts` |
125| `scripts/send_whatsapp_templates.py` | Trigger `/api/v3/send_whatsapp_templates` |
126
127Keep this toolkit lightweight: update the references when Toingg adds new fields or workflows so other operators can follow the same patterns.