member_id, affiliate_id, affiliate_name, tier, services_available[] (from affiliate config profile). This context drives which modules and offerings are surfaced during onboarding.
experience_level, training_days_per_week → stored in member profile, used to personalize Graici recommendations and tier upsell logic.
Lab panels can reach a member two ways: bundled in their health tier (entitlement already on file) or ordered à la carte. Graici handles both paths with the same requisition preparation and internal notification flow. The key gate in both cases is: does this member have panels available, and are they ready to create a requisition?
member.lab_panels_remaining and member.panels_available[] from the portal record.POST /internal/lab-requisitions → event: requisition_readyPayload:
{ member_id, affiliate_id, panel_type, draw_method, payment_source, requisition_data{} }Internal team receives in ops dashboard. On confirmation, requisition status updates to
Ordered on both portal journey board and Graici member view. Member receives draw instructions via Graici notification.
Lab results are delivered into the Sage Bio Visualizer — the clinical dashboard that powers the biomarker display and trend visualization layer. Before results can flow into Graici, the member must complete a one-time Visualizer portal access setup that establishes the API connection between Graici and Sage Bio.
member.visualizer_connected. If false, setup is prompted before the requisition is finalized.member.visualizer_connected = true, the API token is stored securely and the requisition preparation continues. All future results flow automatically without re-authorization.POST /webhooks/graici → event: results_ready with { member_id, panel_type, result_url, flagged_markers[] }. Results rendered in Graici via the CFMS Visualizer component.
member.reviews_remaining > 0). The prompt branches accordingly.Graici monitors the member's continuously updated health picture — biomarkers, training attendance, nutrition, care completion status, and wearable trends (future phase) — and surfaces prompts only when a specific threshold or pattern triggers action. These are the production examples from the Master Script.
member.tier before surfacing. Recovery service prompts check affiliate.services_available[]. Wearable-triggered prompts (HRV, sleep, recovery score) are future phase — in current build, training-load prompts source from gym software attendance API only.
Tiers can originate two ways. Affiliate-assigned: the affiliate owner sets a tier in the portal before or after sending the Graici invite — this is the expected default. Member opt-in via Graici: if no tier is pre-assigned, the member browses available tiers and selects one during onboarding or from the My Plan screen at any time. Both paths produce the same result — the affiliate is notified in the portal and the tier is confirmed before services activate. Pricing and tier availability are always affiliate-configured.
| Tier | Lab Panels | Physician Reviews | Performance Dx | Recovery | CommunityCare |
|---|---|---|---|---|---|
| Tier 1Graici Health Graici OS + diagnostics eligibility |
2 / year | 2 / year | — | — | — |
| Tier 2Health Navigator Full diagnostics + performance testing |
4 / year | 4 / year | ✓ VO2, RMR, InBody | — | — |
| Tier 3Recovery T2 + unlimited facility recovery |
Affiliate-defined | Affiliate-defined | ✓ Full suite | ✓ Sauna, cold plunge, red light, compression | — |
| Tier 4Integrated Healthcare Complete system + CommunityCare |
Affiliate-defined | Affiliate-defined + Specialty | ✓ Full suite | ✓ Full access | ✓ Enrolled · Health Score cost linkage |
member.tier in portal. Tier travels with the Graici invite link and is active on first login. No member action required.Path B — Member opts in via Graici: No tier pre-assigned. During onboarding (or from My Plan screen), member browses available tiers and selects one.
→ Graici fires webhook:
POST /webhooks/affiliate-portal → event: tier_opt_in with payload { member_id, affiliate_id, requested_tier, bundled_services[], timestamp }→ Affiliate portal receives webhook, creates pending tier request, notifies owner.
→ Affiliate confirms in portal →
member.tier updates → Graici receives confirmation callback.→ Graici notifies member: "Your tier is confirmed. Here's what's now available to you." Bundled services (labs, reviews, recovery access) are surfaced immediately in the member's Graici dashboard.
Bundled services note: When a tier includes bundled services (e.g., 2 lab panels, 2 reviews), those are instantiated as entitlements on the member record at confirmation —
member.lab_panels_remaining, member.reviews_remaining. Graici reads these entitlements to determine what the member can act on without additional payment.
The marketplace surfaces purchasable products and services directly in Graici. Items are contextually recommended — Graici shows the right product at the right moment based on the member's data and journey stage. All purchases are attributed back to the originating affiliate.
GET /products?affiliate_id={id}&member_tier={tier}. Affiliate-specific pricing and availability is applied server-side. Contextual placement logic: Graici checks member.flagged_markers[] and journey_stage to determine which products to surface and when. All purchases create an order record attributed to affiliate_id for revenue tracking.
Members need a payment method on file for: à la carte panel purchases, add-on reviews outside their tier, and future subscription services (supplements in V3/V4). Card is collected and stored securely at first purchase or during onboarding if prompted.
member.stripe_customer_id stored in profile. Member can update or remove card at any time from profile settings.member.subscriptions[] with status, next billing date, and product reference.PaymentIntent for one-time purchases · SetupIntent for card-on-file without immediate charge · Subscription object for recurring services (V3/V4) · Customer object per member with stripe_customer_id stored in Graici member record. All revenue attributed to affiliate via order metadata. Refunds and disputes handled through Catalina ops team.