diff --git a/site/src/pages/warmup.astro b/site/src/pages/warmup.astro index 8ddf955a..078cb689 100644 --- a/site/src/pages/warmup.astro +++ b/site/src/pages/warmup.astro @@ -86,180 +86,124 @@ const faq = [
+ -
+
-
The ramp · 30 days
-
One mailbox, day 1 to ceiling.
-

- Each day the mailbox sends one more warmup message than yesterday. After 30 days at +1/day from a 10/day floor, it reaches the 40/day ceiling and holds. Total: 775 warmup sends in 30 days. -

+
First 30 days · one mailbox
+
Day 1 sends 10. Day 30 sends 40. Every day in between is +1.
-
- volume / day - ceiling + +
+ Less +
+ + + + + +
+ More
- -
- -
- - - - - - - + +
+
+ +
+ +
+
+ {['M', 'T', 'W', 'T', 'F', 'S', 'S'].map((d, i) => ( +
= 5 ? 'text-muted-foreground/40' : 'text-muted-foreground/70'}`}>{d}
+ ))} +
- - {[10, 20, 30, 40].map((v) => ( - - - {v} - - ))} + + {[0, 1, 2, 3, 4].map((wk) => ( +
+
W{wk + 1}
+ {[0, 1, 2, 3, 4, 5, 6].map((dow) => { + const calDay = wk * 7 + dow + 1; // 1..35 + const isWeekend = dow >= 5; + // Map calendar day → business day (skip weekends), business day → volume + const bizDayCount = Array.from({ length: calDay }, (_, i) => i).filter((d) => { + const dDow = d % 7; + return dDow < 5; + }).length; + const volume = Math.min(9 + bizDayCount, 40); + const inactive = calDay > 30 || isWeekend; - - {[7, 14, 21].map((d) => ( - - ))} + // Color tier + let bg = '#f1f5f9'; + let textColor = '#94a3b8'; + if (!inactive) { + if (volume >= 40) { bg = '#075985'; textColor = '#ffffff'; } + else if (volume >= 30) { bg = '#0284c7'; textColor = '#ffffff'; } + else if (volume >= 20) { bg = '#38bdf8'; textColor = '#0c4a6e'; } + else if (volume >= 15) { bg = '#7dd3fc'; textColor = '#0c4a6e'; } + else { bg = '#e0f2fe'; textColor = '#075985'; } + } else if (isWeekend && calDay <= 30) { + bg = '#f8fafc'; + textColor = '#cbd5e1'; + } - - - ceiling · 40 / day - - - { - const v = Math.min(10 + day, 40); - const x = 40 + (day / 30) * 660; - const y = 300 - (v / 50) * 280; - return x + ',' + y; - }).join(' ') + ' 700,300'} - fill="url(#rampFill)" - /> - { - const v = Math.min(10 + day, 40); - const x = 40 + (day / 30) * 660; - const y = 300 - (v / 50) * 280; - return x + ',' + y; - }).join(' ')} - fill="none" - stroke="#0284c7" - stroke-width="2" - /> - - - {Array.from({ length: 31 }, (_, day) => { - const v = Math.min(10 + day, 40); - const x = 40 + (day / 30) * 660; - const y = 300 - (v / 50) * 280; - return ; - })} - - - - - Day 1 · 10/d - - - - Wk 1 · 17/d - - - - Day 30 · 40/d - - - - {[0, 7, 14, 21, 30].map((d) => ( - D{d} - ))} - -
- - -
-
Week by week
-
- {[ - { wk: 'Week 1', range: 'D1–D7', start: 10, end: 16, total: 91, status: 'Initial ramp' }, - { wk: 'Week 2', range: 'D8–D14', start: 17, end: 23, total: 140, status: 'Building reputation' }, - { wk: 'Week 3', range: 'D15–D21', start: 24, end: 30, total: 189, status: 'Provider learning' }, - { wk: 'Week 4', range: 'D22–D28', start: 31, end: 37, total: 238, status: 'Approaching ceiling' }, - { wk: 'Week 5', range: 'D29–D30', start: 38, end: 40, total: 117, status: 'At ceiling', featured: true }, - ].map((w) => ( -
-
-
{w.wk}
-
{w.range}
-
-
- {w.start}{w.end} /d -
-
-
{w.total}
-
total sends
-
+ return ( +
+
+ {calDay <= 30 ? ( + <> +
D{calDay}
+
+ {isWeekend ? '—' : volume} +
+ + ) : null} +
+
+ ); + })}
))} + +
+ Weekend · no send + Active warmup day + At ceiling +
-
-
-
775
-
Total sends · 30d
+ +
+
+
Day 1 send
+
10/d
-
-
30%
-
Reply rate target
+
+
Daily ramp
+
+1/d
-
-
~10m
-
Avg send gap
+
+
Ceiling reached
+
Day 30
-
-
9–5
-
Window · recipient TZ
+
+
Total sends
+
~550
- -
-
- Day-by-day volume - Each cell = sends scheduled that day -
-
-
- {Array.from({ length: 30 }, (_, i) => { - const day = i + 1; - const v = Math.min(9 + day, 40); - const pct = (v - 10) / 30; - const atCeiling = v >= 40; - return ( -
-
-
{day}
-
- ); - })} -
-
+ +
+ Weekends are skipped. Business-hour scheduling by recipient time zone. ~10 minute average gap between sends from the same mailbox.
@@ -622,19 +566,41 @@ const faq = [ Want the full mental model? Read the warmup guide.

-
+
{faq.map(([q, a]) => ( -
- +
+
-

{a}

-
+ +
+
+

{a}

+
+
+
))}
+ +