Coach Graici — Inputs/Outputs Build Tracker
Catalina Health · Coach Graici · Build Tracker

Inputs / Outputs Build Map

Per-phase sequence diagrams and an editable tracker for every API call, webhook, and integration touchpoint in the member–Graici journey. Status, owner, and sprint persist locally in this browser — share by exporting state via the toolbar.

Lanes: Member · Portal · Graici · Super Admin · Catalina Team · Sage Bio · External Status: Not Started In Progress Blocked Done

OVArchitecture Overview

The Health Hub Portal kicks off the member journey by pushing demographic data into Graici. Graici owns the member-facing experience end-to-end. The Graici Super Admin generates the PDF requisition; the Catalina Team is the human in the loop who creates the Sage Bio account and uploads the requisition. Sage Bio pushes three distinct webhooks back to Graici: member account created, requisition uploaded, results uploaded. Graici fans those out as member notifications and as status-only updates to the Portal.
flowchart LR
  classDef external fill:#F5F0E8,stroke:#D9D2C5,color:#2A2A2A
  classDef catalina fill:#0A6B7A,stroke:#0A6B7A,color:#FFFFFF
  classDef graici fill:#E2725B,stroke:#E2725B,color:#FFFFFF
  classDef member fill:#FFFFFF,stroke:#0A6B7A,color:#0A6B7A,stroke-width:2px
  classDef human fill:#FFF8E6,stroke:#D69E2E,color:#2A2A2A

  M([Member]):::member
  P[Health Hub Portal]:::catalina
  G[Coach Graici]:::graici
  SA[Graici Super Admin]:::graici
  CT[Catalina Team — humans]:::human
  S[Sage Bio]:::external
  LC[LabCorp / Mobile Phlebotomist]:::external
  ST[Stripe]:::external

  P -- demographic push --> G
  G -- profile complete · status updates --> P
  M <-- conversational UX, notifications, scheduling --> G
  G -- PDF req generation --> SA
  SA -- delivers req --> CT
  CT -- creates account, uploads req --> S
  S -- account.created · req.uploaded · results.uploaded --> G
  G -- book draw appt --> LC
  G <-- payment intents · webhooks --> ST
    
Architectural rules: Graici is read-only against Sage Bio in V1. Graici does NOT create Sage accounts or POST requisitions — the Catalina Team does that out-of-band. The Portal receives status-only updates from Graici (never PHI). The member never logs into Portal or Sage Bio.

P1Portal handoff — demographic push

Member journey starts at the Health Hub Portal. The owner activates a member; the Portal pushes the member's demographic data to Graici, which stages the member record and prepares onboarding.
sequenceDiagram
  autonumber
  participant P as Portal
  participant G as Graici
  participant M as Member
  P->>G: POST /v1/members/intake (demographics, affiliate_id, optional pre_assigned_tier)
  G-->>P: 200 OK (catalina_member_id, invite_token)
  G->>P: webhook member.staged
  G->>M: SMS + email invite link
    
# Direction Endpoint / Event Inputs Outputs Status Owner Sprint

P2Member onboarding & profile setup

Member clicks the invite, creates an account with 2FA, completes the Health OS profile (goals, training history, current routine), and signs disclosures. Graici prompts the member to generate a baseline Health Summary at this point to protect personalized data going forward.
sequenceDiagram
  autonumber
  participant M as Member
  participant G as Graici
  M->>G: GET /v1/invites/{token}
  G-->>M: prefill context + affiliate name
  M->>G: POST /v1/auth/register (password, phone)
  M->>G: POST /v1/auth/2fa/verify (code)
  M->>G: PATCH /v1/members/{id}/profile (goals, training, conditions)
  M->>G: POST /v1/members/{id}/disclosures (HIPAA, terms, data sharing)
  G->>M: prompt — create baseline Health Summary
  M->>G: POST /v1/members/{id}/health-summary/baseline (consents)
    
# Direction Endpoint / Event Inputs Outputs Status Owner Sprint

P3Path selection — tier OR lab + review bundle

Graici presents the member two purchase paths: a recurring health tier (configured by the owner in the Portal) OR a standalone lab + review bundle. Member chooses; payment runs through Stripe.
sequenceDiagram
  autonumber
  participant M as Member
  participant G as Graici
  participant ST as Stripe
  G->>M: present tier options + lab+review bundle
  M->>G: GET /v1/members/{id}/options-available
  G-->>M: tier list + bundle descriptor
  M->>G: POST /v1/members/{id}/checkout (tier_id OR bundle_id)
  G->>ST: create payment intent
  ST-->>G: client_secret
  M->>ST: confirm payment (member-side)
  ST->>G: webhook payment_intent.succeeded
  G->>G: activate tier or bundle on member record
    
#DirectionEndpoint / Event InputsOutputs StatusOwnerSprint

P4Profile complete — sync back to Portal

Once the member's profile is set up and a path is selected, Graici pushes the status back to the Portal. The Portal sees the member move from Invited → Activated, and (if a tier or bundle was purchased) records the kickback ledger entry. Status-only — no PHI flows to the Portal.
sequenceDiagram
  autonumber
  participant G as Graici
  participant P as Portal
  G->>P: webhook member.profile-complete (status='activated')
  G->>P: webhook member.tier-purchased OR member.bundle-purchased (sale_amount, kickback_amount)
  P-->>G: 200 ack
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P5Member initiates lab requisition

Member decides they're ready for the lab in their tier or bundle and tells Graici. Graici emits a requisition request to the Graici-side Super Admin, which is the first step in producing the PDF requisition.
sequenceDiagram
  autonumber
  participant M as Member
  participant G as Graici
  participant SA as Super Admin
  M->>G: POST /v1/members/{id}/labs/request
  G-->>M: confirmation — req is being prepared
  G->>SA: POST /v1/super-admin/requisition-requests (member info, panel codes, source)
  SA-->>G: 202 accepted, task_id
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P6Super Admin — PDF requisition → Catalina Team

The Graici Super Admin fills out the requisition PDF template with the member's data and delivers it to the Catalina Team for upload into Sage Bio. This is a Graici-internal subsystem; the delivery to Catalina Team can be via secure email, an admin work queue, or a Slack alert — pick one before V1.
sequenceDiagram
  autonumber
  participant SA as Super Admin
  participant CT as Catalina Team
  SA->>SA: generate requisition PDF (template + member data)
  SA->>CT: deliver PDF (email, work queue, or Slack notification)
  CT-->>SA: pickup confirmation (manual)
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P7Catalina Team — create Sage account & upload requisition

Out-of-band human step. The Catalina Team takes the PDF requisition from the Super Admin and (a) creates a Sage Bio visualizer account for the member using their email, and (b) uploads the requisition into Sage Bio. Both are manual operations performed in the Sage Bio admin tool.
sequenceDiagram
  autonumber
  participant CT as Catalina Team
  participant S as Sage Bio
  CT->>S: out-of-band — create visualizer account (member email)
  S-->>CT: account created (sage_member_id)
  CT->>S: out-of-band — upload requisition PDF
  S-->>CT: requisition stored (sage_requisition_id)
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P8Sage Bio — member account created webhook

First inbound webhook from Sage Bio. Tells Graici that the member now exists in Sage's visualizer. Graici uses the member email in the webhook payload to bind sage_member_id to the catalina_member_id it already has.
sequenceDiagram
  autonumber
  participant S as Sage Bio
  participant G as Graici
  participant P as Portal
  S->>G: POST /v1/webhooks/sage (member_account.created)
  G->>G: identity bind — sage_member_id ↔ catalina_member_id via member_email
  G->>P: webhook member.status-update (status='sage_account_active')
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P9Sage Bio — requisition uploaded webhook → notify member, prompt scheduling

Second inbound webhook. When the requisition is loaded into the Sage Bio visualizer, Sage pushes the event to Graici. Graici notifies the member that their req is ready and prompts scheduling — at a LabCorp location or via a mobile phlebotomist. Status-only update to Portal.
sequenceDiagram
  autonumber
  participant S as Sage Bio
  participant G as Graici
  participant M as Member
  participant P as Portal
  S->>G: POST /v1/webhooks/sage (requisition.uploaded)
  G->>G: cache requisition state
  G->>M: notification — "Your req is ready, schedule your draw"
  G->>P: webhook member.status-update (status='req_uploaded')
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P10Member schedules phlebotomy — LabCorp or mobile

Member picks a path: walk into a LabCorp draw site or have a mobile phlebotomist come to them. Graici books the appointment through the chosen provider's API (or out-of-band booking + manual confirmation in V1).
sequenceDiagram
  autonumber
  participant M as Member
  participant G as Graici
  participant LC as LabCorp/Mobile
  participant P as Portal
  M->>G: POST /v1/members/{id}/phlebotomy/schedule (method, location, time)
  G->>LC: book appointment (API or manual fallback)
  LC-->>G: confirmation
  G->>M: appointment confirmed + reminders scheduled
  G->>P: webhook member.status-update (status='draw_scheduled')
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P11Sample collection

Member draws their sample. LabCorp or mobile provider reports collection completion; Graici updates state and lets the member know results are typically 3–5 days out.
sequenceDiagram
  autonumber
  participant LC as LabCorp/Mobile
  participant G as Graici
  participant M as Member
  participant P as Portal
  LC->>G: webhook draw.completed (sage_requisition_id, collected_at)
  G->>M: notification — "Sample collected, results in 3–5 days"
  G->>P: webhook member.status-update (status='sample_collected')
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P12Sage Bio — results uploaded webhook

Third inbound webhook. When results are loaded into the Sage Bio visualizer, Sage pushes the event. Graici pre-warms its cache (lab values, Health Index), notifies the member, and pushes a status-only update to the Portal.
sequenceDiagram
  autonumber
  participant S as Sage Bio
  participant G as Graici
  participant M as Member
  participant P as Portal
  S->>G: POST /v1/webhooks/sage (results.uploaded)
  G->>S: GET /v1/sage/members/{id}/labs (pre-warm cache)
  G->>S: GET /v1/sage/members/{id}/health-index (pre-warm cache)
  G->>M: notification — "Your results are ready"
  G->>P: webhook member.status-update (status='results_ready')
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P13Member views results + Noctor AI Q&A

Member opens Graici, sees their results and Health Index. Can ask follow-up questions about their data; questions route to Sage's Noctor AI with member-data context and render back with required clinical disclaimers preserved verbatim.
sequenceDiagram
  autonumber
  participant M as Member
  participant G as Graici
  participant S as Sage Bio
  M->>G: GET /v1/members/{id}/labs
  G-->>M: lab values (cached, Sage fallback on miss)
  M->>G: GET /v1/members/{id}/health-index
  M->>G: POST /v1/members/{id}/questions (question text)
  G->>S: POST /v1/sage/noctor/query (sage_member_id, question, context)
  S-->>G: answer + citations + required disclaimers
  G-->>M: rendered answer with disclaimers verbatim
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P14Physician review scheduling

For tier and lab+review bundle members, Graici offers physician review scheduling. Slots come from Sage Bio. Member books through Graici; Graici books the review with Sage; reminders are dispatched on the scheduled cadence.
sequenceDiagram
  autonumber
  participant M as Member
  participant G as Graici
  participant S as Sage Bio
  participant P as Portal
  G->>S: GET /v1/sage/reviews/slots
  S-->>G: available slots
  G->>M: present slots
  M->>G: POST /v1/members/{id}/reviews (slot_id, questions)
  G->>S: POST /v1/sage/reviews (slot_id)
  S-->>G: sage_review_id
  G->>M: confirmation + reminders
  G->>P: webhook member.status-update (status='review_scheduled')
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P15Member Health Summary generation

After the physician review, Graici composes the Member Health Summary: lab values + Health Index + trend context, rendered against the Catalina template, attributed to the supervising clinician. Stored against the member; available always-on in Graici.
sequenceDiagram
  autonumber
  participant G as Graici
  participant S as Sage Bio
  participant M as Member
  G->>G: POST /v1/members/{id}/health-summary (review_id)
  G->>S: GET /v1/sage/members/{id}/labs
  G->>S: GET /v1/sage/members/{id}/health-index/history
  G->>G: render Member Health Summary (PDF + structured)
  G->>M: notification — "Your Health Summary is ready"
  M->>G: GET /v1/members/{id}/health-summary/{summary_id}
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint

P16Renewal, retest, and offboarding

Graici nudges renewal as the tier or bundle approaches expiry, manages retest reminders, and handles member data control (preferences, Sage data-sharing revoke, account deletion). Status-only updates flow to Portal throughout.
sequenceDiagram
  autonumber
  participant G as Graici
  participant M as Member
  participant ST as Stripe
  participant S as Sage Bio
  participant P as Portal
  G->>M: renewal nudge ladder (30d, 14d, 7d, 1d)
  M->>G: POST /v1/members/{id}/checkout (renewal)
  ST->>G: webhook payment_intent.succeeded
  G->>P: webhook member.tier-renewed
  M->>G: PATCH /v1/members/{id}/preferences (channels, quiet hours)
  M->>G: DELETE /v1/members/{id}/consents/sage (revoke)
  G->>S: DELETE /v1/sage/members/{id}/access
  M->>G: DELETE /v1/members/{id} (account delete)
  G->>P: webhook member.offboarded
    
#DirectionEndpoint / EventInputsOutputsStatusOwnerSprint
Catalina Health · Coach Graici · Build Tracker v1.0 · 11 May 2026 · Status is saved locally in your browser — use Export to share.