Investors & Onboarding
See Core Concepts for the custody model, wallet naming, and the Investment Capacity mechanics this page assumes.
This page covers three related, but distinct, screens in Tahoe:
- Onboarding — the manager-facing review queue for pending submissions.
- Investors — the org-wide directory of invitations and accepted investor profiles.
- Individual Investor Profile — the full record for one investor once they're in the base.
Investor Lifecycle
- Invited — Fund manager invites an investor to begin onboarding with them. The investor receives an email invitation and accepts it and begins onboarding by setting up their login credentials; a profile is created. No fund assignment, subscription, or investment yet.
- Onboarding — the full pre-investment process, in order:
- KYC — investor begins onboarding by filling out the required KYC data and providing any additional documents. Identity verification happens first, before anything financial.
- Form + subscription agreement — the investor completes the assigned onboarding form, which includes a subscription agreement: a template the fund manager authored in advance, filled in with the investor's intended investment amount and e-signed.
- Reviewed — a manager reviews the submission in the Onboarding queue: the integrated KYC result (pass/fail only), any additional info or documents the manager specifically requested, and the subscription agreement.
- Approved — If everything looks good and the manager does not need any additional information from the investor, they approve. Approving counter-signs the subscription agreement as part of the same action. The agreed amount becomes the investor's investment cap for that fund.
- Wallet provisioned — only after onboarding is accepted does Tahoe provision the investor's wallet (see Core Concepts — nobody self-custodies).
An investor's capacity isn't fixed after this point — see Core Concepts → Investment Capacity for how caps accumulate, how redemptions free up room without lowering the cap, and how the investor portal's "Increase Subscription Capacity" action starts a new agreement.
This lifecycle describes an investor's first onboarding to the organization. Onboarding happens once per organization, not once per fund — see Applying to an Additional Fund below for what happens when an already-approved investor wants into a second fund under the same org.
Applying To An Additional Fund (Same Organization)
An investor's KYC/profile is submitted once per organization, not once per fund. When an already-approved investor wants to invest in a different fund under the same organization, this is not a full re-onboarding.
Still required for every additional fund:
- Eligibility check — does the new fund's investor-type criteria match what's already on the investor's profile? If not, the investor adds the missing declaration via the Individual Investor Profile's Add Subscription / Update Info flow, rather than redoing the whole profile.
- A fund-specific subscription agreement — the investment amount and cap are set per fund, so this is always signed fresh for the new fund, same as any subscription agreement.
- Manager review and approval — the manager still needs to confirm eligibility, that the subscription agreement is properly signed, and that the investor is legally permitted to invest in that specific fund. This is not automatic just because the profile already fits — it goes through the same Onboarding queue review as any other submission, just without re-collecting KYC/profile information already on file.
If a fund manager genuinely needs a fresh full onboarding for a particular fund, they can request it — but that is the exception, not the standard process.
Planned for V2 — periodic full resubmission
A fund manager should have the ability to request a full resubmission from an existing investor at any time — not only when applying to a new fund — for example, an annual KYC refresh. Not required for any investor by default; a manager-initiated action when they want it. Low priority, unlikely to be needed for a while — deferred to V2.
Onboarding (Review Queue)
Canonical route unconfirmed
This section describes the Onboarding screen as observed in the product. The canonical route was not in the source docs — confirm with Vlad before treating any route reference here as final.
The Onboarding queue is where a manager triages submissions before someone becomes a full investor. It is separate from the Investors directory — this page is about work waiting on a manager, not the full investor base. This includes both first-time onboarding submissions and additional-fund applications from already-approved investors (see Applying to an Additional Fund).
Summary Cards
| Card | Meaning |
|---|---|
| New submissions | Awaiting initial review. |
| Under review | Currently being reviewed by a manager. |
| Action required | Additional information was requested from the investor. |
Submission Queue
| Column | Meaning |
|---|---|
| Investor | Name on the submission. |
| Investor Type | Individual, Entity, Trust, SDIRA, or Solo 401(k). |
| Submitting investor's email. | |
| Fund | Fund the submission is associated with, where applicable. |
| Status | Effective review status (e.g. approved, under review). |
| Submitted | Submission date. |
Filterable by status and investor type; searchable. An Add Investors action on this screen starts the same invitation flow described under Investors.
What A Manager Sees When Reviewing
| Source | What's visible |
|---|---|
| Tahoe's integrated third-party KYC check | Pass or fail only. Underlying identity documents and PII are never shown to the manager. (Optional) |
| Custom onboarding-form fields the manager configured | Whatever was requested — including uploaded documents — is visible and stored. An investor may be asked for the same information twice (e.g. SSN or tax ID): once for Tahoe's KYC check, and again if the manager separately requested it as a form field. This is intentional, not a duplicate-collection bug. |
| Subscription agreement | The investor's filled-in template: investment amount, details, and e-signature. The manager reviews it for completeness. |
Approve, Reject, Request more information
Approving a submission is one action that does all of the following:
- counter-signs the subscription agreement;
- sets the investor's investment cap for that fund to the agreed amount; and
- moves the investor's status to Approved.
Rejecting submission - another option for the fund manager where they reject an investor for any number of reasons such as false information, determination they are not qualified to participate in their offering or any reason they want. They can also be rejected if the integrated Tahoe KYC flow fails for any reason.
Request more information - from time to time a fund manager may require more information before approving an investor. In this case they prepare a Request for more information and send that to the investor. AngelList and other onboarding platforms have this work very nicely and we should attempt to do this as well.
Investors (Directory)
Purpose And Operating Boundary
The Investors page is the fund manager's organization-scoped registry for investor invitations and accepted investor profiles. It combines two related but separate datasets:
- Invitations — people the organization has invited, and whether each invitation is pending, accepted, expired, or cancelled.
- Investor Directory — investor profiles the organization can manage because the investor belongs to the same site, invested in one of the site's funds, or accepted an invitation from the site.
An accepted invitation creates or selects an investor profile. It does not assign the investor to a fund, create a subscription, transfer money, issue shares, or approve onboarding. If the investor signs a subscription agreement for a fund, this officially adds them to that fund, even if they have not invested — it will simply show $0 invested.
Summary Metrics
| Metric | Meaning |
|---|---|
| Total investors | Number of investor profiles in the currently loaded directory result. |
| Approved or active | Loaded profiles whose lifecycle is Approved or Active. |
| In review | Loaded profiles whose lifecycle is Submitted or Under Review. |
| Total invested | Confirmed invested amount summed across the currently loaded profiles. |
Invitations
| Column | Meaning |
|---|---|
| Invitee | Name and email entered by the manager. |
| Type | Individual, Entity, Trust, SDIRA, or Solo 401(k). |
| Status | Pending, Accepted, Expired, or Cancelled. |
| Expires | Pending invitations expire seven days after creation or resend. |
| Invited by | Manager who created or last refreshed the invitation. |
Investor Directory
Displays name, email, profile type, lifecycle status, invested funds, and last activity. A Pipeline view groups the same filtered profiles into lifecycle lanes: Invited → Submitted → Under Review → Approved → Active → Rejected.
| Lifecycle status | Operational meaning |
|---|---|
| Invited | Invitation accepted, profile exists, onboarding not complete. |
| Submitted | Onboarding form and subscription agreement submitted for review. |
| Under Review | A manager is assessing the submission (see Onboarding). Would also include if more information was requested. |
| Approved | Reviewed and approved; investment cap set, but no investment has been made. |
| Active | Investor has an active investment. |
| Redeemed | Investor is no longer active, they fully redeemed from all funds and hold no more investments (data reserved for 7 years). |
| Rejected | Onboarding, KYC, accreditation, or a manager decision rejected the investor. |
Invite An Investor: Full Cycle
This is the full cycle for someone new to the organization. For an investor who's already onboarded and approved elsewhere in this org, see Applying to an Additional Fund instead — it's a lighter path that skips re-collecting KYC/profile information.
- Prepare the invitation — name, email, investor type. For Individual, Entity, and Trust, select a published onboarding form (which includes the subscription agreement template). Each fund will need its own onboarding form so it has the correct subscription agreement preloaded. SDIRA and Solo 401(k) intentionally skip the onboarding form for V1 — wait until there's real demand before building form support for these types.
- Send the invitation — investor receives an email with a signup link.
- Investor accepts — By selecting accept from the email they are directed to create or sign into an account with the invited email, then begin onboarding.
- Onboarding — the full pre-investment process: KYC, onboard, sign subscription agreement with amount to cap investment at first (see Investor Lifecycle above — this order matters and was previously documented backwards).
- Manager review — via the Onboarding queue. At this stage the manager reviews the submission and either approves, rejects, or asks for more information. If approved, they automatically counter-sign the agreement and set the investor's cap. Then wallet provisioning is automatically activated for the user unless this is not their first fund with this organization (one shareholder wallet per investor, unless shares are held on multiple chains where the same wallet is not usable).
- Approved / Active — investor now appears fully in the directory and can invest (via Investment Management) up to their capacity, or request more room via "Increase Subscription Capacity" on the investor portal.
Confirmed bug — form assignment can be lost
The frontend sends a form-template identifier when creating an invitation, but the backend does not currently accept that field. Invitations sent this way can lose their form assignment. Confirmed as a real bug needing a fix, not intended behavior.
Confirmed bug — cross-domain invitation link
Invitation emails link to one domain, while acceptance validation checks against the site that created the invitation. Depending on how those origins resolve, this can make an invitation unusable. Confirmed as a real bug needing a fix.
Individual Investor Profile
Canonical route unconfirmed
Observed as a per-investor detail page reached from the Investors directory. Confirm the canonical route with Vlad.
The full record for one investor once they're in the base. Reached from the Investors directory or the Onboarding queue.
Header And Summary
Header shows the investor's name, email, and status badges (e.g. Active, Approved), plus Add Subscription and View Transaction History actions.
Add Subscription lets the fund manager manually record a subscription that happened outside the app for an existing investor — for example a new subscription agreement raising their cap, or correcting an issue with a prior one. To bring an existing investor into a different fund they're not already part of, use Invite Investor on that fund's Investment Management tab instead.
Add Subscription creates an investor-owned signature draft. It does not confirm, fund, price, or issue the investment — that happens later, separately, via Issue Shares in Investment Management.
End-to-end flow:
- The fund manager enters the intended amount and funding source, then creates the signature draft. When a positive NAV is available, the sheet shows an informational whole-share estimate — this is not final issuance pricing, just context.
- Tahoe creates the investment for that investor and emails them a link to their subscription.
- The investor signs in, opens the subscription document through the e-signature provider, and completes the signature.
- The investor returns, reviews the investment details, and confirms.
- The fund manager can then use Issue Shares in Investment Management.
Do not issue shares before investor confirmation
Creating the draft is only the manager's first step. It is not evidence that the investment is funded, priced, confirmed, or ready for share issuance.
Add Subscription — Failures And Recovery
| Condition | Result and recovery |
|---|---|
| No eligible investor is available | Confirm the investor's profile is active and not rejected. |
| Amount is empty, zero, negative, or non-canonical | Correct the exact decimal string; do not round silently. |
| Latest NAV is missing or zero | The sheet shows the NAV and share estimate as unavailable. The draft can still be created — final pricing remains a later issuance decision. |
| Investor did not receive the email | Confirm the email on the investor's profile, check delivery and spam handling, and resend the existing link. Do not create a second draft merely to resend an email. |
| Subscription document cannot be opened | Confirm the fund's signing document and signing-provider configuration; keep the existing draft and retry once configuration is corrected. |
| Investor signed but Review is unavailable | Wait for the signature to be detected, then reload. Escalate the signing-provider callback if it remains undetected. |
| Investor signed but did not confirm | Ask the investor to reopen the link, continue to Review, and confirm. Do not issue shares yet. |
| Issue Shares is unavailable | Reload Investment Management and confirm signature, investor confirmation, funding, and legal requirements are all complete. |
| Tile | Meaning |
|---|---|
| Total Invested | Confirmed invested amount for this investor. |
| Pending | Amount in flight, not yet settled. |
| Total Shares | Shares currently held. |
| Remaining Capacity | Cap minus currently invested amount — see Core Concepts → Investment Capacity for how this moves. |
| Total Redeemed | Cumulative redeemed amount. |
Tabs
| Tab | Contents |
|---|---|
| Profile | Investor type, status, KYC result and date (pass/fail per the visibility rule above — not underlying KYC-provider detail), accreditation, member since, last updated, and contact info (phone, date of birth, citizenship, address). Contact fields shown here are information the manager explicitly requested and stored — not raw third-party KYC data. |
| Onboarding | History of onboarding submissions for this investor, each with a Review action linking back to the Onboarding queue flow. |
| Documents | Uploaded documents — subscription agreement, any manager-requested supporting docs — with type, status, and last-updated columns. This section would also include any documents the fund manager sends to the investor such as a statement or tax document. |
| Funds | Per-fund Subscribed / Invested / Shares / Current Value. Empty until the investor's first investment settles. |
| Accounts | Bank accounts (via Plaid, for fiat) and on-chain wallets — the investor's own Tahoe-provisioned wallet(s) from Core Concepts, not to be confused with the fund-manager-side Manager Signing Wallet or Fund Holding Wallet. |
| Activity | Chronological log of actions on this investor's record (e.g. profile created, metadata updated) — scoped to this investor only. Distinct from Ledger (fund-level financial audit trail) and the separate org-wide audit page (broader, non-financial admin actions). |
| Communications | Correspondence history with this investor with ability to start a new one. |
An investor having multiple wallets of their own is possible and normal (more likely in a later version with BYOW (bring your own wallet)).
Unconfirmed — Communications tab
Observed erroring in the product at time of review. Not yet confirmed whether this reflects an incomplete feature or an environment-specific issue.
Technical Reference — Investors Directory & Invitations
Everything in this section covers the Investors directory and invitation API specifically — it does not (yet) cover the Onboarding queue or Individual Investor Profile sections above, which have no engineering trace of their own in the source repo. Carried forward unchanged from the prior investors.md; not part of this review's scope to edit.
Actors And Permissions — Fund Manager Roles
| Actor | Read Investor Directory | Read invitations | Create, resend, or cancel invitations | Update investor lifecycle |
|---|---|---|---|---|
| Owner | investors.read | Invitation read grant | Invitation write grant | investors.write |
| Admin | investors.read | Invitation read grant | Invitation write grant | investors.write |
| Ops | investors.read | Invitation read grant | Invitation write grant | investors.write |
| Auditor | investors.read | Invitation read grant | Not permitted | Not permitted |
Failures And Recovery
| Condition | Result and recovery |
|---|---|
| Invalid name, email, or profile type | Correct the highlighted input and submit again. |
| No published form for Individual, Entity, or Trust | Publish a matching form, then reopen or refresh the invitation sheet. |
formTemplateId rejected by user-api | Confirmed bug — do not claim the invitation was sent; align and deploy the user-api form-assignment contract before retrying the full flow. |
| Pending team invitation uses the same email | Resolve, cancel, or accept the team invitation before creating the investor invitation. |
| Invitation email was not received | Confirm the invitation is Pending. Use Resend once; the old link becomes invalid and the expiry resets. |
| Invitation expired | Cancel the expired row and create a new invitation. |
| Wrong account is signed in | Sign out and authenticate with the exact invited email. |
| Invitation belongs to another site | Return to the organization that sent it. Do not create a replacement under the wrong site. |
| Acceptance fails after profile validation | The transaction rolls back and the invitation remains pending; fix the profile or account condition and retry. |
| Invitation list fails but directory loads | Use Retry in the Invitations section. Do not resend from email or create duplicates blindly. |
| Directory is empty | Clear search, status, and fund filters; then confirm the investor accepted the invitation or has invested in a fund owned by this site. |
Capability Status
| Capability | Maturity | Execution owner or location | Current boundary |
|---|---|---|---|
| Read and filter Investor Directory | Live | This page and fund-manager API | Default response window is 50 profiles; there is no page control. |
| Table and pipeline views | Live | This page | Both views use the same loaded investor result. |
| Export investor CSV | Live | This page and fund-manager API | Uses current directory filters; excludes invitation records. |
| List invitation states | Live | This page and user-api | Default response window is 50 invitations; there is no page control. |
| Send SDIRA or Solo 401(k) invitation without a form | Live | This page, user-api, outbox, and email worker | By design for V1 — see Investors section above. |
| Send Individual, Entity, or Trust invitation with selected form | Partial | This page and user-api | Frontend sends formTemplateId; verified user-api schema rejects that field — confirmed bug. |
| Preview and accept a valid invitation | Partial | Public signup and user-api | Requires matching email and site — confirmed cross-domain bug, see above. |
| Create the accepted investor profile | Live | User-api | Leaves lifecycle at Invited; creates no fund assignment or subscription. |
Owner Operating Checklist
Before inviting
- Confirm the legal first name, legal last name, email, and intended profile type.
- Confirm the email is not already used by a pending team invitation.
- Confirm which fund they are onboarding to.
- For Individual, Entity, or Trust, confirm that a matching onboarding form (including the subscription agreement template) is published.
- Confirm the operator has investor-invitation write permission.
After sending
- Confirm the success state displays the correct email and expiry.
- Confirm one Pending row appears in Invitations.
- If resending, tell the investor to discard all earlier links.
After acceptance
- Confirm the invitation shows Accepted and the profile appears in Investor Directory.
- Confirm the investor completes KYC and onboarding form (including subscription agreement) and has been provided a wallet address for their shares (in that order).
- Review submitted onboarding under the Onboarding queue before approving.
- Approval sets the investor's cap — confirm the amount matches the signed subscription agreement before counter-signing.
Service Contracts
| Contract | Permission | Purpose |
|---|---|---|
GET /auth/investors | investors.read | Return the Investor Directory result. |
GET /auth/investors/export | investors.read | Download the filtered investor CSV. |
GET /auth/investors/{profile_id} | investors.read | Return the selected investor detail. |
PATCH /auth/investors/{profile_id} | investors.write | Update manager-controlled lifecycle, activity, and capacity metadata. |
GET /auth/investors/invitations on user-api | Invitation read | List same-site investor invitations. |
POST /auth/investors/invitations on user-api | Invitation write | Create or refresh an investor invitation and queue email delivery. |
POST /auth/investors/invitations/{id}/resend on user-api | Invitation write | Rotate and resend a pending invitation. |
DELETE /auth/investors/invitations/{id} on user-api | Invitation write | Cancel a pending or expired invitation. |
POST /public/invitations/preview on user-api | Public, site-scoped | Preview a valid pending invitation without consuming it. |
POST /auth/invitations/accept on user-api | Authenticated invitee | Accept a valid invitation and create or select the investor profile. |
Backend evidence:
../fund-manager-api/app/routes.py../fund-manager-api/app/views/fund_manager_admin/investors.py../fund-manager-api/app/views/fund_manager_admin/common.py../fund-manager-api/app/views/fund_manager_admin/investor_onboarding.py../i-user-api/app/routes.py../i-user-api/app/views/invitations.py../i-user-api/app/schemas/invitation.py../i-user-api/app/services/invitations.py../i-migration-service/migrations/19_user_invitation_permissions/01_seed_permission_catalog.sql../i-email-worker/internal/app/user_invitation.go
Revision History
| Version | Date | Change |
|---|---|---|
| 1.0 | 2026-08-24 | Initial source-backed description of the Investors page and full invitation lifecycle. |
| 2.0 | 2026-09-14 | Consolidated Onboarding queue, Investors directory, and Individual Investor Profile into one page. Corrected onboarding order (KYC before wallet provisioning), added the subscription agreement and investment capacity model, added the lifecycle diagram. Technical reference section retained, scoped explicitly to the Investors directory and invitation API. |
| 2.1 | 2026-09-14 | Reworded "Action required" to "Additional information was requested" so it reads consistently with Under Review's "more information requested" — resolves prior ambiguity about whether these were the same state. Sub-step numbering under Onboarding intentionally left as authored (informal, not a VitePress rendering issue) per Jay. |
| 2.2 | 2026-09-14 | Added the org-level onboarding model, which this page previously didn't address: onboarding happens once per organization, not once per fund. New "Applying to an Additional Fund (Same Organization)" section covers what's still required (eligibility check, fund-specific subscription agreement, manager review) versus what's skipped (re-collecting KYC/profile info). Cross-linked from the Investor Lifecycle, the Onboarding queue intro, and the top of the Invite Cycle. |
| 2.3 | 2026-09-14 | Added periodic full-resubmission capability (e.g. annual KYC refresh) as a manager-initiated, not-required action — flagged Planned for V2. |
Technical reference likely incomplete
This page now spans three sections — Onboarding queue, Investors directory, Individual Investor Profile — but the Technical Reference above only ever covered the Investors directory and invitation API. It almost certainly does not capture everything relevant to the Onboarding queue or Individual Investor Profile (routes, permissions, contracts specific to those screens). Treat this appendix as partial, not comprehensive, until Vlad's team fills in the missing pieces for the other two sections.