@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,584 @@
1
+ # Tags Commands
2
+
3
+ Manage global contact tags.
4
+
5
+ ## Overview
6
+
7
+ Tags are labels you can apply to contacts across all lists in your account. Unlike interests which are list-specific, tags are global and can be used for organization, segmentation, and filtering.
8
+
9
+ **Available Commands:**
10
+ - [`tags list`](#tags-list) - List all tags with optional counts
11
+ - [`tags show`](#tags-show) - Show tag details and statistics
12
+ - [`tags create`](#tags-create) - Create a new tag
13
+ - [`tags update`](#tags-update) - Rename an existing tag
14
+ - [`tags delete`](#tags-delete) - Delete a tag (removes from all contacts)
15
+
16
+ **Key Features:**
17
+ - Global scope (not list-specific)
18
+ - Can be applied to any contact in any list
19
+ - Support contact counts for analytics
20
+ - Profile-aware delete confirmations
21
+ - Case-insensitive tag names
22
+
23
+ **Related Commands:**
24
+ - [`contacts tag`](/en/cli/command-reference/contacts#contacts-tag) - Apply tags to a contact
25
+ - [`contacts untag`](/en/cli/command-reference/contacts#contacts-untag) - Remove tags from a contact
26
+ - [`contacts tag-bulk`](/en/cli/command-reference/contacts#contacts-tag-bulk) - Tag multiple contacts
27
+ - [`contacts untag-bulk`](/en/cli/command-reference/contacts#contacts-untag-bulk) - Untag multiple contacts
28
+
29
+ ---
30
+
31
+ ## tags list
32
+
33
+ List all global tags in your account.
34
+
35
+ ### Usage
36
+
37
+ ```bash
38
+ cakemail tags list [options]
39
+ ```
40
+
41
+ ### Options
42
+
43
+ - `-p, --page <number>` - Page number for pagination
44
+ - `--per-page <number>` - Results per page (default varies by API)
45
+ - `--with-count` - Include contact count for each tag
46
+ - `--sort <sort>` - Sort order (e.g., `+name`, `-created_on`)
47
+ - `--filter <filter>` - Filter tags (e.g., `name==vip`)
48
+
49
+ ### Examples
50
+
51
+ **List all tags:**
52
+ ```bash
53
+ $ cakemail tags list
54
+ ```
55
+
56
+ **Output (Table format - Balanced profile):**
57
+ ```
58
+ ┌────┬─────────────┬─────────────────────┐
59
+ │ ID │ Name │ Created At │
60
+ ├────┼─────────────┼─────────────────────┤
61
+ │ 1 │ vip │ 2025-09-15 10:23:11 │
62
+ │ 2 │ premium │ 2025-09-20 14:05:42 │
63
+ │ 3 │ early-bird │ 2025-10-01 08:15:33 │
64
+ └────┴─────────────┴─────────────────────┘
65
+ ```
66
+
67
+ **List tags with contact counts:**
68
+ ```bash
69
+ $ cakemail tags list --with-count
70
+ ```
71
+
72
+ **Output:**
73
+ ```
74
+ ✓ Tags retrieved successfully
75
+
76
+ ┌────┬─────────────┬────────────────┬─────────────────────┐
77
+ │ ID │ Name │ Contacts Count │ Created At │
78
+ ├────┼─────────────┼────────────────┼─────────────────────┤
79
+ │ 1 │ vip │ 342 │ 2025-09-15 10:23:11 │
80
+ │ 2 │ premium │ 128 │ 2025-09-20 14:05:42 │
81
+ │ 3 │ early-bird │ 67 │ 2025-10-01 08:15:33 │
82
+ └────┴─────────────┴────────────────┴─────────────────────┘
83
+ ```
84
+
85
+ **Sorted by name:**
86
+ ```bash
87
+ $ cakemail tags list --sort +name --with-count
88
+ ```
89
+
90
+ **Filtered tags:**
91
+ ```bash
92
+ $ cakemail tags list --filter "name==vip"
93
+ ```
94
+
95
+ **JSON output (Developer profile):**
96
+ ```bash
97
+ $ cakemail --profile developer tags list --with-count
98
+ ```
99
+
100
+ **Output:**
101
+ ```json
102
+ {
103
+ "data": [
104
+ {"id": 1, "name": "vip", "contacts_count": 342, "created_on": "2025-09-15T10:23:11Z"},
105
+ {"id": 2, "name": "premium", "contacts_count": 128, "created_on": "2025-09-20T14:05:42Z"}
106
+ ],
107
+ "pagination": {
108
+ "page": 1,
109
+ "per_page": 25,
110
+ "total": 2
111
+ }
112
+ }
113
+ ```
114
+
115
+ ### Notes
116
+
117
+ - Tags are returned in order of creation by default
118
+ - Use `--with-count` to see how many contacts have each tag
119
+ - Contact counts may impact performance on large datasets
120
+ - Supports standard pagination and filtering
121
+
122
+ ---
123
+
124
+ ## tags show
125
+
126
+ Show details and statistics for a specific tag.
127
+
128
+ ### Usage
129
+
130
+ ```bash
131
+ cakemail tags show <tag>
132
+ ```
133
+
134
+ ### Arguments
135
+
136
+ - `<tag>` - Tag name or ID (required)
137
+
138
+ ### Examples
139
+
140
+ **Show tag by name:**
141
+ ```bash
142
+ $ cakemail tags show vip
143
+ ```
144
+
145
+ **Output:**
146
+ ```
147
+ Tag: vip
148
+
149
+ Details:
150
+ ID: 1
151
+ Name: vip
152
+ Created: 2025-09-15 10:23:11
153
+ Contacts: 342
154
+
155
+ Usage:
156
+ Lists using this tag: 5
157
+ Campaigns targeting this tag: 12
158
+ ```
159
+
160
+ **Show tag by ID:**
161
+ ```bash
162
+ $ cakemail tags show 1
163
+ ```
164
+
165
+ **JSON output:**
166
+ ```bash
167
+ $ cakemail -f json tags show vip
168
+ ```
169
+
170
+ **Output:**
171
+ ```json
172
+ {
173
+ "id": 1,
174
+ "name": "vip",
175
+ "created_on": "2025-09-15T10:23:11Z",
176
+ "contacts_count": 342,
177
+ "usage_stats": {
178
+ "lists": 5,
179
+ "campaigns": 12
180
+ }
181
+ }
182
+ ```
183
+
184
+ ### Use Cases
185
+
186
+ - Audit tag usage before deletion
187
+ - Verify tag existence
188
+ - Check contact counts
189
+ - Review tag statistics
190
+
191
+ ---
192
+
193
+ ## tags create
194
+
195
+ Create a new global tag.
196
+
197
+ ### Usage
198
+
199
+ ```bash
200
+ cakemail tags create --name <name>
201
+ ```
202
+
203
+ ### Options
204
+
205
+ - `-n, --name <name>` - Tag name (required)
206
+
207
+ ### Examples
208
+
209
+ **Create a tag:**
210
+ ```bash
211
+ $ cakemail tags create --name "early-adopter"
212
+ ```
213
+
214
+ **Output:**
215
+ ```
216
+ ✓ Tag created successfully
217
+
218
+ Tag: early-adopter
219
+ ID: 4
220
+ Created: just now
221
+ ```
222
+
223
+ **Create with developer profile (JSON):**
224
+ ```bash
225
+ $ cakemail --profile developer tags create --name "beta-tester"
226
+ ```
227
+
228
+ **Output:**
229
+ ```json
230
+ {
231
+ "id": 4,
232
+ "name": "beta-tester",
233
+ "created_on": "2025-10-11T15:30:00Z"
234
+ }
235
+ ```
236
+
237
+ ### Tag Naming Rules
238
+
239
+ **Valid tag names:**
240
+ - Letters, numbers, hyphens, underscores
241
+ - Case-insensitive (`VIP` == `vip`)
242
+ - 1-50 characters
243
+
244
+ **Examples:**
245
+ - ✅ `vip`
246
+ - ✅ `early-bird`
247
+ - ✅ `customer_2024`
248
+ - ✅ `tier-1`
249
+ - ❌ `VIP Customer` (spaces not allowed)
250
+ - ❌ `special!` (special characters not allowed)
251
+
252
+ ### Error Handling
253
+
254
+ **Duplicate tag:**
255
+ ```
256
+ Error: Tag 'vip' already exists
257
+ Suggestion: Use 'cakemail tags list' to see existing tags
258
+ ```
259
+
260
+ **Invalid name:**
261
+ ```
262
+ Error: Invalid tag name 'VIP Customer'
263
+ Tag names can only contain letters, numbers, hyphens, and underscores
264
+ ```
265
+
266
+ ---
267
+
268
+ ## tags update
269
+
270
+ Rename an existing tag.
271
+
272
+ ### Usage
273
+
274
+ ```bash
275
+ cakemail tags update <tag> --name <new-name>
276
+ ```
277
+
278
+ ### Arguments
279
+
280
+ - `<tag>` - Current tag name or ID (required)
281
+
282
+ ### Options
283
+
284
+ - `-n, --name <name>` - New tag name (required)
285
+
286
+ ### Examples
287
+
288
+ **Rename a tag:**
289
+ ```bash
290
+ $ cakemail tags update "early-adopter" --name "beta-tester"
291
+ ```
292
+
293
+ **Output:**
294
+ ```
295
+ ✓ Tag renamed successfully
296
+
297
+ Tag updated:
298
+ Old name: early-adopter
299
+ New name: beta-tester
300
+ Contacts: 67 (unchanged)
301
+ ```
302
+
303
+ **Update by ID:**
304
+ ```bash
305
+ $ cakemail tags update 4 --name "alpha-tester"
306
+ ```
307
+
308
+ ### Notes
309
+
310
+ - Tag ID remains unchanged
311
+ - All contacts keep the tag (only name changes)
312
+ - Existing segments using this tag continue to work
313
+ - Tag history is preserved
314
+
315
+ ---
316
+
317
+ ## tags delete
318
+
319
+ Delete a tag and remove it from all contacts.
320
+
321
+ ### Usage
322
+
323
+ ```bash
324
+ cakemail tags delete <tag> [options]
325
+ ```
326
+
327
+ ### Arguments
328
+
329
+ - `<tag>` - Tag name or ID to delete (required)
330
+
331
+ ### Options
332
+
333
+ - `-f, --force` - Skip confirmation prompt
334
+
335
+ ### Examples
336
+
337
+ **Delete with confirmation (Balanced/Marketer profile):**
338
+ ```bash
339
+ $ cakemail tags delete "old-tag"
340
+ ```
341
+
342
+ **Output:**
343
+ ```
344
+ ⚠ Delete tag 'old-tag'?
345
+ Tag will be removed from all 42 contacts
346
+ This action cannot be undone
347
+ Segments using this tag may be affected
348
+
349
+ Delete tag? (y/N): y
350
+
351
+ ✓ Tag 'old-tag' deleted successfully
352
+ ✓ Removed from 42 contacts
353
+ ```
354
+
355
+ **Force delete (skip confirmation):**
356
+ ```bash
357
+ $ cakemail tags delete "old-tag" --force
358
+ ```
359
+
360
+ **Output:**
361
+ ```
362
+ ✓ Tag 'old-tag' deleted
363
+ ✓ Removed from 42 contacts
364
+ ```
365
+
366
+ **Developer profile (no confirmation):**
367
+ ```bash
368
+ $ cakemail --profile developer tags delete "old-tag"
369
+ ```
370
+
371
+ **Output:**
372
+ ```
373
+ {"success":true,"tag":"old-tag","contacts_affected":42}
374
+ ```
375
+
376
+ ### Confirmation Behavior
377
+
378
+ **Marketer profile:**
379
+ - Always confirms, even with `--force`
380
+ - Shows detailed warning
381
+ - Displays affected contact count
382
+
383
+ **Balanced profile:**
384
+ - Confirms in interactive terminal
385
+ - Skips in scripts/CI
386
+ - Respects `--force` flag
387
+
388
+ **Developer profile:**
389
+ - Never confirms
390
+ - Immediate deletion
391
+ - JSON output
392
+
393
+ ### Important Notes
394
+
395
+ **⚠️ Warning: This action is destructive**
396
+
397
+ When you delete a tag:
398
+ - Tag is permanently removed
399
+ - Removed from ALL contacts who have it
400
+ - Segments using this tag may stop working correctly
401
+ - Campaign filters using this tag will need updating
402
+ - Cannot be undone
403
+
404
+ **Before deleting:**
405
+ 1. Check usage: `cakemail tags show <tag>`
406
+ 2. Review affected contacts count
407
+ 3. Update segments that reference this tag
408
+ 4. Update campaign filters
409
+
410
+ ---
411
+
412
+ ## Common Workflows
413
+
414
+ ### Workflow 1: Tag Audit and Cleanup
415
+
416
+ ```bash
417
+ # List all tags with contact counts
418
+ cakemail tags list --with-count --sort +name
419
+
420
+ # Review each low-usage tag
421
+ cakemail tags show "rarely-used-tag"
422
+
423
+ # Delete unused tags
424
+ cakemail tags delete "unused-tag" --force
425
+ ```
426
+
427
+ ---
428
+
429
+ ### Workflow 2: Tag Renaming Strategy
430
+
431
+ ```bash
432
+ # Check current tag
433
+ cakemail tags show "old-name"
434
+
435
+ # Rename to new convention
436
+ cakemail tags update "old-name" --name "new-name"
437
+
438
+ # Verify
439
+ cakemail tags show "new-name"
440
+ ```
441
+
442
+ ---
443
+
444
+ ### Workflow 3: Bulk Tag Management
445
+
446
+ ```bash
447
+ # Create multiple tags
448
+ cakemail tags create --name "tier-1"
449
+ cakemail tags create --name "tier-2"
450
+ cakemail tags create --name "tier-3"
451
+
452
+ # List to verify
453
+ cakemail tags list --sort +name
454
+
455
+ # Bulk apply to contacts (see contacts command)
456
+ cakemail contacts tag-bulk 123 --tags "tier-1,tier-2" --query "engagement_score>80"
457
+ ```
458
+
459
+ ---
460
+
461
+ ## Integration with Other Commands
462
+
463
+ ### Tagging Contacts
464
+
465
+ After creating tags, apply them to contacts:
466
+
467
+ ```bash
468
+ # Tag a single contact
469
+ cakemail contacts tag 123 456 --tags "vip,premium"
470
+
471
+ # Bulk tag contacts by query
472
+ cakemail contacts tag-bulk 123 --tags "early-bird" --query "created_on<2025-01-01"
473
+
474
+ # Bulk tag specific contacts
475
+ cakemail contacts tag-bulk 123 --tags "vip" --contacts "1,2,3,4,5"
476
+ ```
477
+
478
+ ### Segmentation
479
+
480
+ Use tags in segment queries:
481
+
482
+ ```bash
483
+ # Create segment of VIP contacts
484
+ cakemail segments create 123 --name "VIP Customers" --query "tags==vip"
485
+
486
+ # Combine with other conditions
487
+ cakemail segments create 123 --name "Active VIPs" --query "tags==vip;status==active"
488
+ ```
489
+
490
+ ### Campaign Targeting
491
+
492
+ Filter campaign recipients by tags:
493
+
494
+ ```bash
495
+ # This would be done through the Cakemail web UI
496
+ # But you can verify tag usage in campaigns
497
+ cakemail tags show vip # Check "campaigns" count
498
+ ```
499
+
500
+ ---
501
+
502
+ ## Best Practices
503
+
504
+ ### 1. Use Consistent Naming
505
+
506
+ **Good:**
507
+ ```bash
508
+ cakemail tags create --name "tier-1"
509
+ cakemail tags create --name "tier-2"
510
+ cakemail tags create --name "tier-3"
511
+ ```
512
+
513
+ **Avoid:**
514
+ ```bash
515
+ cakemail tags create --name "Tier1"
516
+ cakemail tags create --name "tier_2"
517
+ cakemail tags create --name "TIER-THREE"
518
+ ```
519
+
520
+ ### 2. Audit Regularly
521
+
522
+ ```bash
523
+ # Monthly tag audit
524
+ cakemail tags list --with-count | grep " 0 " # Find unused tags
525
+ ```
526
+
527
+ ### 3. Document Tag Meaning
528
+
529
+ Maintain a separate document explaining what each tag means and when to use it.
530
+
531
+ ### 4. Limit Tag Count
532
+
533
+ Too many tags = confusion. Aim for:
534
+ - < 20 tags for small teams
535
+ - < 50 tags for medium organizations
536
+ - < 100 tags for enterprises
537
+
538
+ ---
539
+
540
+ ## Troubleshooting
541
+
542
+ ### Tag Not Found
543
+
544
+ **Problem:**
545
+ ```
546
+ Error: Tag 'vip' not found
547
+ ```
548
+
549
+ **Solutions:**
550
+ 1. List all tags: `cakemail tags list`
551
+ 2. Check spelling (tags are case-insensitive)
552
+ 3. Use tag ID instead: `cakemail tags show 1`
553
+
554
+ ---
555
+
556
+ ### Cannot Delete Tag
557
+
558
+ **Problem:**
559
+ ```
560
+ Error: Cannot delete tag 'vip' - tag is in use
561
+ ```
562
+
563
+ **Solutions:**
564
+ 1. Check usage: `cakemail tags show vip`
565
+ 2. Review affected segments
566
+ 3. Use `--force` if you're sure
567
+ 4. Contact support if blocked
568
+
569
+ ---
570
+
571
+ ### Duplicate Tag Error
572
+
573
+ **Problem:**
574
+ ```
575
+ Error: Tag 'vip' already exists
576
+ ```
577
+
578
+ **Solutions:**
579
+ 1. List tags: `cakemail tags list`
580
+ 2. Use different name
581
+ 3. Or update existing tag: `cakemail tags update vip --name new-name`
582
+
583
+ ---
584
+