Moonlitic
Product Backlog — User Stories
Internal Only — Not for Investor Distribution

Payouts & Disbursement Engine

User stories for the payouts & disbursement engine domain. These stories are sprint-ready and include acceptance criteria in Given/When/Then format.

3
Epics
11
User Stories
48
Story Points
03

Payouts & Disbursement Engine

3 Epics · 10 User Stories · 38 SP
Epic: Patient receives 80% share via ACH within 5 business days
F03-001 Patient links bank account for ACH payout
As a patient, I want to securely link my bank account via Plaid or manual ACH entry so that my earnings are deposited directly into my bank account.
Acceptance Criteria
Given I am on the Earnings tab and have no bank linked, When I click "Link Bank Account," Then a Plaid modal opens allowing me to search and connect my bank, and upon success, a masked account number (****1234) is displayed.
Given I have linked a bank account, When a payout is triggered, Then the ACH transfer initiates and I see a "Processing" status that updates to "Deposited" within 5 business days.
F03-002 View pending and completed payouts
As a patient, I want to see a list of all my pending and completed payouts with amounts and dates so that I know exactly when money is coming and can reconcile with my bank.
Acceptance Criteria
Given I have 3 pending payouts, When I open the Earnings tab, Then I see each payout with: amount (my 80% net), source (marketplace query or trial), status (pending/processing/deposited), and expected deposit date.
Given a payout completes, When the ACH settles, Then the status updates to "Deposited" with the actual settlement date.
F03-003 Payout minimum threshold
As a patient, I want payouts to only trigger when my balance exceeds a minimum threshold (e.g., $10) so that I don't receive micro-deposits that clutter my bank statement.
Acceptance Criteria
Given my accrued balance is $7.20, When the weekly payout cycle runs, Then no payout is initiated and my balance carries forward with a note "Below $10 minimum — will roll to next cycle."
Given my balance reaches $14.80, When the next payout cycle runs, Then a $14.80 ACH deposit is initiated.
Epic: Automated 80/20 split, 1099-NEC, and payout orchestration
F03-004 Automatic 80/20 split at attribution time
As a platform operator, I want every attribution event to automatically calculate and record the 80% patient share and 20% Moonlitic fee at write time so that the split is immutable and auditable from the moment revenue is earned.
Acceptance Criteria
Given a Cohort query is billed at $350 gross, When the attribution event is written, Then the record shows patientNet=$280, moonliticFee=$70, and the split ratio is stored as metadata.
Given an Aggregate query is billed at $0, When the attribution event is written, Then no payout record is created (zero-value queries don't generate earnings).
F03-005 Annual 1099-NEC generation
As a platform operator, I want 1099-NEC tax forms auto-generated for any patient earning $600+ annually so that Moonlitic meets IRS reporting requirements and patients can file taxes accurately.
Acceptance Criteria
Given a patient's annual earnings reach $600, When January 31 of the following year arrives, Then a 1099-NEC is generated with their legal name, TIN, and total non-employee compensation, and filed electronically with the IRS.
Given a patient earned $450 for the year, When the 1099 generation runs, Then no 1099 is generated (below $600 threshold) but the income is still reported to the patient in their Earnings tab.
F03-006 Payout batch orchestration
As a platform operator, I want payouts batched weekly and processed through Velo Payments in a single batch so that disbursements scale efficiently and transaction fees are minimized.
Acceptance Criteria
Given 500 patients have pending balances above the minimum, When the weekly batch runs, Then all 500 ACH transfers are submitted in a single Velo Payments batch and a batch receipt is logged with total amount, count, and status.
Given 3 transfers in the batch fail (invalid account), When the batch completes, Then the 3 failures are flagged for retry, the patient is notified to update banking info, and the remaining 497 succeed.
Epic: Full audit trail from source transaction to payout
F03-007 End-to-end payout provenance trail
As a finance team member, I want every payout linked back to its source transaction (marketplace query ID or trial event ID) with a full chain of custody so that I can trace any dollar from buyer payment to patient deposit.
Acceptance Criteria
Given I click on a payout record, When the detail view opens, Then I see: source query ID, buyer name, gross amount, 80/20 split breakdown, Velo transfer ID, ACH settlement date, and patient bank (masked).
Given a payout consolidates earnings from 5 queries, When I expand the detail, Then each of the 5 source transactions is listed with individual amounts that sum to the total payout.
F03-008 Monthly earnings breakdown by source
As a patient, I want a monthly breakdown showing how much I earned from marketplace data, clinical trials, and licensing so that I understand where my income comes from.
Acceptance Criteria
Given I earned $120 from marketplace and $500 from a clinical trial in March, When I view the March earnings, Then I see two rows: "Data Marketplace: $120" and "Clinical Trial (Acme Pharma): $500" with a total of $620.
F03-009 Payout dispute and inquiry flow
As a patient, I want to flag a payout as incorrect and submit an inquiry so that discrepancies are investigated and resolved.
Acceptance Criteria
Given I see a payout that looks incorrect, When I click "Report Issue," Then a form opens where I describe the problem, and a support ticket is created with the payout details pre-attached.
Given I have submitted a dispute, When it is being reviewed, Then the payout shows "Under Review" status and I receive email updates as the investigation progresses.
F03-010 Failed payout retry and patient notification
As a finance team member, I want failed ACH transfers to auto-retry up to 3 times and notify the patient if unresolved so that payouts are recovered without manual intervention.
Acceptance Criteria
Given a payout fails due to "Insufficient funds" at the receiving bank, When the failure is detected, Then the system retries on the next business day (up to 3 attempts) and logs each attempt.
Given 3 retries have all failed, When the final retry fails, Then the patient receives an email saying "Your payout could not be completed — please update your bank details" and the amount is held in escrow.