@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,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
|
+
|