@cakemail-org/cakemail-cli 1.7.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.
Files changed (198) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.env.example +40 -0
  3. package/.env.test.example +45 -0
  4. package/CHANGELOG.md +1031 -0
  5. package/README.md +41 -37
  6. package/audit-formats.js +128 -0
  7. package/cakemail.rb +20 -0
  8. package/dist/client.js +1 -1
  9. package/dist/client.js.map +1 -1
  10. package/dist/commands/account.js +1 -1
  11. package/dist/commands/account.js.map +1 -1
  12. package/dist/commands/attributes.js +1 -1
  13. package/dist/commands/attributes.js.map +1 -1
  14. package/dist/commands/campaigns.js +1 -1
  15. package/dist/commands/campaigns.js.map +1 -1
  16. package/dist/commands/contacts.js +1 -1
  17. package/dist/commands/contacts.js.map +1 -1
  18. package/dist/commands/emails.js +1 -1
  19. package/dist/commands/emails.js.map +1 -1
  20. package/dist/commands/interests.js +1 -1
  21. package/dist/commands/interests.js.map +1 -1
  22. package/dist/commands/lists.js +1 -1
  23. package/dist/commands/lists.js.map +1 -1
  24. package/dist/commands/logs.js +1 -1
  25. package/dist/commands/logs.js.map +1 -1
  26. package/dist/commands/reports.js +1 -1
  27. package/dist/commands/reports.js.map +1 -1
  28. package/dist/commands/segments.js +1 -1
  29. package/dist/commands/segments.js.map +1 -1
  30. package/dist/commands/senders.js +1 -1
  31. package/dist/commands/senders.js.map +1 -1
  32. package/dist/commands/suppressed.js +1 -1
  33. package/dist/commands/suppressed.js.map +1 -1
  34. package/dist/commands/tags.js +1 -1
  35. package/dist/commands/tags.js.map +1 -1
  36. package/dist/commands/templates.js +1 -1
  37. package/dist/commands/templates.js.map +1 -1
  38. package/dist/commands/transactional-templates.js +1 -1
  39. package/dist/commands/transactional-templates.js.map +1 -1
  40. package/dist/commands/webhooks.js +1 -1
  41. package/dist/commands/webhooks.js.map +1 -1
  42. package/dist/utils/config.js +2 -2
  43. package/dist/utils/config.js.map +1 -1
  44. package/dist/utils/errors.js +1 -1
  45. package/dist/utils/errors.js.map +1 -1
  46. package/dist/utils/progress.d.ts.map +1 -1
  47. package/dist/utils/progress.js +32 -4
  48. package/dist/utils/progress.js.map +1 -1
  49. package/dist/utils/spinner.d.ts +17 -0
  50. package/dist/utils/spinner.d.ts.map +1 -0
  51. package/dist/utils/spinner.js +43 -0
  52. package/dist/utils/spinner.js.map +1 -0
  53. package/docs/DOCUMENTATION-STANDARD.md +1068 -0
  54. package/docs/README.md +161 -0
  55. package/docs/developer/ARCHITECTURE.md +516 -0
  56. package/docs/developer/AUTH.md +204 -0
  57. package/docs/developer/CONTRIBUTING.md +227 -0
  58. package/docs/developer/DOCUMENTATION_SUMMARY.md +346 -0
  59. package/docs/developer/PROJECT_INDEX.md +365 -0
  60. package/docs/planning/API_COVERAGE.md +1045 -0
  61. package/docs/planning/BACKLOG.md +1159 -0
  62. package/docs/planning/PROFILE_SYSTEM_TASKS.md +287 -0
  63. package/docs/planning/UX_IMPLEMENTATION_PLAN.md +691 -0
  64. package/docs/planning/archive/RELEASE_CHECKLIST_v1.3.0.md +332 -0
  65. package/docs/planning/archive/RELEASE_v1.3.0.md +428 -0
  66. package/docs/planning/archive/cakemail-cli-ux-improvements.md +438 -0
  67. package/docs/planning/cakemail-profile-system-plan.md +1121 -0
  68. package/docs/testing/AI_USER_SIMULATION_DESIGN.md +1342 -0
  69. package/docs/testing/KENOGAMI_BIDIRECTIONAL_FLOW.md +1517 -0
  70. package/docs/testing/KENOGAMI_TRUTH_RECONCILIATION_SYSTEM.md +1369 -0
  71. package/docs/user-manual/.obsidian/app.json +1 -0
  72. package/docs/user-manual/.obsidian/appearance.json +1 -0
  73. package/docs/user-manual/.obsidian/core-plugins.json +33 -0
  74. package/docs/user-manual/.obsidian/workspace.json +167 -0
  75. package/docs/user-manual/01-getting-started/01-installation.md +214 -0
  76. package/docs/user-manual/01-getting-started/02-quick-start.md +432 -0
  77. package/docs/user-manual/01-getting-started/03-authentication.md +448 -0
  78. package/docs/user-manual/01-getting-started/04-configuration.md +430 -0
  79. package/docs/user-manual/01-getting-started/05-output-formats.md +447 -0
  80. package/docs/user-manual/02-core-concepts/01-accounts.md +514 -0
  81. package/docs/user-manual/02-core-concepts/02-profile-system.md +771 -0
  82. package/docs/user-manual/02-core-concepts/03-smart-defaults.md +485 -0
  83. package/docs/user-manual/02-core-concepts/04-authentication-methods.md +435 -0
  84. package/docs/user-manual/02-core-concepts/05-pagination-filtering.md +600 -0
  85. package/docs/user-manual/02-core-concepts/06-error-handling.md +718 -0
  86. package/docs/user-manual/02-core-concepts/07-api-coverage.md +483 -0
  87. package/docs/user-manual/03-email-operations/01-senders.md +490 -0
  88. package/docs/user-manual/03-email-operations/02-templates.md +444 -0
  89. package/docs/user-manual/03-email-operations/03-transactional-emails.md +706 -0
  90. package/docs/user-manual/03-email-operations/04-email-tracking.md +407 -0
  91. package/docs/user-manual/04-campaign-management/01-campaigns-basics.md +394 -0
  92. package/docs/user-manual/04-campaign-management/02-campaign-scheduling.md +630 -0
  93. package/docs/user-manual/04-campaign-management/03-campaign-testing.md +997 -0
  94. package/docs/user-manual/04-campaign-management/04-campaign-lifecycle.md +709 -0
  95. package/docs/user-manual/04-campaign-management/05-campaign-links.md +934 -0
  96. package/docs/user-manual/05-contact-management/01-lists.md +836 -0
  97. package/docs/user-manual/05-contact-management/02-contacts.md +1035 -0
  98. package/docs/user-manual/05-contact-management/03-custom-attributes.md +788 -0
  99. package/docs/user-manual/05-contact-management/04-segments.md +1028 -0
  100. package/docs/user-manual/05-contact-management/05-contact-import-export.md +1031 -0
  101. package/docs/user-manual/06-analytics-reporting/01-campaign-analytics.md +867 -0
  102. package/docs/user-manual/06-analytics-reporting/02-account-reports.md +227 -0
  103. package/docs/user-manual/07-integrations/01-webhooks-integration.md +259 -0
  104. package/docs/user-manual/07-integrations/02-automation.md +326 -0
  105. package/docs/user-manual/08-advanced-usage/01-scripting-patterns.md +672 -0
  106. package/docs/user-manual/08-advanced-usage/02-bulk-operations.md +932 -0
  107. package/docs/user-manual/08-advanced-usage/03-ci-cd-integration.md +892 -0
  108. package/docs/user-manual/08-advanced-usage/04-performance-optimization.md +766 -0
  109. package/docs/user-manual/09-command-reference/01-config.md +776 -0
  110. package/docs/user-manual/09-command-reference/02-account.md +652 -0
  111. package/docs/user-manual/09-command-reference/03-lists.md +958 -0
  112. package/docs/user-manual/09-command-reference/04-contacts.md +1408 -0
  113. package/docs/user-manual/09-command-reference/05-attributes.md +617 -0
  114. package/docs/user-manual/09-command-reference/06-segments.md +894 -0
  115. package/docs/user-manual/09-command-reference/07-senders.md +803 -0
  116. package/docs/user-manual/09-command-reference/08-templates.md +818 -0
  117. package/docs/user-manual/09-command-reference/09-campaigns.md +1250 -0
  118. package/docs/user-manual/09-command-reference/10-emails.md +807 -0
  119. package/docs/user-manual/09-command-reference/11-reports.md +1135 -0
  120. package/docs/user-manual/09-command-reference/12-webhooks.md +773 -0
  121. package/docs/user-manual/09-command-reference/13-suppressed.md +797 -0
  122. package/docs/user-manual/09-command-reference/14-interests.md +630 -0
  123. package/docs/user-manual/09-command-reference/15-tags.md +584 -0
  124. package/docs/user-manual/09-command-reference/16-logs.md +656 -0
  125. package/docs/user-manual/09-command-reference/17-transactional-templates.md +850 -0
  126. package/docs/user-manual/10-troubleshooting/01-common-errors.md +457 -0
  127. package/docs/user-manual/10-troubleshooting/02-authentication-issues.md +558 -0
  128. package/docs/user-manual/10-troubleshooting/03-connection-problems.md +634 -0
  129. package/docs/user-manual/10-troubleshooting/04-debugging.md +725 -0
  130. package/docs/user-manual/11-appendix/04-faq.md +484 -0
  131. package/docs/user-manual/11-appendix/05-glossary.md +250 -0
  132. package/docs/user-manual/README.md +0 -0
  133. package/package.json +13 -61
  134. package/src/cli.ts +125 -0
  135. package/src/client.ts +16 -0
  136. package/src/commands/account.ts +267 -0
  137. package/src/commands/accounts.ts +78 -0
  138. package/src/commands/actions.ts +249 -0
  139. package/src/commands/attributes.ts +139 -0
  140. package/src/commands/campaign-blueprints.ts +106 -0
  141. package/src/commands/campaigns.ts +469 -0
  142. package/src/commands/config.ts +77 -0
  143. package/src/commands/contacts.ts +612 -0
  144. package/src/commands/custom-attributes.ts +127 -0
  145. package/src/commands/dkims.ts +117 -0
  146. package/src/commands/domains.ts +82 -0
  147. package/src/commands/email-apis.ts +569 -0
  148. package/src/commands/emails.ts +197 -0
  149. package/src/commands/forms.ts +283 -0
  150. package/src/commands/interests.ts +155 -0
  151. package/src/commands/links.ts +38 -0
  152. package/src/commands/lists.ts +406 -0
  153. package/src/commands/logos.ts +71 -0
  154. package/src/commands/logs.ts +386 -0
  155. package/src/commands/reports.ts +306 -0
  156. package/src/commands/segments.ts +158 -0
  157. package/src/commands/senders.ts +204 -0
  158. package/src/commands/sub-accounts.ts +271 -0
  159. package/src/commands/suppressed-emails.ts +234 -0
  160. package/src/commands/suppressed.ts +198 -0
  161. package/src/commands/system-emails.ts +85 -0
  162. package/src/commands/tags.ts +146 -0
  163. package/src/commands/tasks.ts +116 -0
  164. package/src/commands/templates.ts +189 -0
  165. package/src/commands/tokens.ts +83 -0
  166. package/src/commands/transactional-emails.ts +374 -0
  167. package/src/commands/transactional-templates.ts +385 -0
  168. package/src/commands/users.ts +506 -0
  169. package/src/commands/webhooks.ts +172 -0
  170. package/src/commands/workflow-blueprints.ts +123 -0
  171. package/src/commands/workflows.ts +265 -0
  172. package/src/types/profile.ts +93 -0
  173. package/src/utils/auth.ts +272 -0
  174. package/src/utils/config-file.ts +96 -0
  175. package/src/utils/config.ts +134 -0
  176. package/src/utils/confirm.ts +32 -0
  177. package/src/utils/defaults.ts +99 -0
  178. package/src/utils/errors.ts +116 -0
  179. package/src/utils/interactive.ts +91 -0
  180. package/src/utils/list-defaults.ts +74 -0
  181. package/src/utils/output.ts +190 -0
  182. package/src/utils/progress.ts +320 -0
  183. package/src/utils/spinner.ts +22 -0
  184. package/tests/IMPLEMENTATION_STATUS.md +258 -0
  185. package/tests/PTY_SETUP.md +118 -0
  186. package/tests/PTY_TESTING_GUIDE.md +507 -0
  187. package/tests/README.md +244 -0
  188. package/tests/fixtures/api-responses/campaigns.json +34 -0
  189. package/tests/fixtures/test-config.json +13 -0
  190. package/tests/helpers/cli-runner.ts +128 -0
  191. package/tests/helpers/mock-server.ts +301 -0
  192. package/tests/helpers/pty-runner.ts +181 -0
  193. package/tests/integration/campaigns-real-api.test.ts +196 -0
  194. package/tests/integration/setup-integration.ts +50 -0
  195. package/tests/pty/campaigns.test.ts +241 -0
  196. package/tests/setup.ts +34 -0
  197. package/tsconfig.json +15 -0
  198. 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
+