@cakemail-org/cakemail-cli 1.5.0 → 2.0.0
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/.claude/settings.local.json +12 -0
- package/.env.example +40 -0
- package/.env.test.example +45 -0
- package/CHANGELOG.md +1031 -0
- package/README.md +319 -15
- package/audit-formats.js +128 -0
- package/cakemail.rb +20 -0
- package/dist/cli.js +27 -10
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +16 -6
- package/dist/client.js.map +1 -1
- package/dist/commands/account.js +1 -1
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/attributes.js +1 -1
- package/dist/commands/attributes.js.map +1 -1
- package/dist/commands/campaigns.d.ts.map +1 -1
- package/dist/commands/campaigns.js +103 -8
- package/dist/commands/campaigns.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +63 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +91 -12
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/emails.js +1 -1
- package/dist/commands/emails.js.map +1 -1
- package/dist/commands/interests.d.ts +5 -0
- package/dist/commands/interests.d.ts.map +1 -0
- package/dist/commands/interests.js +172 -0
- package/dist/commands/interests.js.map +1 -0
- package/dist/commands/lists.d.ts.map +1 -1
- package/dist/commands/lists.js +6 -8
- package/dist/commands/lists.js.map +1 -1
- package/dist/commands/logs.d.ts +5 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +237 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/reports.js +1 -1
- package/dist/commands/reports.js.map +1 -1
- package/dist/commands/segments.js +1 -1
- package/dist/commands/segments.js.map +1 -1
- package/dist/commands/senders.d.ts.map +1 -1
- package/dist/commands/senders.js +11 -8
- package/dist/commands/senders.js.map +1 -1
- package/dist/commands/suppressed.js +1 -1
- package/dist/commands/suppressed.js.map +1 -1
- package/dist/commands/tags.d.ts +5 -0
- package/dist/commands/tags.d.ts.map +1 -0
- package/dist/commands/tags.js +124 -0
- package/dist/commands/tags.js.map +1 -0
- package/dist/commands/templates.js +1 -1
- package/dist/commands/templates.js.map +1 -1
- package/dist/commands/transactional-templates.d.ts +5 -0
- package/dist/commands/transactional-templates.d.ts.map +1 -0
- package/dist/commands/transactional-templates.js +354 -0
- package/dist/commands/transactional-templates.js.map +1 -0
- package/dist/commands/webhooks.js +1 -1
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/utils/auth.d.ts +8 -1
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +39 -11
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/config-file.d.ts +7 -0
- package/dist/utils/config-file.d.ts.map +1 -1
- package/dist/utils/config-file.js +15 -0
- package/dist/utils/config-file.js.map +1 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -4
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.js +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/list-defaults.d.ts +33 -0
- package/dist/utils/list-defaults.d.ts.map +1 -0
- package/dist/utils/list-defaults.js +52 -0
- package/dist/utils/list-defaults.js.map +1 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +36 -13
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/progress.d.ts.map +1 -1
- package/dist/utils/progress.js +32 -4
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/spinner.d.ts +17 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +43 -0
- package/dist/utils/spinner.js.map +1 -0
- package/docs/DOCUMENTATION-STANDARD.md +1068 -0
- package/docs/README.md +161 -0
- package/docs/developer/ARCHITECTURE.md +516 -0
- package/docs/developer/AUTH.md +204 -0
- package/docs/developer/CONTRIBUTING.md +227 -0
- package/docs/developer/DOCUMENTATION_SUMMARY.md +346 -0
- package/docs/developer/PROJECT_INDEX.md +365 -0
- package/docs/planning/API_COVERAGE.md +1045 -0
- package/docs/planning/BACKLOG.md +1159 -0
- package/docs/planning/PROFILE_SYSTEM_TASKS.md +287 -0
- package/docs/planning/UX_IMPLEMENTATION_PLAN.md +691 -0
- package/docs/planning/archive/RELEASE_CHECKLIST_v1.3.0.md +332 -0
- package/docs/planning/archive/RELEASE_v1.3.0.md +428 -0
- package/docs/planning/archive/cakemail-cli-ux-improvements.md +438 -0
- package/docs/planning/cakemail-profile-system-plan.md +1121 -0
- package/docs/testing/AI_USER_SIMULATION_DESIGN.md +1342 -0
- package/docs/testing/KENOGAMI_BIDIRECTIONAL_FLOW.md +1517 -0
- package/docs/testing/KENOGAMI_TRUTH_RECONCILIATION_SYSTEM.md +1369 -0
- package/docs/user-manual/.obsidian/app.json +1 -0
- package/docs/user-manual/.obsidian/appearance.json +1 -0
- package/docs/user-manual/.obsidian/core-plugins.json +33 -0
- package/docs/user-manual/.obsidian/workspace.json +167 -0
- package/docs/user-manual/01-getting-started/01-installation.md +214 -0
- package/docs/user-manual/01-getting-started/02-quick-start.md +432 -0
- package/docs/user-manual/01-getting-started/03-authentication.md +448 -0
- package/docs/user-manual/01-getting-started/04-configuration.md +430 -0
- package/docs/user-manual/01-getting-started/05-output-formats.md +447 -0
- package/docs/user-manual/02-core-concepts/01-accounts.md +514 -0
- package/docs/user-manual/02-core-concepts/02-profile-system.md +771 -0
- package/docs/user-manual/02-core-concepts/03-smart-defaults.md +485 -0
- package/docs/user-manual/02-core-concepts/04-authentication-methods.md +435 -0
- package/docs/user-manual/02-core-concepts/05-pagination-filtering.md +600 -0
- package/docs/user-manual/02-core-concepts/06-error-handling.md +718 -0
- package/docs/user-manual/02-core-concepts/07-api-coverage.md +483 -0
- package/docs/user-manual/03-email-operations/01-senders.md +490 -0
- package/docs/user-manual/03-email-operations/02-templates.md +444 -0
- package/docs/user-manual/03-email-operations/03-transactional-emails.md +706 -0
- package/docs/user-manual/03-email-operations/04-email-tracking.md +407 -0
- package/docs/user-manual/04-campaign-management/01-campaigns-basics.md +394 -0
- package/docs/user-manual/04-campaign-management/02-campaign-scheduling.md +630 -0
- package/docs/user-manual/04-campaign-management/03-campaign-testing.md +997 -0
- package/docs/user-manual/04-campaign-management/04-campaign-lifecycle.md +709 -0
- package/docs/user-manual/04-campaign-management/05-campaign-links.md +934 -0
- package/docs/user-manual/05-contact-management/01-lists.md +836 -0
- package/docs/user-manual/05-contact-management/02-contacts.md +1035 -0
- package/docs/user-manual/05-contact-management/03-custom-attributes.md +788 -0
- package/docs/user-manual/05-contact-management/04-segments.md +1028 -0
- package/docs/user-manual/05-contact-management/05-contact-import-export.md +1031 -0
- package/docs/user-manual/06-analytics-reporting/01-campaign-analytics.md +867 -0
- package/docs/user-manual/06-analytics-reporting/02-account-reports.md +227 -0
- package/docs/user-manual/07-integrations/01-webhooks-integration.md +259 -0
- package/docs/user-manual/07-integrations/02-automation.md +326 -0
- package/docs/user-manual/08-advanced-usage/01-scripting-patterns.md +672 -0
- package/docs/user-manual/08-advanced-usage/02-bulk-operations.md +932 -0
- package/docs/user-manual/08-advanced-usage/03-ci-cd-integration.md +892 -0
- package/docs/user-manual/08-advanced-usage/04-performance-optimization.md +766 -0
- package/docs/user-manual/09-command-reference/01-config.md +776 -0
- package/docs/user-manual/09-command-reference/02-account.md +652 -0
- package/docs/user-manual/09-command-reference/03-lists.md +958 -0
- package/docs/user-manual/09-command-reference/04-contacts.md +1408 -0
- package/docs/user-manual/09-command-reference/05-attributes.md +617 -0
- package/docs/user-manual/09-command-reference/06-segments.md +894 -0
- package/docs/user-manual/09-command-reference/07-senders.md +803 -0
- package/docs/user-manual/09-command-reference/08-templates.md +818 -0
- package/docs/user-manual/09-command-reference/09-campaigns.md +1250 -0
- package/docs/user-manual/09-command-reference/10-emails.md +807 -0
- package/docs/user-manual/09-command-reference/11-reports.md +1135 -0
- package/docs/user-manual/09-command-reference/12-webhooks.md +773 -0
- package/docs/user-manual/09-command-reference/13-suppressed.md +797 -0
- package/docs/user-manual/09-command-reference/14-interests.md +630 -0
- package/docs/user-manual/09-command-reference/15-tags.md +584 -0
- package/docs/user-manual/09-command-reference/16-logs.md +656 -0
- package/docs/user-manual/09-command-reference/17-transactional-templates.md +850 -0
- package/docs/user-manual/10-troubleshooting/01-common-errors.md +457 -0
- package/docs/user-manual/10-troubleshooting/02-authentication-issues.md +558 -0
- package/docs/user-manual/10-troubleshooting/03-connection-problems.md +634 -0
- package/docs/user-manual/10-troubleshooting/04-debugging.md +725 -0
- package/docs/user-manual/11-appendix/04-faq.md +484 -0
- package/docs/user-manual/11-appendix/05-glossary.md +250 -0
- package/docs/user-manual/README.md +0 -0
- package/package.json +13 -47
- package/src/cli.ts +125 -0
- package/src/client.ts +16 -0
- package/src/commands/account.ts +267 -0
- package/src/commands/accounts.ts +78 -0
- package/src/commands/actions.ts +249 -0
- package/src/commands/attributes.ts +139 -0
- package/src/commands/campaign-blueprints.ts +106 -0
- package/src/commands/campaigns.ts +469 -0
- package/src/commands/config.ts +77 -0
- package/src/commands/contacts.ts +612 -0
- package/src/commands/custom-attributes.ts +127 -0
- package/src/commands/dkims.ts +117 -0
- package/src/commands/domains.ts +82 -0
- package/src/commands/email-apis.ts +569 -0
- package/src/commands/emails.ts +197 -0
- package/src/commands/forms.ts +283 -0
- package/src/commands/interests.ts +155 -0
- package/src/commands/links.ts +38 -0
- package/src/commands/lists.ts +406 -0
- package/src/commands/logos.ts +71 -0
- package/src/commands/logs.ts +386 -0
- package/src/commands/reports.ts +306 -0
- package/src/commands/segments.ts +158 -0
- package/src/commands/senders.ts +204 -0
- package/src/commands/sub-accounts.ts +271 -0
- package/src/commands/suppressed-emails.ts +234 -0
- package/src/commands/suppressed.ts +198 -0
- package/src/commands/system-emails.ts +85 -0
- package/src/commands/tags.ts +146 -0
- package/src/commands/tasks.ts +116 -0
- package/src/commands/templates.ts +189 -0
- package/src/commands/tokens.ts +83 -0
- package/src/commands/transactional-emails.ts +374 -0
- package/src/commands/transactional-templates.ts +385 -0
- package/src/commands/users.ts +506 -0
- package/src/commands/webhooks.ts +172 -0
- package/src/commands/workflow-blueprints.ts +123 -0
- package/src/commands/workflows.ts +265 -0
- package/src/types/profile.ts +93 -0
- package/src/utils/auth.ts +272 -0
- package/src/utils/config-file.ts +96 -0
- package/src/utils/config.ts +134 -0
- package/src/utils/confirm.ts +32 -0
- package/src/utils/defaults.ts +99 -0
- package/src/utils/errors.ts +116 -0
- package/src/utils/interactive.ts +91 -0
- package/src/utils/list-defaults.ts +74 -0
- package/src/utils/output.ts +190 -0
- package/src/utils/progress.ts +320 -0
- package/src/utils/spinner.ts +22 -0
- package/tests/IMPLEMENTATION_STATUS.md +258 -0
- package/tests/PTY_SETUP.md +118 -0
- package/tests/PTY_TESTING_GUIDE.md +507 -0
- package/tests/README.md +244 -0
- package/tests/fixtures/api-responses/campaigns.json +34 -0
- package/tests/fixtures/test-config.json +13 -0
- package/tests/helpers/cli-runner.ts +128 -0
- package/tests/helpers/mock-server.ts +301 -0
- package/tests/helpers/pty-runner.ts +181 -0
- package/tests/integration/campaigns-real-api.test.ts +196 -0
- package/tests/integration/setup-integration.ts +50 -0
- package/tests/pty/campaigns.test.ts +241 -0
- package/tests/setup.ts +34 -0
- package/tsconfig.json +15 -0
- package/vitest.config.ts +28 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
# Campaign Basics
|
|
2
|
+
|
|
3
|
+
Create, manage, and monitor email campaigns sent to contact lists.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Campaigns are email messages sent to multiple recipients on a contact list. Unlike transactional emails (one-to-one), campaigns are typically used for:
|
|
8
|
+
- **Newsletters** - Regular updates to subscribers
|
|
9
|
+
- **Promotions** - Marketing and sales campaigns
|
|
10
|
+
- **Announcements** - Product launches, events
|
|
11
|
+
- **Educational content** - Tips, guides, courses
|
|
12
|
+
|
|
13
|
+
## Campaign Workflow
|
|
14
|
+
|
|
15
|
+
1. **Create** campaign with list, sender, and template
|
|
16
|
+
2. **Test** by sending to yourself
|
|
17
|
+
3. **Schedule** for future delivery
|
|
18
|
+
4. **Monitor** status and analytics
|
|
19
|
+
5. **Archive** when complete
|
|
20
|
+
|
|
21
|
+
## List Campaigns
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
cakemail campaigns list [options]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Options:**
|
|
28
|
+
- `-l, --limit <number>` - Results per page
|
|
29
|
+
- `-p, --page <number>` - Page number
|
|
30
|
+
- `--sort <sort>` - Sort order (+name, -created_on)
|
|
31
|
+
- `--filter <filter>` - Filter criteria
|
|
32
|
+
- `-s, --status <status>` - Filter by status
|
|
33
|
+
|
|
34
|
+
**Examples:**
|
|
35
|
+
```bash
|
|
36
|
+
# All campaigns
|
|
37
|
+
cakemail campaigns list
|
|
38
|
+
|
|
39
|
+
# Recent campaigns
|
|
40
|
+
cakemail campaigns list --sort "-created_on" --limit 10
|
|
41
|
+
|
|
42
|
+
# Delivered campaigns
|
|
43
|
+
cakemail campaigns list --filter "status==delivered"
|
|
44
|
+
|
|
45
|
+
# Scheduled campaigns
|
|
46
|
+
cakemail campaigns list -s scheduled
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Campaign statuses:**
|
|
50
|
+
- `draft` - Not yet scheduled
|
|
51
|
+
- `scheduled` - Scheduled for future
|
|
52
|
+
- `sending` - Currently being sent
|
|
53
|
+
- `delivered` - Completed successfully
|
|
54
|
+
- `suspended` - Paused mid-send
|
|
55
|
+
- `cancelled` - Cancelled before/during send
|
|
56
|
+
|
|
57
|
+
## Get Campaign Details
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
cakemail campaigns get <campaign-id>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Example:**
|
|
64
|
+
```bash
|
|
65
|
+
cakemail campaigns get 12345
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Output:**
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"id": 12345,
|
|
72
|
+
"name": "June Newsletter",
|
|
73
|
+
"status": "delivered",
|
|
74
|
+
"list_id": 789,
|
|
75
|
+
"sender_id": "abc123",
|
|
76
|
+
"template_id": 456,
|
|
77
|
+
"subject": "June 2024 Newsletter",
|
|
78
|
+
"scheduled_for": "2024-06-15T10:00:00Z",
|
|
79
|
+
"delivered_at": "2024-06-15T10:05:00Z",
|
|
80
|
+
"created_on": "2024-06-10T14:30:00Z"
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Create Campaign
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
cakemail campaigns create \
|
|
88
|
+
-n "Campaign Name" \
|
|
89
|
+
-l <list-id> \
|
|
90
|
+
-s <sender-id> \
|
|
91
|
+
[options]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Required:**
|
|
95
|
+
- `-n, --name <name>` - Campaign name
|
|
96
|
+
- `-l, --list-id <id>` - List to send to
|
|
97
|
+
- `-s, --sender-id <id>` - Verified sender
|
|
98
|
+
|
|
99
|
+
**Optional:**
|
|
100
|
+
- `-t, --template-id <id>` - Template to use
|
|
101
|
+
- `--subject <subject>` - Email subject
|
|
102
|
+
|
|
103
|
+
**Examples:**
|
|
104
|
+
```bash
|
|
105
|
+
# Basic campaign
|
|
106
|
+
cakemail campaigns create \
|
|
107
|
+
-n "June Newsletter" \
|
|
108
|
+
-l 789 \
|
|
109
|
+
-s abc123 \
|
|
110
|
+
-t 456 \
|
|
111
|
+
--subject "What's New in June"
|
|
112
|
+
|
|
113
|
+
# Simple campaign (auto-detects if only one list/sender)
|
|
114
|
+
cakemail campaigns create -n "Weekly Update"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Auto-detection:** If you only have one list or one confirmed sender, the CLI will auto-detect and use it.
|
|
118
|
+
|
|
119
|
+
## Update Campaign
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
cakemail campaigns update <campaign-id> [options]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Options:**
|
|
126
|
+
- `-n, --name <name>` - New name
|
|
127
|
+
- `-l, --list-id <id>` - Change list
|
|
128
|
+
- `-s, --sender-id <id>` - Change sender
|
|
129
|
+
- `-t, --template-id <id>` - Change template
|
|
130
|
+
- `--subject <subject>` - Change subject
|
|
131
|
+
|
|
132
|
+
**Examples:**
|
|
133
|
+
```bash
|
|
134
|
+
# Update name
|
|
135
|
+
cakemail campaigns update 12345 -n "July Newsletter"
|
|
136
|
+
|
|
137
|
+
# Change template
|
|
138
|
+
cakemail campaigns update 12345 -t 789
|
|
139
|
+
|
|
140
|
+
# Update multiple fields
|
|
141
|
+
cakemail campaigns update 12345 \
|
|
142
|
+
-n "Summer Newsletter" \
|
|
143
|
+
--subject "Summer Updates 2024"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Note:** Can only update campaigns in `draft` status.
|
|
147
|
+
|
|
148
|
+
## Delete Campaign
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
cakemail campaigns delete <campaign-id> [--force]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Examples:**
|
|
155
|
+
```bash
|
|
156
|
+
# Interactive confirmation
|
|
157
|
+
cakemail campaigns delete 12345
|
|
158
|
+
|
|
159
|
+
# Skip confirmation
|
|
160
|
+
cakemail campaigns delete 12345 --force
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Warning:** Cannot undo deletion. Archive instead if you want to keep records.
|
|
164
|
+
|
|
165
|
+
## Archive Campaign
|
|
166
|
+
|
|
167
|
+
Move completed campaigns to archive:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
cakemail campaigns archive <campaign-id>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Unarchive if needed:**
|
|
174
|
+
```bash
|
|
175
|
+
cakemail campaigns unarchive <campaign-id>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Use cases:**
|
|
179
|
+
- Clean up campaign list
|
|
180
|
+
- Keep historical records
|
|
181
|
+
- Organize by year/quarter
|
|
182
|
+
|
|
183
|
+
## Campaign States
|
|
184
|
+
|
|
185
|
+
### Draft
|
|
186
|
+
Newly created, not yet scheduled.
|
|
187
|
+
|
|
188
|
+
**Actions available:**
|
|
189
|
+
- Update campaign details
|
|
190
|
+
- Send test emails
|
|
191
|
+
- Schedule for delivery
|
|
192
|
+
- Delete
|
|
193
|
+
|
|
194
|
+
### Scheduled
|
|
195
|
+
Set to send at specific time.
|
|
196
|
+
|
|
197
|
+
**Actions available:**
|
|
198
|
+
- Reschedule
|
|
199
|
+
- Unschedule (back to draft)
|
|
200
|
+
- Send test emails
|
|
201
|
+
- Cancel
|
|
202
|
+
|
|
203
|
+
### Sending
|
|
204
|
+
Currently being sent to recipients.
|
|
205
|
+
|
|
206
|
+
**Actions available:**
|
|
207
|
+
- Suspend (pause)
|
|
208
|
+
- Monitor progress
|
|
209
|
+
|
|
210
|
+
### Delivered
|
|
211
|
+
Completed successfully.
|
|
212
|
+
|
|
213
|
+
**Actions available:**
|
|
214
|
+
- View analytics
|
|
215
|
+
- Archive
|
|
216
|
+
- Delete
|
|
217
|
+
|
|
218
|
+
### Suspended
|
|
219
|
+
Paused mid-send.
|
|
220
|
+
|
|
221
|
+
**Actions available:**
|
|
222
|
+
- Resume
|
|
223
|
+
- Cancel
|
|
224
|
+
|
|
225
|
+
### Cancelled
|
|
226
|
+
Cancelled before/during send.
|
|
227
|
+
|
|
228
|
+
**Actions available:**
|
|
229
|
+
- View partial analytics
|
|
230
|
+
- Delete
|
|
231
|
+
|
|
232
|
+
## Practical Examples
|
|
233
|
+
|
|
234
|
+
### Example 1: Create and Schedule
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
#!/bin/bash
|
|
238
|
+
# create-newsletter.sh
|
|
239
|
+
|
|
240
|
+
# Create campaign
|
|
241
|
+
CAMPAIGN_ID=$(cakemail campaigns create \
|
|
242
|
+
-n "Monthly Newsletter" \
|
|
243
|
+
-l 789 \
|
|
244
|
+
-s abc123 \
|
|
245
|
+
-t 456 \
|
|
246
|
+
--subject "June 2024 Newsletter" \
|
|
247
|
+
| jq -r '.id')
|
|
248
|
+
|
|
249
|
+
echo "Created campaign: $CAMPAIGN_ID"
|
|
250
|
+
|
|
251
|
+
# Send test
|
|
252
|
+
cakemail campaigns test $CAMPAIGN_ID -e test@example.com
|
|
253
|
+
echo "Test sent. Review and approve."
|
|
254
|
+
|
|
255
|
+
# Schedule (manually run after approving test)
|
|
256
|
+
# cakemail campaigns schedule $CAMPAIGN_ID -d "2024-06-15T10:00:00Z"
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Example 2: Campaign Status Check
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
#!/bin/bash
|
|
263
|
+
# check-campaigns.sh
|
|
264
|
+
|
|
265
|
+
echo "=== Campaign Status ==="
|
|
266
|
+
echo ""
|
|
267
|
+
|
|
268
|
+
echo "Scheduled:"
|
|
269
|
+
cakemail -f compact campaigns list -s scheduled
|
|
270
|
+
|
|
271
|
+
echo ""
|
|
272
|
+
echo "Sending:"
|
|
273
|
+
cakemail -f compact campaigns list -s sending
|
|
274
|
+
|
|
275
|
+
echo ""
|
|
276
|
+
echo "Recently Delivered:"
|
|
277
|
+
cakemail campaigns list \
|
|
278
|
+
--filter "status==delivered" \
|
|
279
|
+
--sort "-delivered_at" \
|
|
280
|
+
--limit 5
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Example 3: Bulk Archive
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
#!/bin/bash
|
|
287
|
+
# archive-old-campaigns.sh
|
|
288
|
+
|
|
289
|
+
# Get delivered campaigns older than 90 days
|
|
290
|
+
CUTOFF=$(date -d "90 days ago" +%Y-%m-%d)
|
|
291
|
+
|
|
292
|
+
CAMPAIGNS=$(cakemail -f json campaigns list \
|
|
293
|
+
--filter "status==delivered;delivered_at<$CUTOFF" \
|
|
294
|
+
| jq -r '.data[].id')
|
|
295
|
+
|
|
296
|
+
for ID in $CAMPAIGNS; do
|
|
297
|
+
echo "Archiving campaign $ID..."
|
|
298
|
+
cakemail campaigns archive $ID
|
|
299
|
+
done
|
|
300
|
+
|
|
301
|
+
echo "Archival complete"
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Best Practices
|
|
305
|
+
|
|
306
|
+
### 1. Use Descriptive Names
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# ✅ Good
|
|
310
|
+
-n "June Newsletter - Product Updates"
|
|
311
|
+
|
|
312
|
+
# ❌ Avoid
|
|
313
|
+
-n "Campaign 1"
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### 2. Always Test First
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
# Create
|
|
320
|
+
ID=$(cakemail campaigns create ... | jq -r '.id')
|
|
321
|
+
|
|
322
|
+
# Test
|
|
323
|
+
cakemail campaigns test $ID -e your@email.com
|
|
324
|
+
|
|
325
|
+
# Review, then schedule
|
|
326
|
+
cakemail campaigns schedule $ID -d "2024-06-15T10:00:00Z"
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### 3. Monitor Scheduled Campaigns
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
# Daily check
|
|
333
|
+
cakemail campaigns list -s scheduled
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### 4. Archive Completed Campaigns
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
# Monthly archival
|
|
340
|
+
cakemail campaigns list --filter "status==delivered" \
|
|
341
|
+
| jq -r '.data[].id' \
|
|
342
|
+
| xargs -I {} cakemail campaigns archive {}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### 5. Keep Drafts Clean
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# List old drafts
|
|
349
|
+
cakemail campaigns list \
|
|
350
|
+
--filter "status==draft" \
|
|
351
|
+
--sort "+created_on"
|
|
352
|
+
|
|
353
|
+
# Delete if not needed
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Troubleshooting
|
|
357
|
+
|
|
358
|
+
### Cannot Create Campaign
|
|
359
|
+
|
|
360
|
+
**Check requirements:**
|
|
361
|
+
```bash
|
|
362
|
+
# Verify list exists
|
|
363
|
+
cakemail lists get <list-id>
|
|
364
|
+
|
|
365
|
+
# Verify sender is confirmed
|
|
366
|
+
cakemail senders get <sender-id>
|
|
367
|
+
|
|
368
|
+
# Verify template exists
|
|
369
|
+
cakemail templates get <template-id>
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Campaign Stuck in "Sending"
|
|
373
|
+
|
|
374
|
+
**Normal:** Large lists take time
|
|
375
|
+
|
|
376
|
+
**Check progress:**
|
|
377
|
+
```bash
|
|
378
|
+
cakemail reports campaign <campaign-id>
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
**If truly stuck:**
|
|
382
|
+
- Contact support
|
|
383
|
+
- Check account status
|
|
384
|
+
|
|
385
|
+
### Cannot Update Campaign
|
|
386
|
+
|
|
387
|
+
**Verify status:**
|
|
388
|
+
```bash
|
|
389
|
+
cakemail campaigns get <campaign-id>
|
|
390
|
+
# Check status field
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Solution:** Can only update `draft` campaigns
|
|
394
|
+
|