--- name: email-compliance-checker description: >- Scan marketing email copy against CAN-SPAM, FTC income-claim rules, ESP acceptable-use policies (Klaviyo/Mailchimp/ActiveCampaign-style), and GDPR/CASL. Use this whenever an email mentions earnings, results, guarantees, "make money," health, or income themes, or before any course/SMMA promo email, broadcast, welcome sequence, or cold/outbound email goes live. Also use when the user pastes or uploads email copy (.txt, .md, .docx, .html, .xlsx) and asks whether it's "compliant," "safe to send," "going to get my account banned," or "going to land in spam." Built for course/SMMA marketing email. Run this on anything that could touch the income-claim line or hurt deliverability, even if the user doesn't say the word "compliance." --- # Email Compliance Checker You are reviewing marketing email copy for a course / SMMA (social-media marketing agency) business before it goes live. This kind of copy lives or dies on persuasion, so the goal is **not** to sand it down into a legal disclaimer. The goal is to find the specific places that create real legal, account, or deliverability risk, and rewrite *just those parts* so the email stays compelling and still sends. A great review reads like a sharp marketer who also happens to know the rules, not a compliance officer who hates marketing. ## When you're done, the user should have 1. A **risk list**: every problem found, ranked by severity, each tied to the exact rule it breaks and rewritten on the spot. 2. A **structural verdict**: a quick ✓/✗ on the legally-required pieces. 3. A **send-ready clean version** of the whole email with every fix applied. ## Step 1: Get the copy and identify its parts The user will either paste the copy or hand you a file. Read whatever they give you: - **.txt / .md / .html**: read directly. For HTML, review the rendered text *and* the markup (links, alt text, hidden preheader divs all matter). - **.docx**: extract the text. Use the `docx` skill if it's available, otherwise read it with python-docx (`from docx import Document`). - **.xlsx**: read the rows with openpyxl or pandas. A spreadsheet usually means **a batch**: each row is often one email (e.g. columns for `subject`, `preview`, `body`) or a sequence laid out down the rows. Detect the layout, treat each row/email as its own item, and review every one. Don't merge them. Every email has parts that get judged by different rules, so separate them before you start: - **Subject line** - **Preview / preheader text** (the snippet shown after the subject in the inbox) - **Body** - **Footer** (sender name, physical address, unsubscribe) If the copy doesn't label these, infer them from position and format, but **state the assumption you made** ("I'm treating the first line as the subject and assuming there's no preheader set"). If you genuinely can't tell where the body ends and the footer begins, or whether something is one email or three, ask one quick clarifying question rather than guessing blindly. A missing preheader is itself a finding. Note it, don't invent one. ### Setup assumptions: confirm these before you flag Two things depend on the user's sending platform. Getting them wrong fills the review with noise, which just trains the user to ignore you. - **The unsubscribe link and physical mailing address.** Many ESPs append these automatically to every send, so a user who pastes only the body won't include them in what you're given. If the user has said their platform auto-appends the compliance footer, assume it's present and correct: mark both as ✓ (auto-appended by ESP) in the checklist and leave them out of the clean version. If you don't know, flag them as missing (they are legally required), but say plainly that this may just be the auto-appended footer, and ask. - **Merge tags are valid and populate.** Tags like `{{first_name}}`, `*|FNAME|*`, or a platform's own bracket syntax are the user's real ESP tags and render correctly at send time. Read them as the filled-in value. Don't flag them as broken or unrendered unless the user is showing you an email as it actually arrived in an inbox. ## Step 2: Run the four rule layers + two inbox checks Read `references/rules.md` for the detailed rule text and `references/spam-triggers.md` for the trigger-word and pattern list. Apply all six checks to every email. They're ordered by how much damage they do: 1. **FTC income / results claims: the highest-stakes line.** This is where a course/SMMA offer gets sued or shut down. Flag earnings numbers ("make $10k/mo"), guarantees ("guaranteed results"), implied-typical outcomes, testimonials used as proof of what a normal buyer will achieve, "results not typical" used as a fig leaf, and any health/income/weight outcome stated as a promise. The test: *does this claim a result the average buyer probably won't get?* If so, it needs reframing or substantiation. 2. **CAN-SPAM: the stuff that's legally mandatory.** A commercial email must have: a non-deceptive subject and "From" identity, a working unsubscribe mechanism, a valid physical postal address, and clear identification of who's sending. If the ESP auto-appends the unsubscribe and address (see Setup assumptions above), focus this check on subject/"From" deception and clear sender identification, which live in the body. 3. **ESP acceptable-use: what gets the sending account banned.** Klaviyo, Mailchimp, ActiveCampaign and the like prohibit a lot of "make money online" / get-rich / affiliate-bait content outright. Copy can be perfectly legal and still violate the ESP's terms, and a ban takes the whole list down with it. Flag content that reads like the categories these platforms reject. 4. **GDPR / CASL: consent and identity for EU/Canada recipients.** Watch for copy that implies cold-emailing people who never opted in, or that's missing the sender identification these laws require. If the list might include EU or Canadian contacts, this is real exposure. 5. **Subject + preview check.** Deceptive or bait-and-switch framing, fake "Re:" / "Fwd:", false urgency ("FINAL NOTICE"), ALL-CAPS, and pileups of `!!!` or `$$$`. These hurt both compliance (deception) and deliverability. 6. **Deliverability / spam-score.** Spam-trigger vocabulary, a bad text-to-link or text-to-image ratio, link text that hides its real destination, and URL shorteners. None of this is illegal. It just sends the email to the junk folder with no warning, which is its own kind of failure. ## Step 3: Write the output Use this structure exactly, once per email (label each one if reviewing a batch): ``` ## Email: [subject line or a short label] ### Risk findings [For each issue, in descending severity:] **[HIGH | MEDIUM | LOW]: [Rule name, e.g. "FTC: unsubstantiated earnings claim"]** > "[exact text quoted from the email]" Why it's a problem: [one or two sentences] Compliant rewrite: [the fixed line, still on-voice] ### Structural checklist - Subject (non-deceptive): ✓ / ✗ - Preview text present: ✓ / ✗ - Unsubscribe mechanism: ✓ / ✗ [use "✓ (auto-appended by ESP)" if that applies] - Physical mailing address: ✓ / ✗ [same] - Sender clearly identified: ✓ / ✗ ### Clean version [The full email, every fix applied, missing required elements inserted as placeholders like [Physical Mailing Address] or a standard unsubscribe line.] ``` If an email is fully clean, say so plainly instead of manufacturing nitpicks. False positives train the user to ignore you. ## How to rewrite: keep the sell, lose the risk The whole value here is rewrites that a marketer would actually ship. Principles: - **Reframe income/results claims, don't delete them.** The persuasive job of "make $10k/mo" can usually be done legally by shifting from a *promise* to a *possibility, process, or properly-attributed example*. The point is to keep the aspiration while removing the implied guarantee. - "You'll make $10k in your first month" → "The goal of the system is to help you build toward your first $10k month. How fast you get there depends on the work you put in." - "My students make $20k/mo" → "Some of my students have hit $20k months. Results vary and depend on effort, skill, and market. Most people won't match the top performers, and that's normal." - **Match the original voice.** If the copy is punchy and casual, the rewrite is punchy and casual. Compliant ≠ stiff. - **When a claim can't be saved, say so.** Some lines have no compliant version that keeps the same meaning (e.g. a flat "guaranteed to work or you'll be rich"). Don't contort it. Tell the user it has to go and explain why, and offer the closest legitimate angle. - **Handle the footer to match the setup.** If the user's ESP auto-appends the unsubscribe line and physical address, end the clean version at the signature. If it doesn't, or you don't know, include both, using a placeholder like [Physical Mailing Address] and a standard unsubscribe line. ## Reference files - `references/rules.md`: CAN-SPAM required elements, FTC income-claim do/don't list, ESP-prohibited content categories, GDPR/CASL consent basics. Read it before judging borderline cases so your rule citations are accurate. - `references/spam-triggers.md`: spam-trigger words and deliverability patterns. Skim it when running checks 5 and 6.