new-site/docs/healthcare-email-compliance-review.md
justin 3325259af7 fix(email): drop @TrackLink from per-subscriber CTAs (404 + collapse bug)
Listmonk @TrackLink registers ONE static URL per tracked link and points
every recipient's /link/<uuid> redirect at it. On per-subscriber hrefs
({{ lp_link }}, ?dot=, ?npi=, ?clia=) this is doubly broken:
 - the registered links.url was captured before the {{ lp_link }} token
   rendered, yielding /order/slug&utm_source=... (first &, no ?) -> 404
 - even when valid it collapses every carrier/provider onto the first
   subscriber's dot/npi/clia value

Real human clicks are already tracked via Umami campaign-click (bot
filtered), so Listmonk link tracking here is redundant and destructive.

Stripped @TrackLink from per-subscriber CTAs:
 - scripts/create_deficiency_source_campaigns.py (_cta, _dot_check_cta)
 - data/trucking_campaigns/{ucr,ifta}_*.html
 - data/hc_campaigns/*.html (10 templates)

Static CTAs (e.g. CRTC ?code= order link) keep @TrackLink (safe).
Live fix to the 10 broken registered links.url rows applied separately
(first & -> ?), backup in listmonk.pw_links_dkim_fix_bak_20260622.

Docs: new runbook incident section + corrected the disproven
'use @TrackLink on all CTAs' guidance in fmcsa/hc plans.
2026-06-22 17:01:39 -05:00

104 lines
6.5 KiB
Markdown

# Healthcare cold-email compliance review (2026-06-20)
Reviewed all 10 templates in `data/hc_campaigns/` after removing prices, fixing
click tracking, and de-risking unsubstantiated status claims.
## Scope of the pass
1. **Removed all service prices** from the emails (price is now revealed on the
order page, after value is established). Catalog (`api/src/service-catalog.ts`)
remains the source of truth.
2. **Click tracking** — originally appended `@TrackLink` + UTM to every conversion
CTA. **SUPERSEDED (Jun 22 2026):** `@TrackLink` must NOT be used on per-provider
hrefs (`?npi=`/`?clia=`/`{{ lp_link }}`) — Listmonk registers one static URL per
tracked link, which 404s and collapses every provider onto one NPI. `@TrackLink`
removed from all HC templates; per-provider links render directly and human clicks
are tracked via Umami `campaign-click`. See runbook "Jun 22 2026 — @TrackLink on
per-subscriber CTAs."
3. **Reframed unsubstantiated per-record status assertions** to honest, hedged,
generally-true statements (defamation / FTC-deception risk).
4. This compliance review.
## Compliance posture — item by item
### CAN-SPAM (US) — PASS
- **Physical postal address** present in every footer (Performance West Inc., 525
Randall Ave Ste 100-1195, Cheyenne, WY 82001). ✓
- **Unsubscribe** present in every template + `List-Unsubscribe` /
`List-Unsubscribe-Post` one-click headers set by the build script. ✓
- **No deceptive subject lines** — subjects are hedged ("may be out of date",
"appears deactivated", "Are you screening for…"). ✓
- **Accurate From / Reply-To** — `FROM_EMAIL` / `REPLY_TO` real, monitored. ✓
### Truth-in-advertising / FTC deception — FIXED
The biggest risk was **asserting a specific provider's record status as fact when
we don't actually measure it**. Addressed:
| Template | Was | Now |
|---|---|---|
| `nppes_outdated` | "record … appears **out of date**", header "Outdated registry information **detected**", row "**FLAGGED OUT OF DATE**", footnote "Staleness **flagged by our compliance monitoring**" | General true statement ("most practices drift out of date over time"), header "NPPES Data Check / keep your record current & attested", row "**PERIODIC REVIEW REQUIRED**", footnote cites the real CMS periodic-attestation requirement |
| `npi_reactivation` | header "Deactivated enrollment **detected**", body "**flagged** … as deactivated" | header "Provider Enrollment Check", body "**may be** deactivated … worth confirming on the official sources" |
**Why this matters:** the `nppes_outdated` audience selector (`institutional_verified`)
only checks **deliverability**, never staleness — and the harvested data has **no
NPPES last-updated field**, so a per-record "out of date / FLAGGED" claim was
literally unsubstantiated for every recipient. Now the copy is true for everyone
(CMS does require periodic NPPES attestation) and still invites them to self-verify.
### Substantiated claims that were KEPT (verified backed by data)
- `revalidation_overdue` "**is past due** / PAST DUE · N days overdue" — **OK**: the
`reval_overdue` selector requires `reval_status == "overdue"` AND a real overdue
day count derived from the **public CMS Revalidation Due Date List**. The email
also links the provider to that exact government list to self-verify. Legitimate.
- `revalidation_due_soon` "deadline is coming up" — backed by `reval_status ==
"upcoming"` from the same CMS list. ✓
- OIG "**civil monetary penalties up to $20,000 per claim**" — this is a real OIG
penalty figure (kept; it is a regulatory fact, not a price). ✓
### Government-affiliation / impersonation — PASS
- Every template carries the disclaimer **"Performance West is an independent
compliance firm, not affiliated with CMS / Medicare / OIG / SAM.gov."** ✓
- "Official record · CMS Medicare Revalidation Due Date List" refers to the **CMS
public dataset we cite** (and link to), not a claim that we are CMS. The
"Don't take our word for it — check the official CMS record" framing reinforces
that we are pointing them AT the government source, not posing as it. ✓
- No CMS/HHS logos, seals, or government-lookalike sender identity. ✓
### "No-login / done-for-you" claims — PASS (already vetted)
- Matches the verified capability map in `docs/healthcare-no-login-value-add.md`
and `docs/healthcare-filing-tiers-verified.md`. The one honesty caveat (the
provider must personally **sign** the 855; we cannot sign for them) is respected:
copy says "the only thing we may need is a one-minute e-signature," never claims
we sign on their behalf. ✓
### Guarantee / absolute-language scan — ACCEPTABLE
Scanner flagged `guarantee / never / 100% / will not`. Reviewed in context — all
benign and substantiable:
- "**100% satisfaction guarantee**" + "we'll make it right" — standard puffery /
service promise, paired with "fixed pricing, no billable hours." Acceptable.
- "You **never** share your password / you **will not** pay billable hours" —
factual descriptions of how the service works, not outcome guarantees. ✓
- No claims guaranteeing a CMS approval/outcome (which WOULD be a problem). ✓
### Trust/credibility badges — VERIFY (flag for owner)
Footers assert **"SOC 2 Type II hosting · HIPAA & PCI compliant · 256-bit TLS."**
These are factual compliance claims and must be **literally true**:
- ⚠️ **Action for Justin:** confirm we can substantiate SOC 2 Type II + HIPAA + PCI
(or soften to "encrypted, secure Stripe payments" if any is aspirational). False
compliance badges are an FTC and contractual risk. Not changed in this pass —
needs owner confirmation.
## HTML / deliverability QA — PASS
- All 10 templates render with **0 JS errors** headless, each has **exactly one
per-provider `/order/...` CTA** (direct link, `@TrackLink` removed Jun 22 2026 —
see item 2), and **no price leaks** (only the $20,000 OIG penalty stat remains,
intentionally).
- External self-verify links (oig.hhs.gov, sam.gov, npiregistry, data.cms.gov) left
**untracked** on purpose (they're trust links, not conversions).
## Outstanding (not blocking, recommended next)
1. **Confirm SOC 2 / HIPAA / PCI badge claims** are literally true (above).
2. **OIG $79/mo & NPPES $349 pricing** flagged as high/hard in
`docs/healthcare-competitive-pricing.md` — consider a one-time OIG entry option
and a lower NPPES anchor. (Pricing strategy, separate from compliance.)
3. **Add the free `/tools/npi-compliance-check`** as a soft secondary CTA / lead
magnet so non-buyers are captured and nurtured (funnel, separate effort).