hc: consistent striped official-record card + wire past-due overdue variant

- Upgrade the plain teal record banner to the authoritative barber-pole 'Official
  record' banner in the personal/turnover/overdue-personal templates (the switch
  to personal templates had dropped the striped look from live revalidation sends).
- nppes_outdated: replace plain info table with the striped 'Official record -
  NPPES NPI Registry' card (status honestly labeled as our compliance flag).
- Wire revalidation_overdue -> hc_revalidation_overdue_personal.html with a direct
  past-due subject ('Your Medicare revalidation is past due - let's get it filed')
  and PAST DUE status + days-overdue in the record card; due_soon stays warm.
- Striped card now on all 7 templates that show a real record; oig_screening and
  compliance_bundle correctly omit it (no specific record to display).
This commit is contained in:
justin 2026-06-13 21:55:50 -05:00
parent 7b69b5c314
commit d1a9260854
5 changed files with 148 additions and 11 deletions

View file

@ -21,13 +21,33 @@
<div style="font-size:13px;color:#065f46;line-height:1.7;">Payers, clearinghouses, and CMS pull from NPPES. A stale address, taxonomy, or contact can cause <strong>claim denials, mail you never receive, and failed credentialing</strong>. CMS also requires you to attest your NPPES data periodically.</div> <div style="font-size:13px;color:#065f46;line-height:1.7;">Payers, clearinghouses, and CMS pull from NPPES. A stale address, taxonomy, or contact can cause <strong>claim denials, mail you never receive, and failed credentialing</strong>. CMS also requires you to attest your NPPES data periodically.</div>
</td></tr></table> </td></tr></table>
<!-- Detail row --> <!-- Official-record card: NPPES is fully public, so this mirrors the registry. -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;font-size:13px;"> <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;">
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:10px 0;color:#6b7280;">NPI</td><td style="padding:10px 0;font-weight:600;text-align:right;">{{ .Subscriber.Attribs.npi }}</td></tr> <tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:10px 0;color:#6b7280;">Practice</td><td style="padding:10px 0;font-weight:600;text-align:right;">{{ .Subscriber.Attribs.practice }}</td></tr> <table role="presentation" width="100%" cellpadding="0" cellspacing="0">
<tr><td style="padding:10px 0;color:#6b7280;">Our service fee</td><td style="padding:10px 0;font-weight:700;text-align:right;color:#047857;">$349</td></tr> <tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record &middot; NPPES NPI Registry</p>
</td></tr>
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Registered to</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
<tr><td style="padding:9px 0;color:#64748b;">Record status</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">FLAGGED OUT OF DATE</td></tr>
</table>
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: NPPES NPI Registry (npiregistry.cms.hhs.gov). Staleness flagged by our compliance monitoring &mdash; confirm on the official registry below.</p>
</td></tr>
</table>
</td></tr>
</table> </table>
<!-- Service fee -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;padding:14px 18px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0"><tr>
<td style="font-size:13px;color:#6b7280;">Our service fee to update it for you</td>
<td style="font-size:22px;font-weight:800;text-align:right;color:#047857;white-space:nowrap;">$349</td>
</tr></table>
</td></tr></table>
<!-- Verify-it-yourself: the NPPES registry is fully public, so the provider <!-- Verify-it-yourself: the NPPES registry is fully public, so the provider
can confirm their own record (and its staleness) on the government site. can confirm their own record (and its staleness) on the government site.
Nothing is more convincing than the official source. --> Nothing is more convincing than the official source. -->

View file

@ -0,0 +1,117 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
<center>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
<!-- Header -->
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
<h1 style="color:#fff;margin:0;font-size:21px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Your Medicare revalidation is past due</h1>
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Let's get it filed before your billing privileges are affected</p>
</td></tr>
<!-- Body -->
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
<p style="font-size:15px;margin:0 0 16px;line-height:1.6;">Hi {{ .Subscriber.Name }},</p>
<p style="font-size:14px;line-height:1.75;margin:0 0 16px;">Whoever last handled the Medicare enrollment for <strong>{{ .Subscriber.Attribs.practice }}</strong> may have moved on &mdash; front-office and billing staff turn over often, and revalidation deadlines are the kind of thing that quietly fall through the cracks when they do.</p>
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">That is exactly what we keep an eye on, so it does not become your problem. Here is where your enrollment stands right now:</p>
<!-- CMS record card: data straight from the CMS Revalidation Due Date List -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;">
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record &middot; CMS Medicare Revalidation Due Date List</p>
</td></tr>
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Provider / NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Enrolled as</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Revalidation due date</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">{{ .Subscriber.Attribs.reval_due_date }}</td></tr>
<tr><td style="padding:9px 0;color:#64748b;">Status</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">PAST DUE &middot; {{ .Subscriber.Attribs.days_overdue }} days overdue</td></tr>
</table>
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: CMS Revalidation Due Date List (data.cms.gov), refreshed monthly.</p>
</td></tr>
</table>
</td></tr>
</table>
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">Because the deadline has already passed, this is time-sensitive: when a revalidation stays unfiled, CMS deactivates Medicare billing privileges &mdash; claims stop paying and the provider has to re-enroll from scratch, losing the original effective date. <strong>The good news is it is still fixable, and the sooner we file, the better your chances of avoiding a gap.</strong> CMS can take several weeks to process, so the earlier we begin, the more room there is to get you current before any disruption.</p>
<!-- How it works -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
<h3 style="margin:0 0 10px;font-size:15px;color:#0f766e;font-weight:700;">We do the work &mdash; you barely lift a finger</h3>
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0 0 10px;">We complete the full PECOS revalidation and track it through to confirmation. <strong>You never share a password and you never have to log in or chase a two-factor code.</strong> The only thing we may need is a one-minute e-signature on a secure link.</p>
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0;">No matter who handled it before, we will make sure it gets done right.</p>
</td></tr></table>
<!-- Verify-it-yourself -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 18px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Want to confirm the date yourself?</p>
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Look up NPI <strong>{{ .Subscriber.Attribs.npi }}</strong> on the public CMS Medicare Revalidation List and you will see the same due date shown above.</p>
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;padding:10px 22px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Verify on CMS.gov &#8599;</a>
</td></tr></table>
<!-- CTA -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">Let us get your past-due revalidation filed right away.</p>
<p style="font-size:12px;color:#047857;margin:0 0 14px;">We submit most filings within 1-2 business days, then track it through CMS processing to confirmation.</p>
<a href="https://performancewest.net/order/npi-revalidation?npi={{ .Subscriber.Attribs.npi }}" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Handle my revalidation &rarr;</a>
</td></tr></table>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
<strong>Questions, or want to hand off your filings going forward?</strong> Just reply to this email or call <strong>(888) 411-0383</strong>. We are a dedicated healthcare compliance firm and we are happy to be the people who keep track of this for you.
</td></tr></table>
<!-- Personal guarantee from the founder: photo links to the About page so
readers can confirm a real person stands behind the work. -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
<tr>
<td width="92" valign="top" style="padding-right:16px;">
<a href="https://performancewest.net/about">
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
</a>
</td>
<td valign="top">
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">&ldquo;If we file your revalidation and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.&rdquo;</p>
<p style="margin:0;">
<a href="https://performancewest.net/about" style="text-decoration:none;">
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
</a>
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
<span style="font-size:12px;color:#64748b;">Founder &amp; Principal Consultant, Performance West Inc.</span>
</p>
</td>
</tr>
</table>
</td></tr></table>
<!-- Trust signals + true social proof -->
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
<tr>
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">&#128737;&#65039; SOC 2 Type II hosting</span>
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">&#9989; HIPAA &amp; PCI compliant</span>
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">&#128274; 256-bit TLS encrypted</span>
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">&#128179; Secure payment by Stripe</span>
</td>
</tr>
<tr>
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
<strong style="color:#047857;">100% satisfaction guarantee</strong> &middot; fixed pricing, no billable hours &middot; trusted by providers nationwide
</td>
</tr>
</table>
</td></tr>
<!-- Footer -->
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
<p style="margin:0;">Performance West Inc. &middot; 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 &middot; <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
</td></tr>
</table></td></tr></table></center></body></html>

View file

@ -22,8 +22,8 @@
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;"> <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;">
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;"> <tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0"> <table role="presentation" width="100%" cellpadding="0" cellspacing="0">
<tr><td style="background:#0f766e;padding:0;"> <tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
<p style="margin:0;padding:11px 16px;font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">CMS Medicare Revalidation Due Date List</p> <p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record &middot; CMS Medicare Revalidation Due Date List</p>
</td></tr> </td></tr>
<tr><td style="background:#f8fafc;padding:6px 16px 14px;"> <tr><td style="background:#f8fafc;padding:6px 16px 14px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;"> <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">

View file

@ -22,8 +22,8 @@
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;"> <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;">
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;"> <tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0"> <table role="presentation" width="100%" cellpadding="0" cellspacing="0">
<tr><td style="background:#0f766e;padding:0;"> <tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
<p style="margin:0;padding:11px 16px;font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">CMS Medicare Revalidation Due Date List</p> <p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record &middot; CMS Medicare Revalidation Due Date List</p>
</td></tr> </td></tr>
<tr><td style="background:#f8fafc;padding:6px 16px 14px;"> <tr><td style="background:#f8fafc;padding:6px 16px 14px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;"> <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">

View file

@ -51,8 +51,8 @@ OUT_DIR = os.path.join(os.path.dirname(__file__), "..", "data", "hc_campaigns")
# selector which warmup-CSV rows belong to this segment (see cron) # selector which warmup-CSV rows belong to this segment (see cron)
SEGMENTS = { SEGMENTS = {
"revalidation_overdue": { "revalidation_overdue": {
"subject": "Let's make sure your Medicare revalidation is handled in time", "subject": "Your Medicare revalidation is past due - let's get it filed",
"template": "hc_revalidation_personal.html", "template": "hc_revalidation_overdue_personal.html",
"cta_path": "/order/npi-revalidation", "cta_path": "/order/npi-revalidation",
"price": "$599", "price": "$599",
"list_name": "HC Warmup - Revalidation Overdue", "list_name": "HC Warmup - Revalidation Overdue",