Warming Pod workspace · walked 8 to 9 Oct 2026 · build 220241b

Mail Legion Flow Audit

The app asks a user to approve a plan that gates almost nothing, then sends them across six screens to buy what the plan describes. The plan, the buyer, the domain list and the inbox order never pass information to each other. The fix is one pipeline, goal → domains → aging → inboxes → launch, where every screen shows the next step and the date it happens.

The core problem

What "the infrastructure plan" really does

The plan page reads like a gate on everything you buy. In the code it is one number: a weekly dollar cap on queueing domain buys, kept in a collapsed "Advanced" box at the bottom of the older of two planners. Everything else the page shows is commentary. I confirmed each row below in the app and in the code.

What the screen tells youWhat actually happensWhere
Approve a plan before you buy.Approval sets the weekly domain budget. It is checked only at the moment a domain buy is queued. Inbox orders and marketplace purchases never read the plan.routes_buy_plan.py:292
"We'll ask you to confirm again before anything is ordered."Nothing asks again. There is no step that reads the approved plan at order time.Plan & buy, approval box
Edit inputs, Review, Approve.Editing drops the page back to draft, but buying keeps using the last approved revision. What you see and what gates you can differ, invisibly._weekly_cap
Lower the budget to slow buying.Already queued buys still go through. The worker that buys checks only Pause and the spending switch, never the plan or the budget.routes_domain_buys.py:559
Pause buying: "The active plan keeps buying until you cancel it."False for registrar buys. Pause stops every queued and drip buy at once. The sentence refers to an old buy-plan screen that no longer exists.PauseBuyingDialog.tsx:43
No approved plan: "Set a weekly domain budget in Settings."Settings › Budgets is read-only and links back to the plan. The real field is Plan & buy › Price and approve › Edit inputs › Advanced.routes_buy_plan.py:296
Your plan: 40 inboxes on 20 domains.That number never becomes a purchase. "Use calculated quantities" opens an empty inbox order that cannot continue because no domain is old enough. The domain buyer never shows the plan's count.actions-v4.ts
Two planners on one page.They disagree. New one: inboxes ready 7 Nov. Old one, same 40 inboxes: cannot start before 21 Nov (14 days aging plus 21 warmup). Reserve is 20% in one sentence and 15% in the next./plan

Recommendation: keep one planner (the newer one, with launch date and sends a day), put the two spending limits on it in plain view, and end it with a real next step: "Buy the N domains you still need". Delete the contacts-and-emails wizard, the 24-hour quote, the review step and the acknowledgement checkbox. None of them protect money; the budget and the Pause switch do.

Ranked by harm

Top 17 issues

Money first, then things that make the app say something untrue, then broken screens, then confusion. Each has the fix I'd make.

  1. Money

    No renewal price, anywhere

    Buy review, drip setup and Billing show only the year-one price ($3.79 for .pro). .pro renews at several times that. There is no domain renewal forecast in the app at all; Billing's "Upcoming renewals" lists inboxes only.

    Fix: show "Year one $3.79 · then $X a year" on every price, and a "Domains renew" line in Billing grouped by month.

  2. Money

    The only real stop switch says it won't stop anything

    Pause buying stops all queued and drip buys, but its dialog says "the active plan keeps buying until you cancel it". A user who wants spending stopped will cancel every group by hand. The same switch is called "Pause new purchases" on Billing.

    Fix: one name ("Pause all buying"), one sentence: "Nothing new is bought until you resume. 17 queued domains will wait."

  3. Money

    Drip limits read as hard limits, but manual buys ignore them

    Dynadot card: "Today's limit of 2 is reached." I then queued 3 more Dynadot names and all 3 were scheduled for the same day: 5 buys against a stated limit of 2. "On hand 12 of 10" counts names not yet bought.

    Fix: either apply the daily limit to every buy on that registrar, or label it "Drip: 2 a day (manual buys are extra)". Count only bought domains as "on hand"; show queued separately.

  4. Money

    Recurring buying starts with one click and no price

    Drip "Set up" for Spaceship defaults to 10 on hand, 3 a day, and all six endings ticked including .com. Save starts real, repeating purchases with no estimate, no max price per name and no review. It also allows Spaceship with no registrant contact, so buys would fail. "Switch off" has no confirmation at all.

    Fix: a review line before Save ("About $38 year one, $X a year after, 3 a day until 10"), a max price per name, sane defaults (.pro or the plan's endings only), confirm on Switch off.

  5. Untrue

    Provision inboxes shows the whole agency registrar portfolio

    The demo workspace lists 755+ domains, including other clients' domains, because the same registrar keys sit in two workspaces. Every row says "DNS records added for you" (Wiring proves at least one is not on that registrar's DNS). The "hidden, belong to other workspaces" count changed from 443 to 217 between loads. The form at the bottom skips the 14-day aging rule, the plan and payment.

    Fix: move this page to staff tools. Customers make inboxes through the order flow only.

  6. Untrue

    "Everything passed" with zero checks run

    Home, Decisions and Fleet health all say every domain and inbox passed. The Doctor is stuck at "1 of 10 checks done" with no reason. Home also says "Your first Bison scan is running" while Settings says "Never scanned".

    Fix: one status line everywhere: "Not checked yet: your Bison workspace has never been scanned. Scan now." Never show "passed" over an empty set.

  7. Untrue

    Wrong scope in the notification feed

    The only notifications are an engine run code (A45CDD490BB) reporting 2 ghost and 2 missing inboxes in a workspace that has 0 inboxes. It pops as a toast on every page. My 17 queued buys, the plan approval and the cancel produced no notification at all.

    Fix: notify on things the user did or must do: domain bought, buy failed, domain ready for inboxes, order delivered, budget reached.

  8. Broken

    Move domains opens a domain called "move"

    The button links to /domains/move; the page lives at /move, so the domain detail route catches it and says the domain "move" is not in your inventory.

    Fix: one-line href change in domains/page.tsx:228.

  9. Broken

    Queued domains have no page, and the page that exists says they don't exist

    /domains/dealhq.pro: "not in your latest Bison scan, your domain setup jobs or your engine inventory." It is in a setup job. There is no place to see one domain's price, registrar, buy time and ready date.

    Fix: the domain page reads buy groups too and shows the timeline: queued → bought → aging until 23 Oct → ready.

  10. Confusing

    Two planners on one page, and they disagree

    Covered above. Also: the side panel mixes them ("40 new inboxes" next to "$54 a month", which is the other planner's 12 inboxes), and the page is 5.4 phone screens long with no buy button.

    Fix: one planner. Mock below.

  11. Confusing

    17 domains on the way are invisible everywhere that matters

    Domains header "0 of 0". Domain setup "0 aging". Settings "No domains yet". Landing Factory "No domains in this workspace". Inbox order "No fresh domains yet" with no date. Even after outbounddesk.pro and boostsystems.pro actually bought at 08:44 and 08:47, Inventory still said "This account has no domains recorded yet", the header stayed "0 of 0", Billing did not change, and no notification fired. The only place they appear is a row inside "Setup history".

    Fix: every one of those reads the same pipeline and says "17 on the way, first ready 23 Oct".

  12. Confusing

    Orders say "Bought" for things not bought

    Queued and cancelled domain groups both read "Bought on LG Porkbun". "View buy" drops you on a list of all buys. Live buys are filed under "Setup history", whose first line reads "Cancelled before acquisition." The last action's message is printed as loose text at the top and swaps position after each action.

    Fix: tense follows state ("Buying on…", "Bought on…", "Cancelled"); live groups above history; messages as toasts on the group that changed.

  13. Junk

    Empty drafts pile up on their own

    Clicking "New inbox order" saves a draft before you choose anything. Billing's "New inbox order" does the same. Home and Orders then show stacks of identical empty drafts. Adding a marketplace item from inside a draft starts a separate cart and orphans the draft.

    Fix: save a draft on the first real choice; the marketplace adds to the open draft instead of a second checkout.

  14. Staff only

    Operator plumbing on customer pages

    Proxy pools and runner tokens (aydan-pc, charles-pc) under Registrars, raw account ids, a "token variable name" field in Agency › General, Failures and Wiring in the sidebar (cross-tenant), the full engine rules spec under Rules, raw dicts in Check history.

    Fix: one "Staff" area, hidden unless staff. Customers see a 3-line summary of their rules.

  15. Confusing

    Four money knobs, two pause names, one wallet that contradicts itself

    Weekly domain budget (Plan › Advanced), monthly inbox cap (same box), monthly new-purchase limit (Billing), drip "at most a week" (each registrar). Billing says "No purchases yet" beside "$56.03 of new purchases this month" (the registrar buys, paid on your own registrar accounts, counted invisibly). Card payments are not connected, so there is no way to add funds.

    Fix: two limits on the plan screen (domains a week, inboxes a month). Billing shows "includes $X of domains on your registrars".

  16. Confusing

    The launch date is a wish, not a schedule

    It changes the dates shown and nothing else. Aging is hardcoded at 14 days and warmup sits in a hidden field, so a customer who needs inboxes in a week has no way to say "go faster" and no screen that tells them their date can't be met.

    Fix: one pace setting (Careful, Standard, Fast, Custom) that the plan schedules backwards from the launch date, with three ways to close any gap. Mock F.

  17. Confusing

    Cancel is all or nothing per buy group

    "Cancel unstarted domains" kills every name left in the group. To drop one weak name you cancel the batch and queue the rest again.

    Fix: a Remove link on each row not yet bought; the group button says "Cancel the 2 not bought yet". Mock G.

The target

One connected flow

Every screen answers two questions: where am I in the pipeline, and what is the next thing that happens, on what date. Each step's main button lands on the next step with the right numbers already filled in.

STEP 1Plan

Launch date, sends a day, inboxes per domain, two spending limits. Shows what you have, what is on the way, what is missing.

Buy 3 missing domains →
STEP 2Buy domains

Count prefilled from the plan. Registrar, names, year one and renewal price, buy dates, budget left.

Queue 3 →
STEP 3Domain pipeline

Queued, bought and aging, ready, has inboxes. Each domain has a date.

Order inboxes for arriving domains →
STEP 4Inbox order

Reserves inboxes on domains still aging; starts each one the day it turns 14 days old.

Approve and pay →
STEP 5Warmup

Per batch: started, days left, score. Problems become Decisions.

See launch readiness →
STEP 6Launch

"40 of 40 ready on 13 Nov, 3 days before launch." Home shows this bar.

Send in Bison
Before and after

Mock screens

Numbers are from Warming Pod as it stands (40 inboxes needed, 17 domains queued). Prices after year one are left as $X because the app doesn't show them yet.

A. Plan & buy

Today/plan
Plan the fleet and check readiness

Your plan: 640 a day → 40 inboxes, ready 7 Nov · 20% reserve

Batch assignment: empty table · [Confirm batch assignment]

Price and approve a plan: contacts × emails ÷ days → ready 21 Nov · 15% in the banner

Advanced (collapsed): Weekly domain budget $120, warmup 21, monthly cap

Review → 24h quote → tick acknowledgement → Approve

No buy button. 5.4 phone screens.

Proposed/plan
Your fleet plan
Launch on16 Nov 2026
Cold sends a day640
Inboxes per domain2 (recommended)
Inboxes needed (32 sending + 8 spare)40 Domains needed20 Domains you have0 Domains on the way (ready 23 to 25 Oct)17 Still to buy3

Ready by 13 Nov, 3 days before launch (14 days aging + 21 days warmup).

Spending limits
Domains, per week$120
Inboxes, per month$180

This week: $64.43 of $120 used by queued domains. Domains renew at $X a year each.

Buy the 3 missing domainsSave plan

Saved 08:31 UTC. Changing a limit applies to the next buy, and queued buys are rechecked against it.

Removed: the second planner, the quote, the review step, the acknowledgement, batch assignment (until inboxes exist), "separate new fleet" (move to an advanced toggle with one sentence). The weekly $ figure "64.43" is illustrative.

B. Buy domains on your own registrar

Today/domains/buy
Buy domains

Drip cards first: "On hand 12 of 10" (all 12 queued), "Today's limit of 2 is reached"

Then a 3-step wizard: Account → Names → Review

Review: Year one $3.79. No renewal, no dates, no budget.

Queue → silent redirect to Domain setup › "Setup history"

Proposed/domains/buy?from=plan
Buy 3 domains

Your plan still needs 3 domains. Budget left this week: $55.57.

RegistrarDynadot (LG Dynadot)
Endings.pro
Max per name$5.00
NameYear oneThenBuysReady for inboxes
dealhq.pro$3.79$X/yrtoday 10:2523 Oct
outbounddesk.pro$3.79$X/yrtoday 08:4423 Oct
bookeddesk.pro$3.79$X/yrtoday 11:0823 Oct
Total year one$11.37Then every year$XBudget left after this$44.20
Queue 3 domainsBack

After queueing: lands on the domain pipeline with these 3 highlighted, toast "3 domains queued. First buys at 08:44 UTC."

The "keep on hand" drip moves to its own small card under the wizard, with a price line and a confirm on Switch off. "On hand" counts bought domains only; queued shows beside it.

C. Domain pipeline (replaces "0 of 0" and Setup history)

Today/domains?tab=setup

Header: Domains 0 of 0

"0 domains waiting for their first inbox setup. 0 aging."

Setup history: "Cancelled before acquisition." then live groups mixed with cancelled ones, newest first

Queued domain detail page: "not in your domain setup jobs"

Proposed/domains
Domains
17Queued to buy
0Bought, aging
0Ready for inboxes
0Have inboxes
DomainRegistrarStateNext
outbounddesk.proDynadotQueued, checkedbuys today 08:44
boostsystems.proPorkbunQueuedbuys today 08:47
handshakeworks.proPorkbunQueuedbuys 10 Oct
Order inboxes for arriving domainsBuy morePause all buying

Cancelled (19) collapsed at the bottom. Each row opens the domain page with its full timeline.

D. Inbox order that knows domains are coming

Today/inboxes/orders/430a…

Draft saved the moment you clicked "New inbox order"

"No fresh domains yet"

Six links to get domains (two destinations)

Marketplace "Add" opens a separate cart; the draft is orphaned

Proposed/inboxes/orders/new?from=plan
Order 40 inboxes

Your plan: 40 inboxes on 20 domains. 0 domains ready now, 17 ready 23 to 25 Oct, 3 not bought yet.

Reserve on arriving domains

34 inboxes on the 17 domains on the way. Each domain gets its 2 inboxes the day it is 14 days old. Billing starts per inbox when it is created.

Pre-warmed, ready sooner

From stock, warmed N days. Fills the gap if launch is close.

Inboxes34Per inbox a month$4.50Monthly once all are live$153.00Fits your $180 inbox limityes
Continue to sender names

The draft is saved on the first choice, not on page load. The marketplace adds to this order instead of a second checkout. If reserving on aging domains is not possible yet, the minimum fix is the sentence "17 domains arrive 9 to 11 Oct and can take inboxes from 23 Oct. We'll remind you."

E. Home as the pipeline

Today/overview

"Scanned Never" + "Your first Bison scan is running" + "Every domain and inbox passed its last check"

"Batch assignment not confirmed"

Tiles: Sending now / Live batch warming / Ready reserve / New reserve

Two identical empty drafts

Proposed/overview
Launch 16 Nov · on track
17/20Domains queued
0/20Aged
0/40Inboxes warming
0/40Ready to send

Next: 3 domains still to buy. Buy 3 domains

Not checked yet: your Bison workspace has never been scanned. Scan now

F. Launch date and pace: the customer sets the speed

Today/plan

Launch date is a field that only changes the dates shown. Nothing buys, warms or schedules toward it.

Aging is 14 days, hardcoded in four API files. Nobody can change it.

Warmup (21 days) lives in the old wizard's Advanced box.

Pick a launch a week away and nothing says it can't happen or what to do about it.

Proposed/plan
How fast do you want to go?
CarefulStandardFastCustom
PaceAgingWarmupReady by, if you buy today
Careful30 days28 days9 Dec
Standard14 days21 days16 Nov
Fast3 days14 days29 Oct
Custom0 to any0 to anycalculated
Launch 16 Oct is 13 days early at Fast pace.
Move launch to 29 Oct Custom: no aging, 7 days warmup (ready by 19 Oct) Fill the gap: 20 pre-warmed inboxes, ready this week

Working back from launch: buy domains today · inboxes go on each domain the day it clears aging · each inbox goes to Bison the day its warmup ends.

Dates allow up to 3 days for setup after aging (DNS, Gmail, DKIM), the most Google allows. It usually takes about an hour, so inboxes are often ready up to 2 days sooner. Each step starts the moment the one before clears.

The launch date becomes the goal and pace becomes how you get there. Pace is one workspace rule that every screen reads, replacing the four hardcoded 14s and the hidden warmup field. When a launch can't be met, the plan offers three ways to close the gap instead of a warning; this is where the marketplace earns its place, as the answer to "I need inboxes sooner".

Customers can go as fast as they like. Every domain has its own tenant, so going fast only puts their own domains and inboxes at risk. Choosing Fast or Custom is a one-time, on-the-record choice ("New domains warmed fast burn more often. Replacements are billed as new inboxes."), logged in Decisions with the date, then never nagged again.

Setup: promise the safe date, deliver early. Google allows up to 72 hours before DKIM can be switched on; our first test had it in about an hour. Ready dates allow the full 3 days so a launch never rests on the best case, but nothing waits out a timer: poll, start each step the moment the last clears, and say what is happening when a step runs long ("DKIM is taking longer than usual: 6 hours so far, Google allows up to 72"). Log real setup times per tenant so the estimate stays honest.

Open question for the supplier: do they track burn or abuse rate per reseller account? If yes, watch it on a staff dashboard rather than limiting customers.

G. Remove one domain from a buy, not the whole group

Today/domains?tab=setup

One button per group: "Cancel unstarted domains"

One bad name means cancelling all of them and queueing the rest again.

Confirm reads "Cancel 1 unstarted domains?"

Proposed/domains?tab=setup
Buy 3 domains on Dynadot
DomainWhenState
outbounddesk.proready 23 OctAging
dealhq.protoday 10:25CheckedRemove
bookeddesk.protoday 11:08CheckedRemove
Remove dealhq.pro? It won't be bought, and $3.79 goes back to this week's budget. Remove
Cancel the 2 not bought yet

Small API change: the cancel endpoint (routes_domain_buys.py:396) already loops item by item; it takes an optional domain and cancels only that row. The budget release already sums only uncancelled items, and the group already turns "Cancelled" only when every item is. A row already being bought stays locked, as today.

You asked: why is this even here?

Cut, move, merge or hide

ThingWhereVerdictWhy
"Price and approve a plan" wizard (contacts × emails ÷ days)Plan & buyMergeSecond planner that disagrees with the first. Keep only its two spending limits.
24-hour quote, Review step, acknowledgement checkboxPlan & buyCutApproval orders nothing and the quote is never used.
"What you have" rows and "Domains you bring" boxPlan wizardCutBring-your-own domains here "give no purchase credit". It asks for input that does nothing.
Batch assignment table and Confirm buttonPlan & buy, Home bannerHideShown with zero inboxes. Show it once inboxes exist, or assign automatically.
"Build a separate new fleet" checkbox, tickedPlan & buyHideDefault for a first fleet is meaningless; for an existing fleet it needs one plain sentence.
Fleet sizing card, "Build the plan" stepDoctorCutThird and fourth sizing tools. Doctor and Plan point at each other in a loop.
Provision inboxes pageDomains headerStaffShows the agency portfolio, skips aging, plan and payment.
Proxies, runner tokens, account idsSettings › RegistrarsStaffOperator plumbing in a customer setting.
Page hosting accounts, "token variable" fieldAgency › GeneralStaffAsks a customer for an environment variable name.
Failures and Wiring linksSidebar footerStaffCross-tenant data. Fine for LeadGrow, must never render for a customer.
"View complete saved rules" engine specSettings › RulesRewriteReplace with 3 lines: spare share, when an inbox is replaced, bounce limit.
Sending policy tabSettingsCutThe tab says it isn't part of this workspace.
Do-not-contact listSettingsCut or explainMail Legion doesn't send campaigns. Keep only if it syncs to Bison, and say so.
Budgets tab (read-only)SettingsMergePoints to the plan, which hides the field. Two "Reserve" rows the server drops, so always "Not set".
Engine daily-run notificationsNotifications, toastsCutRaw codes, wrong scope, repeats on every page.
Check history raw tablesReportsStaffDicts like "would_pause: 0 · push_enabled: False".
Evidence tabReportsFix or cut"It did not answer."
Recovery poolDomains, order wizard, BYOMergeThird word for spare capacity (reserve, ready reserve, new reserve, recovery pool).
Marketplace as a hidden tabDomainsDecideLinked from 3 places, absent from the tab bar. Make it a tab or a step inside the order.
"Unavailable" rows in Compare supplyMarketplaceHideHalf the comparison is rows you can't buy.
"Keep warming 12 weeks", ticked by defaultMarketplace checkoutExplainOn a product sold as pre-warmed, with "warmup age not reported" and an undefined "free period".
"Allow exports" bannerOrdersMoveA one-time setting, belongs in Settings › Bison.
Sender profiles / Personas / sendersInboxesMergeOne thing, three names; tab labels change between views.
BuyPlans.tsx, BuyPlanRequests.tsxCodeDeleteImported nowhere. The pause dialog still talks about them.
Vocabulary

One name per thing

UseInstead of
Plan (the fleet plan only)fleet plan, infrastructure plan, capacity plan, buy plan, Plan capacity, Plan & buy, "Build the plan", decision plans
Spare inboxesreserve, ready reserve, new reserve, recovery pool
Pack → Rules with its name ("Lean")Lean pack · revision 1, confirmed pack, mandate
Buy domainsAcquire domains, Get domains, Buy new domains, Domain setup
Domain pipeline (queued, aging, ready, has inboxes)Domain setup, Setup history, inventory, "on hand"
Pause all buyingPause buying, Pause new purchases
Sender profilepersona, sender, profile
HomeOverview (404 page, logo link)
Batch means one thingLive batch on Plan vs "each batch we set up together" on Launches
Everything else

Every screen I walked

Grouped by screen. Open the ones you care about.

Home
  • Five different stories on one screen about whether anything was checked ("Scanned Never", "scan is running", "Nightly check 20 min ago", "Not checked yet", "Every domain and inbox passed").
  • First thing a new user sees is "Batch assignment not confirmed".
  • Tiles Sending now / Live batch warming / Ready reserve / New reserve. Plan calls the same things Configured / Assigned / Ready / Warming, Reports a third set.
  • Two buttons to the same place ("Review fleet plan" twice), plus "Plan capacity" in the header.
  • Duplicate empty draft cards.
Plan & buy (details beyond the sections above)
  • Saving the launch date did not stick on 2 of 4 tries (the page said "Plan saved." each time). It stuck when the sends-a-day number changed in the same save.
  • The "revision 1" under the title is the rules revision, not the plan. After saving, it looks like nothing changed.
  • Two date fields: Launch date (16 Nov) and Start date (14 Nov).
  • Two "Inboxes per fresh domain" fields.
  • "Active inboxes needed 32" next to "To buy 40" with no word on the 8 spares.
  • "This plans a new client. For your current fleet's gap, see Fleet sizing on the Doctor."
  • On a phone, Plan & buy is hidden under More while Decisions has a tab.
Buy domains, drip, cancel
  • Queue gives no confirmation, just a redirect.
  • The 4th domain I queued went to the next day with no reason shown (the first 3 all went to today).
  • "Run checks now" works but shows no price and no "checked just now". A check that merely times out marks the name failed and the buyer skips it until someone presses Run checks again.
  • Cancel is per group only; there is no way to drop one domain. Cancel confirm says "Cancel 1 unstarted domains?". Cancelled rows lose their time and who cancelled.
  • "Names come out like yourbrandlab.com" while only .pro is ticked.
  • "At most a week (0 for none)": does 0 mean no limit or no buying?
  • Words that get a name refused ("spam filters flag") are never listed.
  • Phone: the four buy-method tabs run off the right edge; "Next buy" sentence is set in the big number font.
Orders
  • "Ready estimate: Not reported yet" on domain buys, though buy day + 14 is known.
  • "Payment, provisioning, Bison delivery, and readiness stay together."
  • A draft inbox order labelled "Not approved" though orders have no approval.
Domains inventory
  • Three verbs for one action: Acquire domains, Buy new domains, Buy domains.
  • Tiles "Deployed" and "Clients" mean nothing in a pod workspace.
  • Two identical "Mark as recovery pool" buttons with no domains.
Inbox order wizard
  • Breadcrumb "Inboxes / Order" and Inboxes highlighted, though you came from Orders.
  • Estimated ready 7 Nov for 0 inboxes.
  • Recovery pool checkbox "takes effect once your fleet positions are confirmed on Plan".
  • "After that you can buy 1 or 2 at a time" against rules that allow 1 to 3 per domain.
Marketplace and checkout
  • Only 3-inbox domains for sale, then the checkout warns "More than 2 inboxes on one domain. We recommend 1 to 2."
  • "Ready date: needs an agreed standard from the source, so none is promised." The fastest option is the only one with no date.
  • "Stock orders: Compare supply" button points to the page you are on.
  • The Add button shifts the row when it turns into Added / Remove, so the next click lands wrong.
  • "What this approval covers" paragraph: approval, growth capacity, unassigned, replacement draft, position.
Wallet & billing
  • "Card payments aren't connected yet" shown twice, beside an "Add to wallet" button.
  • "Browse marketplace" goes to a hidden tab; "New inbox order" makes another empty draft.
  • "0 of 0 inboxes carry a price."
Decisions, Doctor, Notifications
  • Decisions: "The last Doctor run found nothing to replace", but that run stopped after 1 of 10 checks. "Needs operator" reads as "needs me".
  • Doctor: stuck at 1 of 10, every other step "Not reached", no reason.
  • Notification title glued to its time ("pushed35 min ago").
Reports and Launches
  • URLs: /reports, /reports/sending, /reports/capacity, /fleet-health, /nightly.
  • "spend cannot be isolated to a single workspace here" in lowercase system voice.
  • Check history: every run named "Group 1".
Settings (workspace and agency)
  • 9 workspace tabs plus an Agency scope with a different tab set. Deep links: Rules is ?tab=mandate, Members ?tab=team; guessing ?tab=rules silently shows Connections.
  • Registrar "Connection check" column empty until clicked.
  • Two registrar levels (workspace and agency fallback) explained twice; nothing shows which one is in effect.
  • "Add a workspace" in the switcher means "Add a Bison workspace". There is no way to plan and buy domains before Bison exists.
  • Member name shows "hello (you)". Role "Operator" collides with LeadGrow's internal word.
Inboxes
  • "Lifetime bounces 0 · No sends of sends".
  • "Connect Bison" button when Bison is connected (it's just never scanned).
  • "Order inboxes" goes to the Orders list, not a new order.
Bring domains you own
  • Four statements, two models: keep your DNS host and prove with a TXT record, or point nameservers to us.
  • A domain that belongs to another workspace shows "Ready to connect" with the reason column reading "None". I did not connect it.
  • The "What happens next" list is the best-written content in the app. Reuse the pattern.
Landing Factory
  • Brand name prefilled with the workspace name.
  • Step 2 "No domains in this workspace" with 17 on the way.
  • The 404 page's "Go to Overview" links to /, not the workspace.
Ops: Wiring check results
  • Spending is live. Warming Pod's Bison key works but lands in "LeadGrow Pod 18".
  • 6 of 7 failures are the pre-purchase test using a hardcoded name that someone else has since registered. False alarms.
  • The same registrar keys are connected in two workspaces, which is why the demo workspace sees 900+ Porkbun and 470+ Dynadot domains.
  • Takes about 30 seconds behind a spinner with no progress text.
For Charles

Fix list with file references

Paths are from maillegion-app at 220241b. Quick wins first.

FixWhereSize
Move domains link goes to /domains/move; page is /w/[ws]/moveweb/…/domains/page.tsx:228Tiny
"No sends of sends" when sent is 0web/…/inboxes/page.tsx:486-487Tiny
Pause dialog sentence "active plan keeps buying" is false for registrar buysweb/…/domains/PauseBuyingDialog.tsx:43 (and its check)Tiny
"Set a weekly domain budget in Settings" points to the wrong placeapi/routes_buy_plan.py:296Tiny
"Cancel 1 unstarted domains?" pluralweb/…/domains/SetupHistory.tsx:294Tiny
404 and error pages: "Go to Overview" links to /web/…/(app)/not-found.tsx:26, error.tsx:44Tiny
Cancel one domain in a buy group (optional domain on the cancel endpoint, Remove link per row)api/routes_domain_buys.py:396, web/…/domains/SetupHistory.tsxSmall
Log real setup times per tenant (verify, Gmail, DKIM) to drive the "usually about 1 hour" estimateprovisioning workerSmall
Drip "Switch off" needs a confirmBuy domains drip cardSmall
Orders: tense by state ("Buying on", "Bought on", "Cancelled")Orders listSmall
Domain detail reads buy groups (queued, aging) instead of "not in your setup jobs"web/…/domains/[domain]Small
Inbox order draft created on page load; create on first choiceNew inbox order routeSmall
Idempotency-Key on domain-buy create (double submit can double-queue)buy wizard actionSmall
Spaceship names with no quoted price always 422 (no max price field)buy wizard + routes_domain_buys.pySmall
Budgets "Reserve inboxes / Reserve maximum" dropped by the serverSettings › BudgetsSmall
Launch date sometimes not saved though "Plan saved." showsweb/…/plan/PlanV4.tsx:76-88 (form state vs preview race)Small
Show renewal price next to year one (buy review, drip, billing forecast)registrar price lookup + UIMedium
Daily drip limit vs manual queues: one rule for a registrar's dayroutes_domain_buys.py schedulingMedium
Decide: should the worker recheck budget and plan at buy time?routes_domain_buys.py:559 run_dueMedium
Doctor stalls at 1 of 10 with no reason; "passed" shown over zero checksDoctor, Home, Fleet healthMedium
Provision inboxes: hardcoded "DNS records added for you", unstable hidden count, agency-wide listweb/…/domains/provisionMedium (or move to staff)
Notifications scope: engine client code reported in a pod workspacenotifications feedMedium
Wiring pre-purchase check uses fixed names that are now takenwiring checkSmall
One planner: merge legacy wizard into v4, budgets on the planPlan.tsx, PlanV4.tsx, app.py:7669-7781Large
Domain pipeline view and counts that include queued and aging everywhereDomains, Home, Landing Factory, order wizard, SettingsLarge
Staff area: Provision, proxies, runners, hosting accounts, Failures, Wiring, Check historynav + settingsLarge
Pace setting (aging and warmup per workspace) replacing the hardcoded 14 days; plan schedules back from launch and offers ways to close a gaproutes_domain_buys.py:46, fleet_v4.py:60, routes_domain_connects.py:71, routes_orders.py:427, plan UILarge
Delete dead UIBuyPlans.tsx, BuyPlanRequests.tsxTiny