diff --git a/site/src/pages/index.astro b/site/src/pages/index.astro index cd849395..f1f02e6a 100644 --- a/site/src/pages/index.astro +++ b/site/src/pages/index.astro @@ -2,11 +2,18 @@ import Layout from '../layouts/Layout.astro'; import Icon from '../components/Icon.astro'; import DashboardMock from '../components/DashboardMock.astro'; -import InboxMock from '../components/InboxMock.astro'; -import WarmupMock from '../components/WarmupMock.astro'; import HeroAtmosphere from '../components/HeroAtmosphere.astro'; -import SequenceMock from '../components/SequenceMock.astro'; -import SectionSky from '../components/SectionSky.astro'; +import FeatureSection from '../components/FeatureSection.astro'; +import CampaignBuilderMock from '../components/CampaignBuilderMock.astro'; +import ScheduleMock from '../components/ScheduleMock.astro'; +import UniboxMock from '../components/UniboxMock.astro'; +import AnalyticsMock from '../components/AnalyticsMock.astro'; +import AIAssistantMock from '../components/AIAssistantMock.astro'; +import IntegrationsMock from '../components/IntegrationsMock.astro'; +import DeveloperMock from '../components/DeveloperMock.astro'; +import CRMMock from '../components/CRMMock.astro'; +import TemplatingShowcase from '../components/TemplatingShowcase.astro'; +import ChangelogShowcase from '../components/ChangelogShowcase.astro'; const compare = [ ['Per-mailbox cold cap', '50 / day default', '200 / day if you ask for it'], @@ -214,406 +221,158 @@ const softwareJsonLd = { -
- - - -
-
-
-
Warmup
-

- Mailbox warmup, built in. -

-
-
-

- Pool placement, daily ramps, conversational replies, and per-mailbox health monitoring run automatically on every paid mailbox. The same code that warms also quarantines. -

- - Read the full doc - - -
-
+ + + - -
+ + + - -
- Mailboxes in warmup · acme.co - - - pool active - -
+ + + -
- {[ - { e: 'founder', day: 28 }, - { e: 'hello', day: 22 }, - { e: 'team', day: 16 }, - { e: 'intro', day: 11 }, - { e: 'partnerships', day: 7 }, - { e: 'support', day: 3 }, - ].map((m) => { - const r = 26; - const C = 2 * Math.PI * r; - const pct = Math.min(1, m.day / 30); - const dash = (C * pct).toFixed(2); - const gap = (C - C * pct).toFixed(2); - return ( -
- - - - -
{m.day}
-
{m.e}@acme.co
-
day {m.day} / 30
-
- ); - })} -
+ + + - - + + + - -
+ + + - -
- {[ - { k: 'Peers', v: '142', sub: 'active last 24h' }, - { k: 'Replies', v: '11', sub: 'reply rate 34%' }, - { k: 'Inbox', v: '96.4%', sub: 'rolling 14 day' }, - { k: 'Spam', v: '1.8%', sub: 'well under 10%' }, - ].map((s) => ( -
-
{s.k}
-
{s.v}
-
{s.sub}
-
- ))} -
+ + + - -
- Pool - Gmail 46% - Outlook 24% - Yahoo 12% - iCloud 9% - Self-IMAP 9% -
-
-
-
+ + + - -
-
-
-
-
Inbox
-

- Every reply, one queue, five labels. -

-

- Replies stream in from every connected mailbox. The classifier tags each one before it lands so triage stays on the labels you care about. -

-
- - -
-
- {[ - { v: '5', l: 'labels' }, - { v: '< 1s', l: 'tag latency' }, - { v: '∞', l: 'mailboxes per queue' }, - ].map((s) => ( -
-
{s.v}
-
{s.l}
-
- ))} -
-
- Quoted-text aware. OOO + unsubscribe auto-handled. - See more -
-
-
- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {(() => { - const mb = [ - { e: 'founder@acme.co', y: 60 }, - { e: 'team@northwind.dev', y: 165 }, - { e: 'hello@spruce.bio', y: 270 }, - { e: 'intro@helio.gen', y: 375 }, - { e: 'maya@cinder.app', y: 480 }, - ]; - return mb.map((m) => ( - - - - {m.e.slice(0, 2).toUpperCase()} - {m.e} - - )); - })()} - - - - - - - - - CLASSIFIER - - Tags every reply - on arrival. - - - - quoted-text aware - OOO detection - auto-suppress - round-robin assign - - - - {(() => { - const lb = [ - { t: 'Positive', dot: '#10b981', y: 60 }, - { t: 'Negative', dot: '#f43f5e', y: 165 }, - { t: 'Out of office',dot: '#f59e0b', y: 270 }, - { t: 'Unsubscribe', dot: '#64748b', y: 375 }, - { t: 'Bounce', dot: '#fb923c', y: 480 }, - ]; - return lb.map((l) => ( - - - - {l.t} - - )); - })()} - - - {[ - { id: 'in-1', dur: '3.2s', begin: '0s', color: '#0ea5e9' }, - { id: 'in-2', dur: '3.6s', begin: '0.5s', color: '#0ea5e9' }, - { id: 'in-3', dur: '3.0s', begin: '1.0s', color: '#0ea5e9' }, - { id: 'in-4', dur: '3.8s', begin: '1.5s', color: '#0ea5e9' }, - { id: 'in-5', dur: '3.4s', begin: '2.0s', color: '#0ea5e9' }, - { id: 'out-1', dur: '3.2s', begin: '2.6s', color: '#10b981' }, - { id: 'out-2', dur: '3.6s', begin: '3.0s', color: '#f43f5e' }, - { id: 'out-3', dur: '3.0s', begin: '3.4s', color: '#f59e0b' }, - { id: 'out-4', dur: '3.8s', begin: '3.8s', color: '#64748b' }, - { id: 'out-5', dur: '3.4s', begin: '4.2s', color: '#fb923c' }, - ].map((d) => ( - - - - ))} - -
- -
- - See the inbox - - - Cross-mailbox search, snooze with reminders, round-robin assignment. -
-
-
- - -
-
-
-
-
Campaigns
-

- Sequences as configuration, not click-and-drag prison. -

-
-
-

- Build a sequence in the UI or import one as YAML through the API. Up to 12 steps with A/B variants, business-hour delays, and conditions that branch on opens, replies and bounces. -

-
-
- - -
- -
- -
    - {Array.from({ length: 2 }).map(() => ( - <> - {[ - { n: 1, k: 'SEND', t: 'Intro · plain text', m: '2 variants', icon: 'send' }, - { n: 2, k: 'WAIT', t: '3 business days', m: 'if no reply', icon: 'clock' }, - { n: 3, k: 'SEND', t: 'Follow-up · context line', m: '4 variants', icon: 'send' }, - { n: 4, k: 'BRANCH', t: 'If opened twice', m: 'send earlier',icon: 'workflow' }, - { n: 5, k: 'SEND', t: 'Soft close · short ask', m: '2 variants', icon: 'send' }, - { n: 6, k: 'WAIT', t: '7 business days', m: 'silence', icon: 'clock' }, - { n: 7, k: 'SEND', t: 'Final · breakup note', m: '1 variant', icon: 'send' }, - { n: 8, k: 'END', t: 'Stop · mark contact done', m: 'sequence done', icon: 'check' }, - ].map((s) => { - const tone = s.k === 'SEND' ? { bg: 'bg-sky-50', text: 'text-sky-700', dot: 'bg-sky-500' } : - s.k === 'WAIT' ? { bg: 'bg-slate-50', text: 'text-slate-500', dot: 'bg-slate-400' } : - s.k === 'BRANCH' ? { bg: 'bg-violet-50', text: 'text-violet-700', dot: 'bg-violet-500' } : - { bg: 'bg-emerald-50',text: 'text-emerald-700', dot: 'bg-emerald-500' }; - return ( -
  1. - -
    -
    - - {s.k} - {String(s.n).padStart(2, '0')} -
    -
    -
    - -
    -
    {s.t}
    -
    {s.m}
    -
    -
    -
    -
    - - -
  2. - ); - })} - - ))} -
-
- - -
-
-
-
-
- - - -
- campaign.q2-outbound.yaml -
-
name: Q2 outbound · enterprise
-mailboxes: [founder@acme.co, team@acme.co]
-steps:
-  - type: send
-    subject: Re: {`{{news.summary}}`}
-    variants: 2
-  - type: wait
-    days: 3
-    unless: replied
-  - type: send
-    subject: Quick context on {`{{custom.pain}}`}
-    variants: 4
-  - type: branch
-    if: opens >= 2
-    jump: step.5
-
-
-
-

Built around an API, not against one.

-

- Every sequence built in the UI is the same object the API returns. Version-control campaigns, branch them in code, deploy with a webhook. -

- - API reference - - -
-
-
-
+ + +