Advisor Portal
Advisors who signed up on the web get their own surface in the app — and a way in that doesn't force a subscription on them.
Agents register on the web (the Agent Portal covers registration, the web dashboard, and payouts; Sign-up covers the consumer flow they branch off), get their referral code immediately, and may stop there without ever subscribing. When one of them logs into the app, they used to be funnelled straight into consumer onboarding and its paywall. Now they get a choice.
No screenshots yet: the welcome pitch, the Agent view home, and the two menu variants (Subscribe vs. plan rows) all require an agent account — one without a live membership for the first three, one with for the last — which the docs capture account doesn't have.
The subscribe pitch
An agent who logs in with onboarding incomplete and no membership sees one full-screen pitch before anything else: Benjamin, "Start earning your commission", and a line reminding them their referral code is already live and earns $5 a month per client — commission just doesn't pay out until they hold a membership of their own.
The middle of the screen puts the code to work immediately: a QR of their web sign-up link (app.wellthplan.com/r/{code}) on a white tile, with the code spelled out beneath it. Scanning it lands a client on sign-up with the code applied; tapping it opens the native share sheet with the same link.
- Subscribe (green) drops them into the normal onboarding wizard (intro → link accounts → budget → paywall), exactly the consumer path; trial and pricing details live on the paywall itself.
- Not now is remembered on the device: this launch and every later one skips the pitch and opens the Agent view directly. Subscribing stays one tap away in the account menu.
An agent who takes the wizard isn't locked in: the link-accounts step, the gauge-setup step, and the paywall each carry an Advisor Portal action in a top-right ellipsis menu (the paywall folds it into its existing menu; the other two show the ellipsis only to agents). Choosing it behaves like "Not now" — the pitch is marked answered on the device and the app opens the Advisor Portal.
The Agent view
Four native bottom tabs, the same bar treatment as a space's tabs: Home, Contacts, Subscribers, and Payouts.
Unsubscribed agents also get a card-surface ribbon that slides down from the very top of the screen — full-bleed over the notch with rounded bottom corners, styled like an incoming iOS notification: "Subscribe to unlock payouts" with an inline green Subscribe pill (same wizard route as the account menu) and a dismiss X. It appears on all four tabs; everything on the page shifts down to make room and glides back when dismissed. Dismissing it on any tab closes it everywhere, for the rest of the app session — the nudge returns on the next launch.
Home mirrors the web portal's Overview page:
- This month — the commission accruing so far: paying subscribers × the $5 monthly rate, wearing the gold prism shimmer once it's above $0 (plain ink at zero, same rule as the Payouts hero). It's the lifecycle estimate, the same figure the web portal shows, not the payout ledger (that's the Payouts tab).
- Your referrals — a 3×2 grid of all-time stats: total signups (everyone who used the code), active subscribers (paying this month), on trial (not yet paying), and cancelled, plus two derived rates — conversion (active ÷ signups) and churn (cancelled ÷ everyone who ever paid). Rates read "—" until there's a denominator. The people behind these numbers are listed on the Subscribers tab.
- Referral code — the same white-tile QR as the welcome pitch, sized down, beside the code and a Share button. Tapping the QR or the button opens the native share sheet with the sign-up link.
Agents with no referrals yet see real zeros, not an empty state — the numbers are the page.
The chrome is a single glass pill in the top-right corner, the same double pill as Home's bell-and-avatar cluster:
- Share opens the native share sheet with the agent's referral link (
app.wellthplan.com/r/{code}) — the same link Settings → Share Wellthplan sends for agents. - Settings (gear) opens a native menu:
- Account — the standard Account settings page.
- Subscribe (unsubscribed agents) — routes into the onboarding wizard to start a membership.
- {Plan name} or Plans ▸ (subscribed agents) — their plan if they have one, or a submenu listing all of them; picking one selects that plan and opens the Home tabs.
- Sign Out — same confirm dialog as Home's avatar menu.
Contacts (leads)
The agent's prospect list. Two ways in:
- Sync contacts — the empty state's pitch and primary button. The consent step adapts to how permission arrives: when the tap raises the native contacts prompt (or the iOS 18 select-contacts picker), that grant is the consent and the sync runs immediately; when permission was already granted — no native UI appears — the app confirms the exact count ("Sync N contacts? New contacts are added and existing ones are updated — nothing is duplicated.") before anything is uploaded. Denied permission gets an alert with an Open Settings shortcut. The app gathers every contact with a name plus a phone or email; contact photos ride along in a background pass and appear on the lead rows. Re-syncing later (from the corner menu's Sync Contacts) is safe and never creates duplicates: contacts already synced from this device are matched by their device id; a device contact that matches an existing manually added or CSV-imported lead by email or phone number updates that lead instead of adding a twin; and only details that changed on the device are written (a device value never blanks a field typed into the app). The result alert reports the numbers ("12 added, 2 updated, 3 unchanged", or "Everything is already up to date.").
- Add contact — a manual entry page behind the corner control. Only a name is required (phone and email are optional, though email is required for invites and gifts). Besides the plain Add Contact save, Invite and Gift buttons sit side by side beneath it — each adds the contact and immediately runs its flow (the invite email, or the gift sheet); both stay disabled until an email is entered.
The corner control is an ellipsis menu: Add Contact (the manual entry page), Bulk Invite (shown once any contacts exist), and Sync Contacts — always available, so an agent who has already synced can pull in newly added phone contacts or refresh changed details at any time.
Once leads exist the page gets its header: a "Contacts" title with the total contact count beneath it and a name-search field. Each row shows the contact's photo (initials when there isn't one), the name, how to reach them, a status capsule when there's invite or gift history — Pending Invite (a live invite link is out), Invite expired (it lapsed unanswered), Gift Sent (a prepaid gift is waiting to be claimed; it outranks the invite states when both apply), Already a member (they already have a Wellthplan account they signed up for on their own — no invite needed; it outranks the invite states but sits under a waiting gift), Accepted (they signed up or claimed their gift) — and a chevron into the lead detail page. The still-waiting capsules (Pending Invite, Gift Sent, Already a member) are neutral gray; only the outcomes carry color, so a long list of sent invites doesn't read as a wall of wins. Filter pills under the search field cut the list by capsule — All, Pending (anything waiting on the contact: a live invite or an unclaimed gift), Accepted, Expired, Members — each with its own count, which stays put while a filter or search is active.
How a contact becomes Already a member: when a contact is added, synced, imported, or edited, Wellthplan looks for an existing account with the same email or phone number. Any match reads Already a member, so the agent knows not to re-invite them; the row can't be checked in Bulk Invite, the Email tile is disabled, and the detail page's footnote reads "{First} has been a Wellthplan member since {Month Year}" (the month their account was created). This is true even when the person signed up with this agent's own referral code via the link — Accepted is reserved for an invite the agent actually sent (or a gift they claimed), so the Contacts tab never claims a win the agent didn't work for; those self-signups still show under Subscribers. The match also runs the other way: when someone new signs up, any advisor holding them as a contact sees the capsule appear without doing anything.
Bulk Invite (in the corner menu) turns the list into a checklist — the corner control becomes a Cancel, and each contact gets a checkbox in the app's usual multi-select treatment: unchecked rows dim, the checked ones stay full strength. Each row's second line swaps from phone number to email address — selection is about who gets an email, so it shows where the invite would land. Only contacts who can actually take an invite are checkable — an email and nothing already out. The rest lock with the reason on that same line: Add email to invite for contacts without an address, Already Invited while an invite link is live (a gifted or accepted contact just keeps its capsule). Search and the filter pills keep working, and checks survive both. A Select all action sits in the top-right corner beside the Cancel button — it checks every invitable contact the current search/filter can reach (not just the rows loaded so far) and greys out once they're all checked. A floating pill above the tab bar counts the selection ("12 selected") with a Clear action (empties the checks, stays in the mode) and an Invite 12 button; tapping it confirms — "Send 12 invites? Each contact gets their own unique invite link by email." — then sends in batches of 25 behind a progress overlay ("Sending invites... 25 of 100 sent") and closes with a summary of what went out and what was skipped. Each contact gets their own unique link, exactly as if invited one at a time.
After that first sync, the list quietly keeps itself current: once a day on app open — and only when contacts permission is still granted — the app re-reads the address book in the background, adds new contacts, merges detail changes, and fills in missing photos. No prompts, no spinners; it just stays fresh.
The detail page follows the Apple Contacts pattern: a large photo with the name centered beneath it, and where Contacts puts its "Emergency Contact" badge, the same capsule the list row wears — Pending Invite, Invite expired, Gift Sent, Already a member, or Accepted (nothing when there's no history). Under the name sit three action tiles:
- Text — opens the agent's own Messages composer, pre-filled with their referral link. It sends from the agent's number, never the product's (texting a prospect from the product's number without prior consent is a TCPA problem). Disabled when the contact has no phone.
- Email — the invite itself. Wellthplan emails the contact a unique invite link that opens the web sign-up pre-filled with their email and already credited to the agent; the lead flips to Pending Invite the moment the email goes out, and to Accepted the day they accept. The same button follows the invite's life: a reminder while a link is out (same link, fresh validity, one per 24 hours) and a fresh link once one expires. Disabled until the contact has an email, once they've signed up, and for contacts who are already members (the footnote reads "Ann is already on Wellthplan — no invite needed."). What the recipient sees, how long links last, and the dead-link outcomes are on Invite Links.
- Gift — a prepaid Wellthplan subscription, paid upfront by the agent. Tapping it opens a full bottom sheet with the three tiers (3 / 6 / 12 months, the list price crossed off next to the commission-discounted price), an optional personal note, a "Sends to" confirmation of the contact's email, and a pinned summary + Pay bar that runs the same in-app payment sheet the consumer paywall uses, charging the agent's own card. On success the agent gets Copy link / Share to text the claim link themselves; while it waits to be claimed the tile reads Copy Link, and Gifted (disabled) once it is. Tiers, pricing, the recipient's claim, and what it means for commissions are on Gifting.
Beneath the buttons, a card carries the contact's phone and email, and a one-line footnote tells the invite's story (sent and expiry dates, sign-up date, or what Email will do); a gifted contact gets a second line with the gift's ("You gifted 6 months · claimed Mar 3", or "waiting to be claimed"). Synced contacts keep their name and phone locked — they mirror the device address book, and a re-sync would overwrite edits anyway — while email stays editable in place (the primary case: adding an email to a phone-only contact, which is what an invite needs). Manual leads are fully editable. A save keeps the create-time rule: a name (phone and email stay optional).
While an invite is out (or expired), the page header gains an ellipsis menu with one destructive action: Revoke invite. After a confirm, the emailed link stops working and the contact returns to the uninvited state, ready for a fresh invite later.
Further lead actions (converting, removing) land in a later step.
Subscribers
Everyone who signed up with the agent's referral code, in one list — the people behind the Your referrals numbers on Home. Under the "Subscribers" title a count line reads "12 signups with your code"; the rows beneath form one grouped card, newest signup first. Each row carries an initials avatar, the client's name (their org name, then email, when they never set one), a "Joined Mar 4, 2026" line with the day they signed up, and a status capsule:
- Active (green) — paying this month.
- Trialing (amber) — on their free trial, not yet paying.
- Cancelled (red) — their subscription ended.
- Not subscribed (neutral gray) — they signed up with the code but never started a trial or subscription. They stay in the list so it adds up to Home's "Total signups".
Between the count line and the list sit the same glass search field and filter pills as Contacts: the search matches a subscriber's name, org, or email as you type (no round-trip — the roster is already on the device), and the pills — All, Active, Trialing, Cancelled, Not subscribed — each carry their unfiltered count, the active one in the primary green. The header stays fixed while the rows scroll and dissolve beneath the search bar. When nothing matches, the list says so in place ("No subscribers match "ann"", or a pill-specific line like "Nobody is trialing right now") instead of showing the empty-state pitch.
The page is otherwise read-only: there is nothing to open on a subscriber. An agent with no referrals yet sees a centered empty state ("No subscribers yet" over a line explaining that everyone who signs up with the code lands here) rather than a bare page; sharing the code lives on Home and inviting on Contacts. Not captured here: the populated list and its four capsules need an agent account with referred clients, which the docs capture account doesn't have.
Payouts
The web portal's commission statement, in list form. Under the "Payouts" title, a THIS MONTH hero shows the current payout month's accrual as a large figure with a "September 2026 · 3 commissions" caption beneath — the figure carries the gold prism shimmer once there's money on the board, and stays plain ink at $0.00. A HISTORY section follows: one divider-separated row per past month — the month name with its commission count as the caption, the amount owed on the right — closed by an All Time total row (every earned dollar, current month included) and the rate line, "$5.00 for every monthly referral invoice paid, $50.00 for an annual one." (built from the live per-invoice rate). It's the same data as the web Statement table minus the status column, and months whose payout date hasn't arrived yet ("projected") are left off, same as the web — the page reports what's been paid and what's due, nothing else. An agent with no commissions at all keeps the $0.00 hero (captioned "· no commissions yet") over a centered empty state — a circled green dollar mark, "No payouts yet", and "Your first commission lands here the month a referral's invoice is paid." — in place of the history section.
Getting there as a subscriber
A subscribed agent lives in the normal app. Their entry to this surface is a new Advisor Portal row in the Home header's avatar menu, alongside Plan Settings and Switch Plan. From the Advisor Portal, the plan row(s) in the account menu take them back.