3One clickable prototype. Every screen reads the same mock data; every button acts on it.
Notes
Six workspaces plus "Add workspace" (creates an empty one, which shows onboarding). Pod 1 is the steady 397-domain fleet with the five decisions; Ajax Partners has EmailBison disconnected and an interrupted check; Dezign is the incident night; Ikura has Cloudflare disconnected and two domains not sending; Pod 2 has a week where everything renews. Tweaks: theme, width, developer view, workspace age, role. Supplier calls, availability checks and EmailBison sends are simulated with a short delay.
3aThe app
Theme Width Role Workspace age
Mail Legion
{{ w.name }}{{ w.sub }}
Add workspace
{{ wsSub }}
⌘K
{{ initials }}
{{ n.label }}{{ n.badge }}
{{ railFoot }}
{{ roleLabel }}
You have no domains yet.
Order inboxes and they start warming tonight. Nothing here is checked until the first nightly check runs.
Resume setup
{{ home.headline }}
Sending domains
{{ home.sending }} of {{ home.total }}
{{ home.freshness }}
Not sending
{{ home.notSending }}
{{ home.notSub }}
{{ home.thirdLabel }}
{{ home.thirdValue }}
{{ home.thirdSub }}
{{ home.inboxLine }}
Show full breakdown
{{ s.label }} {{ s.n }}
Decisions waiting
{{ home.seeAll }}
Nothing needs your decision today.
{{ d.action }} {{ d.target }}
{{ d.reason }}
{{ d.cost }}
{{ f.target }}
{{ f.what }}
{{ night.para }} {{ night.coverage }}
Fleet
{{ fleet.sub }}
{{ fleet.banner }}
{{ c.label }} {{ c.n }} {{ fleet.nextCheck }}
{{ fleet.selText }}
DomainStatusInboxesWarmup scoreLast checkedRenews
{{ fleet.emptyText }}
{{ r.name }} {{ r.statusWord }} {{ r.inboxes }} {{ r.score }} {{ r.arrow }} {{ r.checkedText }} {{ r.renews }}
Inboxes
{{ ib.addr }}{{ ib.status }}{{ ib.score }}
Checks
{{ c.n }}{{ c.v }}{{ c.m }}
History
{{ r.history }}
{{ r.notice }} Open Decisions
Nightly report
{{ night.dateLine }}
View JSON
{{ night.para }}
Waiting for you
{{ d.action }} {{ d.target }}
{{ d.reason }}
{{ d.cost }}
What changed
{{ e.id }}{{ e.what }}Open
{{ night.coverage }}
Decisions
{{ dec.sub }}
{{ tb.label }} {{ tb.n }}
{{ dec.emptyText }}
{{ f.target }}
{{ f.what }}
A fix, not a decision: nothing is retired or cancelled by it.
{{ d.action }} {{ d.target }}
{{ d.reason }}
{{ d.cost }}
{{ d.doneLine }}
Declined: {{ d.declineReason }}
{{ d.expiredWhy }}
{{ d.chart.title }}
{{ d.chart.score }}
{{ d.chart.trend }}
{{ d.chart.note }}
Checks
{{ c.n }}{{ c.v }}{{ c.m }}
{{ d.affected }}
What happens if you approve
  1. {{ st }}
{{ d.api }}
{{ onboarding.stepLabel }}
Connect EmailBison
Mail Legion reads your last 30 days of sending from EmailBison to recommend your first order, and sends login details there when new inboxes are ready.
{{ onboarding.statusText }}
Our recommendation for your first order
We read your last 30 days. You send mostly to Google inboxes and your reply rate is best from Google-hosted senders, so we recommend {{ onboarding.google }}% Google, {{ onboarding.ms }}% Microsoft, and a reserve of {{ onboarding.reserve }} domains.
Google-hosted senders replied 1.4x more often in your history, and a 10% reserve covers the washout rate we saw.
Place your first order
The order is pre-filled with the recommendation: {{ onboarding.google }}% Google, a reserve of {{ onboarding.reserve }} domains, 2 inboxes per domain. You can change anything before confirming. Inboxes start warming tonight and can be cleared for sending from day 21.
Orders
{{ orders.sub }}
No orders yet. Order inboxes and they start warming tonight.
{{ o.readyLine }}
{{ o.domains }}
{{ o.meta }}
{{ o.statusLine }}
{{ f.addr }}{{ f.why }}
Sent to sequencers
{{ e.line }}
{{ e.at }}
{{ e.statusWord }}
Landing pages
{{ landing.summary }}
Cloudflare is not connected, so pages cannot be deployed or checked.
No domains yet. Order inboxes to start.
DomainPageLast checkedVisitors, 7dLeads
{{ r.name }} {{ r.page }} {{ r.checked }} {{ r.visitors }} {{ r.leads }}
Billing
What you pay, and what renews in the next 30 days.
No domains yet, so nothing to bill.
{{ billing.firstText }}
{{ billing.coverage }}
This month
{{ billing.total }}
{{ billing.totalSub }}
{{ billing.bigText }}
Next 30 days
{{ w.label }}
{{ w.sub }}
{{ w.amount }}
Worth deciding before renewal
{{ billing.flaggedText }}
{{ f.name }}
{{ f.sub }}
By renewal date
{{ d.label }}
{{ d.sub }}
{{ d.amount }}
Invoices
{{ v.id }} {{ v.date }}, {{ v.status }}
{{ v.amount }}
{{ billing.coverage }}
Benchmarks
How your placement compares, and which blacklists actually matter, from your own check history.
{{ bench.lockedText }}
Inbox placement by provider, 4 Aug to 2 Sep
{{ bench.c1.gLabel }}{{ bench.c1.mLabel }}
Reply rate by provider, 4 Aug to 2 Sep
{{ bench.c3.gLabel }}{{ bench.c3.mLabel }}
Which blacklists lowered placement, 4 Aug to 2 Sep
{{ b.n }}
{{ b.sub }}
{{ b.val }}
{{ bench.coverage }}
Settings
Connections, API keys, domain budget, team.
{{ settings.pendingText }}
Connections
{{ c.label }}
{{ c.status }}
API keys
No keys yet. A key lets your own tools read this workspace, or act in it.
{{ k.name }}
{{ k.sub }}
Registrars
{{ settings.registrars.rule }}
Agency, all workspaces
None yet. Connect one and buying can start filling every workspace's reserve.
{{ r.name }}
{{ r.line }}
{{ r.noteText }}
This workspace only
None. Bring the client's own registrar key here and domains bought with it belong to them.
{{ r.name }}
{{ r.line }}
Domain budget
{{ settings.budgetNote }}
Team
{{ u.name }}
{{ u.email }}
Workspaces
One workspace per client. Invite a client to their own seat, or move the invoices to them.
{{ w.name }}
{{ w.sub }}
Developer view
Shows the API path, CLI equivalent and Copy as curl under each screen.
Domains
{{ domainsScreen.headline }}
{{ domainsScreen.reserveLine }}
{{ p.k }}{{ p.v }}
Screened and queued
DomainScreenRegistrarScheduledStatus
{{ c.name }}{{ c.screen }}{{ c.registrar }}{{ c.day }}{{ c.statusWord }}
Purchases are spread across accounts and days so no registrar sees a burst, and every candidate is screened against Spamhaus DBL and SURBL before money moves. Anything listed is skipped, never bought.
Bought this week
{{ b.name }}{{ b.registrar }}{{ b.at }}{{ b.price }}
Shelf
{{ shelf.sub }}
Aged domains
{{ a.name }}{{ a.age }}Valid till {{ a.validTill }}{{ a.checks }}, {{ a.listed }}, {{ a.page }}.{{ a.price }}
Pre-warmed bundles
{{ p.domain }}{{ p.inboxes }} inboxes, {{ p.provider }}Score {{ p.score }} up{{ p.receipts }}{{ p.priceMo }}
Everything here aged or warmed in our own fleet with a live page and mail records from day one. Unsold stock goes back into our own lanes, so nothing on the shelf was parked.
{{ devLine.api }}{{ devLine.cli }}
{{ m.title }} {{ m.target }}
What changes
{{ m.what }}
Set landing page for {{ m.target }}
{{ o.label }}
{{ o.sub }}
The page is deployed through your Cloudflare account and checked tonight.
Move {{ m.target }} to another client
Choose the workspace it moves to.
{{ o.name }}{{ o.sub }}
What changes
{{ m.what }}
This creates a decision. Nothing moves until it is approved.
Nightly report, JSON
{{ m.json }}
Order inboxes
{{ m.stepLabel }}
No domains yet. Buy new domains instead.
Type domain names, separated by commas. We check availability and price before you order.
{{ r.name }}Available, {{ r.price }}Not available
Try:{{ a.name }} added
Domains you already own, at any registrar. Type them separated by commas. They are not charged; only the inboxes are.
Point each domain's nameservers at us
{{ ns }}
We take over DNS from there: mail records, the landing page and the redirect. Warming starts the night the change lands.
Connect a registrar in Settings and we can set nameservers for you next time.
{{ m.chosenText }}
Inboxes per domain
{{ m.per }}We recommend 2 or 3.
{{ m.perWarnText }}
Provider
Addresses on the first domain
{{ pv }}
{{ m.summary }}
Review
{{ m.reviewText }}
Send login details to EmailBison
EmailBison is not connected, so login details cannot be sent.
Your selection of {{ m.selN }} inboxes is kept while you connect it.
Choose the inboxes to send.
{{ m.selText }}
They go to this EmailBison workspace.
{{ m.bisonName }}
{{ m.bisonUrl }}
{{ m.reviewText }}
Sending...
{{ m.sentText }}
{{ s.addr }}{{ s.at }}
{{ m.sentText }}
{{ f.addr }}{{ f.why }}
{{ m.title }}
{{ m.statusText }}
Create API key
What it can do
Your new key
{{ m.keyValue }}
Copy it now. It will not be shown again.
Revoke {{ m.name }}?
Anything using it stops working immediately.
Invite a teammate
Connect a registrar {{ m.scopeWord }}
Pick the registrar. We use its API to buy domains on plan and to set nameservers for domains you bring.
{{ m.pick }}
{{ m.statusText }}
The key is stored encrypted and used only for buying and nameserver changes. It is never shown again after saving.
Weekly cap for {{ m.name }}
{{ m.note }}
Remove {{ m.name }}?
Buying stops using this account. Domains it already bought stay where they are and keep renewing as set.
Add domains to screen
Type names, separated by commas. Each is checked against Spamhaus DBL and SURBL before it can be queued. Clean ones are bought on plan; listed ones are skipped.
{{ r.name }}{{ r.why }}
Pause buying
Resume buying
What changes
{{ m.what }}
{{ m.addr }}
{{ m.status }}Score {{ m.score }}
Domain{{ m.domain }}
Provider{{ m.provider }}
Age{{ m.day }}
Last checked{{ m.checked }}
History{{ m.history }}
Password{{ m.password }}
2-step code{{ m.totp }}{{ m.totpNote }}
SMTP{{ m.smtp }}
IMAP{{ m.imap }}
{{ m.sentText }}
Renews{{ m.renews }}
Cost{{ m.cost }}
Renewal{{ m.autoRenew }}
Swap {{ m.addr }}
What changes
{{ m.what }}
Transfer billing for {{ m.name }} to the client
Bill the agency for {{ m.name }} again
What changes
{{ m.what }}
{{ m.title }}
What changes
{{ m.what }}
Its record
{{ m.receipts }}
{{ toast }}
3bNightly report, phone, read-only
Mail Legion{{ wsName }}
Nightly report
{{ night.dateLine }}
{{ night.para }}
Waiting for you
{{ d.action }} {{ d.target }}
{{ d.reason }}
Decide on a larger screen.
What changed
{{ e.id }}
{{ e.what }}
{{ night.coverage }}
3cComponents sheet
Components
Status, dot and word
Warming Sending Degraded Quarantined Resting Reserve Retired Not checked yet
Freshness
Checked 3h agoPartially checked 9d agoNot checked yet
Decision card, collapsed
Retire brightlanemail.co
It failed its day-21 checkpoint with a warmup score of 61 and falling.
Costs $6.00/month. If approved, it is cancelled on 13 Sep, the day before it renews, so you are not billed again.
Order card, four states
0 of 12 inboxes ready
brightpath-reach.co, northfieldmail.com
Google, 3 per domain. Placed 2 Sep by Aydan.
Typically ready within 24 hours.
9 of 12 inboxes ready
clearlane-outreach.io, summitdeskhq.com
Microsoft, 3 per domain. Placed 1 Sep by Marta.
Typically ready within 24 hours.
12 of 12 inboxes ready
copperbrookmail.co, ridgepointsend.com
Google, 3 per domain. Placed 25 Aug by Aydan.
Ready. Login details sent to EmailBison.
11 of 12 inboxes ready
willowport.com, amberlane.io
1 could not be created. The rest are typically ready within 24 hours.
ops@amberlane.ioThe domain's DNS is not delegated yet.
Two-step action card
Pause inboxes on northgatereach.io
What changes
4 inboxes go from Sending to Resting. They stay warm and leave rotation. No cost change.
Form field with an error
Could not connect: the key is wrong. Copy it again from EmailBison, Settings, API.
Empty state
You have no domains yet.
Order inboxes and they start warming tonight.
Menu (workspace switcher)
Pod 1397 domains
Ajax Partners16 domains
Lumen Co14 domains
Add workspace
Tabs
Waiting for you 5Done 2Declined 1Expired 1
Developer footer, only with Developer view on
GET /v1/workspaces/p1/statusstatus --pod P1

Try next: "turn on developer view" · "switch role to client seat" · "workspace age: first week" · "1280 wide"