Billing and Customers UI: accurate plan state, readable at every width
Goal: Customers, the Plan tab, Products › Plans and Billing state one accurate plan and sync status. They read cleanly at 1440px and on a phone, and load without long spinners. Items are examples. Decline any that is no longer present.
Consolidates drafts 7889 (items 1, 3–5), 7906, 7887 (items 1, 5), 7892 (item 4) and 7881 (items 4, 5 Plan tab).
Plan truth
1. Billing › Products flips between "Enterprise · Current plan · Free" and "Individual · Changes to Enterprise on Nov 12 · $25.00/mo" depending on hosting. Show one consistent plan line.
2. History "Kept the current plan · System" (from `org_plan_admin.push_to_stripe` → `subscriptions.undo`) names neither the plan nor why. Say which subscription was kept and after what move.
3. Plan tab: a sold plan whose push failed for good shows "Syncing to Stripe…" forever. Say "Not synced" with the reason from `org_plan_push_failed`.
4. The off-plan notice (`components/billing/PlanUpgradeNotice.tsx`) sends the operator to the subscription page. Link to the org's Plan tab (`customerUrl(orgId, { tab: 'plan' })`).
5. Customers › Operator › Plan tab takes many seconds to load on a fresh stack. Profile the reads and fix them.
Layout
6. The Customers list at 1440px clips each row's ⋯ button.
7. Customers phone card: empty "—" cells read as a dense label run. Drop them, as other lists do.
8. Products › Plans phone card: Status sometimes shares the Price line and sometimes wraps. Use one layout, and indent wrapped Terms under the value.
9. The Awaiting approval card shows the email twice when the applicant has no name.
10. Customer sub-tabs at 390px cut off the last tab with no scroll affordance.
Out of scope: prices, plan terms, the hosting purchase flow.
Done means:
- Each item shipped or declined, with 1440px and 375px screenshots for the UI items.
Required checks: ./dc check full
Outcome
Shipped 8 of 10 billing/Customers UI items in #6236: one consistent plan line, a named undo history line, "Not synced" with Stripe's reason, the Plan-tab link, and fit at 1440px/375px. Declined #5 (not reproduced; reads take 5–20ms) and #10 (already shipped). The lane merged it after the full gate. Its deploy was superseded by a newer develop commit. Visual check done. Follow-up draft #7979.
Artifacts
Activity
- Created
- Run
- Runner started
- Runner ended (done)