Agent Portal
Where an advisor gets their referral code, keeps their prospect list, and watches commissions land — on the web, at app.wellthplan.com/agent.
Agents are advisors at approved firms who refer clients to Wellthplan and earn a commission on every invoice those clients pay. The portal is their desk. The same account also opens the Advisor Portal in the mobile app — the two share the code, the contacts, and the payout statement; the web adds payout setup, CSV import, and a fuller commission view.
No screenshots yet: every page requires an agent account, which the docs capture account doesn't have.
Getting a code
Registration lives at /sign-up/agents (marketing links point here). It is the normal Wellthplan sign-up with an agent branch: create an account (email, Google, or Apple), verify a phone, then Get your referral code — a centered card asking for the firm (a dropdown of approved firms, with a "Request it" mail link when theirs is missing) and any identity fields the flow doesn't already know. Submitting issues a six-character code immediately and sends the welcome kit: an email and, when a phone was given, a text with the code, the share link, and a QR.
The success screen — "You're all set, {first name}." — spells the code out in tiles, offers Copy your share link, shows a QR ("Show this in a meeting — it opens signup with your code already applied"), then Go to your dashboard and the app-store badges. An agent who is already a paying member gets the plain success screen; everyone else sees the same screen as a call-out, because there is one more thing to do.
A code does not require a membership. Payouts do. An agent can stop at the code and start sharing it that day — referrals and commissions accrue from the first client. But commissions only pay out while the agent holds an active Wellthplan membership of their own, so the portal keeps reminding them until they finish. Choosing to finish (the banner, the account menu's Subscribe, or the Payouts page link) drops them into the consumer onboarding — link accounts, budget, paywall — for a plan they own. Their own referral code is never applied to their own plan.
Forgot the code? /sign-up/agents/forgot-code takes the registration email and, when it matches, opens the referral landing page for that code. Unknown emails get a generic "couldn't find an account" — the form never confirms whether an address is registered.
Invited by Wellthplan? Agents an admin adds by hand or by CSV get an activation email instead. Its link opens /agent/invite: "You've been invited — Welcome, {name}. Your referral code is {code}." They set a password (the invited email is pre-filled but changeable), or sign in with Google / Apple / an existing account, then confirm name, birthday, and phone with a text code. Their code was already issued when the admin created them; the activation just attaches a login. A second activation email confirms the code and share link once the claim completes.
Signing in
There is one sign-in for everyone: /sign-up → Sign in. An account with an agent record lands in the portal; a consumer lands in their app hand-off. Old /agent/login bookmarks forward to the shared sign-in. A signed-in user with no agent record who opens /agent is sent to /sign-up/agents to get one.
The portal
A dark floating header (wordmark, avatar menu), an icon rail on the left that expands on hover — Home, Contacts (with the contact count), Subscribers, Payouts — and a floating bottom tab bar on phones. The avatar menu holds Profile, Subscribe (only while the membership isn't active), Light / Dark mode, and Sign out.
A green setup banner sits above every page until setup is complete, in priority order:
- Membership — "Your $40.00 is on hold until you set up your own Wellthplan account" (with the accruing figure when there is one; "Your commission is on hold…" otherwise). The subtitle is honest about the stakes: commission accrued while the membership is inactive is forfeited at payout time, not held. Set up my account starts the finish flow. Dismissable for the browser session.
- Payout setup (firms paid through Stripe only) — "Payout setup is incomplete — your firm pays commissions through Stripe, so connect a bank account to receive them." Set up payouts opens the Payouts page.
Firms that pay agents through their own commission grid never see anything about Stripe: the switch is per firm, and for them the Payouts page simply notes "Commissions are disbursed through your firm's grid."
Home
This month with the date range, and two actions top-right: Invite a client (the native share sheet with the referral link, or "Link copied!" where sharing isn't available) and Copy link.
- Finish payout setup to get paid — an action-required card, Stripe firms only, until Stripe confirms payouts are enabled. Its button goes straight into Stripe's hosted onboarding.
- Commission accruing — a dark card: this month's accrual as a large figure, a green "+$15.00 vs August" chip when it's ahead of last month, and Paid to date with a Payout history → link. Accrual is paying subscribers × $5 — the same lifecycle estimate the app shows; the ledger truth is on Payouts.
- Referral code — QR, the code, the link spelled out, Share, and Landing page (opens
/r/{'{code}'}in a new tab so the agent sees what a prospect sees). - Your referrals — six tiles: total signups, active subscribers, trialing, cancelled, conversion, churn (rates read "—" without a denominator). All subscribers → opens Subscribers, the list behind the numbers.
- Get in on the app stores — "You're a member too" with the iPhone and Android badges.
Contacts
The prospect list, shared with the app's Contacts tab. The web can't read a phone's address book, so the way in is Import a CSV — the empty state's pitch, with a footnote that phone contacts synced from the mobile app show up here automatically.
Import CSV opens a dialog: drop a file (Google Contacts, Outlook, or spreadsheet exports all work), confirm how its columns map to Name (or First + last name), Phone, and Email — guessed from the headers, each overridable — preview the first five rows and the count that will upload ("42 contacts ready to import · 3 rows skipped (no name, or no phone/email)"), then Import. Contacts already in the list are matched by email, then by phone, and quietly updated rather than duplicated; the result reads "12 contacts added · 2 existing contacts updated · 3 skipped — already in your list or missing contact info". Re-uploading the same export is safe.
Once there are contacts the page is two panes. On the left, a search field, filter pills — All, Pending, Accepted, Expired, Members, each with a count that holds steady while you search — and the rows: photo or initials, name, how to reach them, and a status chip (Pending, Expired, Gift sent, Member, Accepted) when there's history. Member means the contact already has a Wellthplan account they signed up for on their own (matched by email or phone) — no invite needed, so the row has no checkbox and the detail pane's Email button is disabled; its tooltip and the activity timeline read "{First} has been a Wellthplan member since {Month Year}" (the month their account was created). A contact match never reads Accepted, even when the person signed up with this agent's own code — that chip is reserved for an invite the agent sent; self-signups show under Subscribers. The match runs when contacts are added, imported, or edited, and again whenever someone new signs up. Rows load 50 at a time. Ticking any checkbox pivots the header into bulk mode — Select all (every invitable contact the current search and filter can reach, not just the loaded rows) and Invite selected (12); only contacts with an email and nothing already out are checkable. The result line reads "12 invites sent · 2 skipped".
Picking a contact fills the right pane:
- A hero row — photo, name, the same capsule — and three action pills. Text opens the agent's own Messages app pre-filled with their referral link (disabled without a phone). Email sends the contact their own invite link; while one is out the pill reads Remind, and it's disabled without an email or once they've joined. Gift opens the gift dialog; while a gift waits to be claimed it becomes Gift link (copies the claim link), and reads Gifted once claimed.
- Phone and Email fields — email is editable in place (the common case is adding an address to a phone-only contact so an invite can go out).
- Invite activity — a small timeline built from what the record can prove: added (and whether it came from a phone sync), invite sent with your code and when it expires, gift sent and whether it's been claimed, accepted. Live items get a green dot.
- While an invite is pending or expired, a footer nudge — "Sam hasn't accepted your invite yet. A nudge can bring them back." — with Resend invite and, for a live one, Revoke (the emailed link stops working and the contact goes back to uninvited).
Subscribers
Everyone who signed up with the agent's referral code — the people behind Home's Your referrals tiles — shared with the app's Subscribers tab. Under the title a count line reads "12 signups with your code"; the rows below sit in one card, newest signup first: initials, the client's name (their org name, then email, when they never set one), "Joined Mar 4, 2026", and a status chip — Active (paying this month), Trialing (on their free trial), Cancelled (their subscription ended), or Not subscribed (signed up with the code but never started a trial or subscription; kept so the list adds up to "Total signups"). Above the card, the same search box and filter chips as Contacts: the search matches name, org, or email as you type, and the chips — All, Active, Trialing, Cancelled, Not subscribed — carry their unfiltered counts. No matches shows an in-place line ("No subscribers match "ann"", or a chip-specific one such as "Nobody is trialing right now."). Read-only: nothing to open. With no referrals yet, the page shows "No subscribers yet" with an Invite a contact button into Contacts.
Payouts
Under Payouts the rate line: "$5.00 for every monthly referral invoice paid. $50.00 for an annual one." Then, as needed, banners: payout setup complete ("Commissions transfer on the 1st of each month"), Stripe still reviewing / needs more information, your setup link expired (they're single-use — Generate a new link), commissions that hit a transfer error and will retry automatically, and the membership warning ("pending commissions forfeit on the monthly run until you activate your subscription" — Reactivate your subscription).
Three cards: a dark This month hero with the current payout month's accrual in gold and its commission count, All time, and Commission earned (the count). Below, a History list of months on the left — click one — and that month's detail on the right: the month, its status when money is in motion (accruing / pending; a paid month needs no label), a retrying chip if a transfer errored, the amount with its plan split ("1 annual · 2 monthly"), and a Plan / Commission table with one line per commission — Annual $50.00, Monthly $5.00. Months whose payout date hasn't arrived are left off: the page reports what's been paid and what's due, nothing else. With no commissions yet: "Share your referral link to start earning."
Payout account (Stripe firms) closes the page: the Connect status — Not set up, Onboarding in progress, Action required, Payouts enabled — with a sentence on what to do, Set up payouts / Continue payout setup / Update payout details into Stripe's hosted onboarding, and once enabled Manage bank & payouts in Stripe (their own Express dashboard, in a new tab).
How the money moves. Each time a referred client pays an invoice, a commission is scheduled for the following month — $5 for a monthly plan, $50 for an annual one. On the 1st, the monthly run pays every commission whose month has arrived, provided the payment wasn't refunded, the client is still subscribed, and the agent's own membership is active (otherwise that commission is forfeited). Which way the money travels depends on how the advisor's firm has chosen to be paid: firms on Stripe Connect get a transfer straight to each advisor's connected account, while firms paid directly receive the month's total from Wellthplan and disburse it themselves — those commissions are recorded and close out once Wellthplan's accountant marks the firm's month settled. A failed transfer is retried on the next run.
Profile
Your details — name and phone (firm and referral code are shown read-only: "set by Wellthplan, contact support if either needs to change"). Subscriber alerts — a switch for an email whenever someone signs up with the code or cancels. The alert names who it was (the same name the Subscribers page shows — their name, else their household name, else their email) alongside the agent's updated totals; it never carries the client's contact details or anything else about them. Password & Email — change either (an email change sends a confirmation link to the new address). Membership — whether payouts are accruing, and Sign out.
The referral landing page
app.wellthplan.com/r/{'{code}'} is what a prospect opens from a text, a QR, or a share card: Benjamin, "You've been invited to Wellthplan.", "{Agent} from {Firm} invited you to try Wellthplan", a 30 days free with this invite pill, a QR ("Scan to download"), the code with tap-to-copy, Get Started (web sign-up with the code applied) and the store badges, plus a collapsible How to use your code for the mobile app ("Have a referral code?" during sign-up). Share and download-card icons sit under the headline — the download renders a PNG share card for texting. Link previews in iMessage and the like carry "Join Wellthplan" and the agent's name. An unknown code gets "Code not found" with a plain Get Started.
Opening the page remembers the code in the browser, so a prospect who wanders off and signs up later still credits the agent. Trial length for a referred client is 30 days instead of 14 when the referring agent holds an active membership.
Old links
/sign-up/agents/start and /sign-up/agents/payouts (where Stripe used to return to) forward to their current homes with the query intact, so emailed links and Stripe return URLs from before a move keep working. /agent/subscribers — once the pre-Contacts name, then a redirect to Contacts — is a real page again (the Subscribers list above), so old bookmarks land on the roster rather than the prospect list.