Email character count
Count characters in each provided section and compare them to these limits.
Limits
| Section | Limit | Required |
|---|---|---|
| Subject Line | 40 | yes |
| Preheader | 50 | yes |
| H1 (optional) | 35 | no |
| H2 (optional) | 40 | no |
| H3 (optional) | 35 | no |
| Body | 500 | yes |
| CTA | 25 | yes |
| Secondary CTA (optional) | 200 | no |
Use these values exactly. Do not substitute industry averages.
Field aliases
Map copy-doc labels to skill sections when needed:
| Copy-doc label | Section |
|---|---|
| Subject line | Subject Line |
| Preview text | Preheader |
| Hero/banner heading | H1 |
| Hero – Title | H2 |
| Body copy | Body |
| CTA button copy | CTA |
| Secondary CTA | Secondary CTA |
How to count
- Count every character, including spaces and punctuation.
- Trim leading and trailing whitespace first; do not count it.
- Do not count the section label (
Subject Line:,H1:, etc.). - Skip optional sections that are missing or empty. Do not fail them.
- Fail a required section if it is missing or empty.
Workflow
- Extract the copy for each section the user provided.
- Run the checker (preferred), from this repository root:
python3 .cursor/skills/email-character-count/scripts/check_counts.py path/to/copy.txt
Or pass JSON:
python3 .cursor/skills/email-character-count/scripts/check_counts.py --json '{"Subject Line":"...","Preheader":"...","Body":"...","CTA":"..."}'
From the skill folder, use python3 scripts/check_counts.py instead.
- If the script cannot run, count manually with the same rules and the same output format.
- Report results. Do not rewrite copy unless the user asks.
Output
Use this table, then a one-line pass/fail summary:
| Section | Count | Limit | Status |
|---|---|---|---|
| Subject Line | 38 | 40 | Pass |
| Preheader | 52 | 50 | Fail (2 over) |
Status values:
Pass— count is within the limitFail (N over)— count exceeds the limitFail (missing)— required section is emptySkipped— optional section not provided
Overall: Pass only if every required section passes and every provided optional section passes.
Input format
Accept labeled copy like this:
Subject Line: ...
Preheader: ...
H1: ...
H2: ...
H3: ...
Body: ...
CTA: ...
Secondary CTA: ...
Optional headings may be omitted. Body may be multiple lines until the next section label.