Signal/pitch/assets/signal-market-opportunity.html
Kisa 42a79c6682 add pitch assets, fix UI and backend bugs, add test utilities
- add 3 signal pitch assets (workflow flowchart, market opportunity, win-win-win) as HTML + PNG
- fix doc_state_machine cascade and supplied sentinel flags
- fix CSVImport mapping review, WorklistTable colored bullets and expand row
- fix App.jsx auth gate, api.js CORS handling
- add signal E2E test script and stress test generator

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 12:52:29 -04:00

238 lines
10 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Signal — Market Opportunity</title>
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Plus Jakarta Sans', sans-serif;
background: #F0EAE1;
width: 1080px; height: 1080px;
overflow: hidden; position: relative;
}
.top-bar { position: absolute; top: 0; left: 0; right: 0; height: 5px; background: #2EA3A3; }
.signal-brand { position: absolute; top: 28px; right: 80px; text-align: right; z-index: 3; }
.brand-name { font-size: 18px; font-weight: 800; color: #1A5050; letter-spacing: 0.02em; }
.brand-sub { font-size: 9px; font-weight: 500; color: #8AABAB; letter-spacing: 0.12em; text-transform: uppercase; margin-top: 3px; }
.rings { position: absolute; top: 0; right: 0; pointer-events: none; }
.dots { position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; opacity: 0.16; }
.footer { position: absolute; bottom: 22px; left: 70px; right: 70px; display: flex; justify-content: space-between; }
.footer span { font-size: 10px; color: #8AABAB; font-weight: 500; }
.content {
position: absolute;
top: 68px; left: 70px; right: 70px; bottom: 50px;
display: flex; flex-direction: column;
}
.headline { flex-shrink: 0; margin-bottom: 28px; }
.headline .eyebrow {
font-size: 11px; font-weight: 700; letter-spacing: 0.14em;
text-transform: uppercase; color: #CB6B20; margin-bottom: 8px;
}
.headline h1 { font-size: 34px; font-weight: 800; color: #1A5050; letter-spacing: -0.02em; line-height: 1.1; }
.headline p { font-size: 14px; color: #5A7A7A; margin-top: 8px; font-weight: 500; }
/* Three big stat blocks */
.stat-row {
display: flex; gap: 16px; flex-shrink: 0; margin-bottom: 20px;
}
.stat-block {
flex: 1; padding: 20px 18px; border-radius: 10px;
display: flex; flex-direction: column;
}
.stat-block.dark { background: #1A5050; }
.stat-block.mid { background: #E5EFEF; border: 1.5px solid #2EA3A3; }
.stat-block.warm { background: #F5EDE0; border: 1.5px solid #CB6B20; }
.stat-block .num {
font-size: 44px; font-weight: 800; line-height: 1; margin-bottom: 6px;
}
.stat-block.dark .num { color: #2EA3A3; }
.stat-block.mid .num { color: #1A5050; }
.stat-block.warm .num { color: #CB6B20; }
.stat-block .label {
font-size: 13px; font-weight: 600; line-height: 1.35;
}
.stat-block.dark .label { color: rgba(255,255,255,0.85); }
.stat-block.mid .label { color: #1A5050; }
.stat-block.warm .label { color: #6A3810; }
.stat-block .source {
font-size: 9.5px; font-weight: 500; margin-top: 8px; opacity: 0.6;
}
.stat-block.dark .source { color: #fff; }
.stat-block.mid .source { color: #1A5050; }
.stat-block.warm .source { color: #6A3810; }
/* The research paradox call-out */
.paradox {
flex-shrink: 0;
background: #1A5050;
border-radius: 10px;
padding: 20px 24px;
display: flex;
align-items: center;
gap: 24px;
margin-bottom: 20px;
}
.paradox-number {
font-size: 52px; font-weight: 800; color: #2EA3A3;
line-height: 1; flex-shrink: 0;
}
.paradox-text { flex: 1; }
.paradox-text .p-headline {
font-size: 15px; font-weight: 700; color: #fff; line-height: 1.3; margin-bottom: 6px;
}
.paradox-text .p-sub {
font-size: 12px; color: rgba(255,255,255,0.7); font-weight: 500; line-height: 1.4;
}
.paradox-divider {
width: 1px; background: rgba(255,255,255,0.15); align-self: stretch; flex-shrink: 0;
}
.paradox-signal { flex-shrink: 0; text-align: center; padding-left: 8px; }
.paradox-signal .ps-label { font-size: 10px; font-weight: 600; color: rgba(255,255,255,0.5); letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 6px; }
.paradox-signal .ps-value { font-size: 28px; font-weight: 800; color: #CB6B20; line-height: 1; }
.paradox-signal .ps-sub { font-size: 11px; color: rgba(255,255,255,0.6); margin-top: 4px; font-weight: 500; }
/* Opportunity grid */
.opp-grid {
flex: none;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 14px;
}
.opp-card {
background: #EAE4DB;
border-radius: 8px;
padding: 18px 16px;
}
.opp-card .opp-accent {
height: 3px; border-radius: 2px; margin-bottom: 12px;
}
.opp-card .opp-accent.teal { background: #2EA3A3; }
.opp-card .opp-accent.copper { background: #CB6B20; }
.opp-card .opp-accent.dark { background: #1A5050; }
.opp-card .opp-title { font-size: 13px; font-weight: 800; color: #1A5050; margin-bottom: 7px; line-height: 1.25; }
.opp-card .opp-desc { font-size: 11.5px; color: #5A6A6A; font-weight: 500; line-height: 1.45; }
</style>
</head>
<body>
<div class="top-bar"></div>
<svg class="rings" width="1080" height="1080" viewBox="0 0 1080 1080" xmlns="http://www.w3.org/2000/svg">
<circle cx="920" cy="130" r="110" fill="none" stroke="#CB6B20" stroke-width="0.8" opacity="0.12"/>
<circle cx="920" cy="130" r="60" fill="none" stroke="#CB6B20" stroke-width="1.0" opacity="0.26"/>
<circle cx="920" cy="130" r="9" fill="#CB6B20" opacity="0.82"/>
</svg>
<svg class="dots" width="1080" height="1080" viewBox="0 0 1080 1080" xmlns="http://www.w3.org/2000/svg">
<defs>
<radialGradient id="fade" cx="89%" cy="12%" r="70%">
<stop offset="0%" stop-color="#1A5050" stop-opacity="1"/>
<stop offset="100%" stop-color="#1A5050" stop-opacity="0"/>
</radialGradient>
<pattern id="hex" x="0" y="0" width="24" height="20.8" patternUnits="userSpaceOnUse">
<circle cx="12" cy="4" r="1.4" fill="#1A5050"/>
<circle cx="0" cy="10.4" r="1.4" fill="#1A5050"/>
<circle cx="24" cy="10.4" r="1.4" fill="#1A5050"/>
<circle cx="12" cy="16.8" r="1.4" fill="#1A5050"/>
</pattern>
<mask id="rm"><rect width="1080" height="1080" fill="url(#fade)"/></mask>
</defs>
<rect width="1080" height="1080" fill="url(#hex)" mask="url(#rm)"/>
</svg>
<div class="signal-brand">
<div class="brand-name">Signal.</div>
<div class="brand-sub">Powered by STTIL Solutions</div>
</div>
<div class="content">
<div class="headline">
<div class="eyebrow">Market Opportunity</div>
<h1>A solvable problem hiding<br>in plain sight</h1>
<p>CGM documentation errors are predictable, traceable, and preventable — before the claim is ever filed.</p>
</div>
<!-- Three big stats -->
<div class="stat-row">
<div class="stat-block dark">
<div class="num">1 in 3</div>
<div class="label">CGM claims contains a documentation error at the time of review</div>
<div class="source">CMS CERT Report 2019</div>
</div>
<div class="stat-block mid">
<div class="num">68%</div>
<div class="label">Of those errors originate with the prescribing provider — not the supplier</div>
<div class="source">CMS CERT Report 2019</div>
</div>
<div class="stat-block warm">
<div class="num">~25%</div>
<div class="label">Of CGM supplies shipped when documentation fails to pass — at or below cost</div>
<div class="source">DMEPOS supplier operations data</div>
</div>
</div>
<!-- Research paradox -->
<div class="paradox">
<div class="paradox-number">$400M+</div>
<div class="paradox-text">
<div class="p-headline">The research paradox: suppliers already pay to document the problem Signal solves.</div>
<div class="p-sub">Staff time spent chasing records, filing appeals, and managing write-offs exceeds $400M annually across the DMEPOS supply chain. Signal redirects that spend from reactive to proactive.</div>
</div>
<div class="paradox-divider"></div>
<div class="paradox-signal">
<div class="ps-label">Signal cost</div>
<div class="ps-value">$1,788</div>
<div class="ps-sub">per supplier / year<br>Worklist tier</div>
</div>
</div>
<!-- Opportunity grid -->
<div class="opp-grid" style="margin-bottom:16px;">
<div class="opp-card">
<div class="opp-accent teal"></div>
<div class="opp-title">6,000+ DMEPOS suppliers</div>
<div class="opp-desc">All face the same documentation compliance burden under CMS LCD L33822 and payer-specific prior authorization requirements.</div>
</div>
<div class="opp-card">
<div class="opp-accent copper"></div>
<div class="opp-title">CGM is the beachhead</div>
<div class="opp-desc">High denial rate, defined LCD requirements, and a 6-month qualifying visit cycle create a repeating, automatable compliance event.</div>
</div>
<div class="opp-card">
<div class="opp-accent dark"></div>
<div class="opp-title">Every DMEPOS category follows</div>
<div class="opp-desc">Oxygen, wound care, power mobility — same documentation burden, same denial patterns. Signal's model extends to each.</div>
</div>
</div>
<!-- Bottom thesis bar -->
<div style="flex:1;display:flex;flex-direction:column;justify-content:flex-end;padding-bottom:8px;">
<div style="background:#2EA3A3;border-radius:10px;padding:18px 26px;display:flex;align-items:center;gap:24px;">
<div style="flex:1;">
<div style="font-size:15px;font-weight:700;color:#fff;line-height:1.45;">No new infrastructure. No vendor integration. No change management. Suppliers upload one CSV and Signal surfaces every gap — before a single claim is filed.</div>
</div>
<div style="flex-shrink:0;text-align:center;padding-left:20px;border-left:1px solid rgba(255,255,255,0.25);">
<div style="font-size:10px;font-weight:700;color:rgba(255,255,255,0.6);letter-spacing:0.1em;text-transform:uppercase;margin-bottom:5px;">Time to first value</div>
<div style="font-size:38px;font-weight:800;color:#fff;line-height:1;">Day 1</div>
<div style="font-size:10.5px;color:rgba(255,255,255,0.65);margin-top:3px;font-weight:500;">Upload a CSV.<br>See the gaps.</div>
</div>
</div>
</div>
</div>
<div class="footer">
<span>signal.sttilsolutions.com</span>
<span>Sources: CMS CERT 2019 &nbsp;&middot;&nbsp; DMEPOS operations data &nbsp;&middot;&nbsp; &copy; 2026 STTIL Solutions LLC</span>
</div>
</body>
</html>