{"id":"bumpgrade-affiliate-referrals-source-data","updatedAt":"2026-05-21","status":"owner-partner-notification-provider-readiness-records-ready","issue":281,"parentIssue":19,"generatedFrom":"src/lib/affiliate-referrals.ts","routes":["/affiliates/source-data","/api/affiliates/clicks","/api/commerce/checkout","/api/affiliates/commission-ledger","/api/admin/affiliates/commission-ledger/actions","/api/admin/affiliates/payout-preparation-records","/api/admin/affiliates/fraud-review-records","/api/admin/affiliates/notification-readiness-records","/api/admin/affiliates/notification-send-preflights","/api/admin/affiliates/notification-provider-readiness","/admin/affiliates","/affiliates/indie-launch-partners"],"stableIds":["affiliateProgramId","affiliatePartnerId","referralLinkId","affiliatePartnerReportId","payoutPreparationId","referralClickId","checkoutIntentId","attributionRuleId","commissionRuleId","commissionLedgerId","reviewOnlyCommissionLedgerId","commissionReviewActionId","payoutBatchId","payoutPreparationRecordId","payoutPreparationRecordStatus","fraudReviewRecordId","fraudReviewRecordStatus","partnerNotificationReadinessRecordId","partnerNotificationReadinessRecordStatus","partnerNotificationSendPreflightRecordId","partnerNotificationSendPreflightRecordStatus","partnerNotificationProviderReadinessRecordId","partnerNotificationProviderReadinessRecordStatus","reviewFlagId","auditEventId","agentActionId"],"clickWrites":{"id":"affiliate-referral-click-capture-contract","status":"click-capture-ready","issue":109,"parentIssue":19,"apiRoute":"/api/affiliates/clicks","tables":["affiliate_referral_clicks"],"publicSafeFields":["referralClickId","referralLinkId","referralCode","partnerId","destinationRoute","duplicate","status"],"serverPrivateFields":["visitor_key_hash","ip_hash","user_agent_hash","referrer_hash","request_hash","metadata_json","raw cookies","raw contact identifiers","raw buyer identifiers","raw Stripe identifiers","payout or tax data"],"writeBoundary":"Issue #109 can capture seeded referral clicks with idempotency, destination-route validation, hashed request evidence, and public-safe responses. Cookie assignment, buyer attribution, purchase-to-commission matching, fraud enforcement, payout mutation, tax handling, and direct agent affiliate writes require future confirmed-write APIs."},"checkoutAttribution":{"id":"checkout-referral-attribution-contract","status":"checkout-attribution-evidence-ready","issue":111,"parentIssue":19,"relatedIssues":[15,109],"checkoutApiRoute":"/api/commerce/checkout","sourceDataRoutes":["/commerce/source-data","/affiliates/source-data"],"tables":["checkout_referral_attributions"],"publicSafeFields":["checkoutIntentId","referralClickId","referralLinkId","referralCode","partnerId","destinationRoute","attributionStatus"],"serverPrivateFields":["audit_correlation_id","metadata_json","raw click rows","raw cookies","buyer identifiers","raw Stripe identifiers","payout or tax data"],"writeBoundary":"Issue #111 can attach a validated seeded referral click to a sandbox checkout intent as public-safe attribution evidence. Cookie assignment, buyer attribution finalization, commission writes, fraud enforcement, payout mutation, tax handling, partner notification, and direct agent affiliate writes require future confirmed-write APIs."},"commissionLedgerWrites":{"id":"affiliate-commission-ledger-contract","status":"owner-review-actions-ready","issue":115,"parentIssue":19,"relatedIssues":[15,101,109,111,113],"apiRoute":"/api/affiliates/commission-ledger","confirmationText":"Create review-only commission evidence for Bumpgrade sandbox checkout","sourceDataRoutes":["/affiliates/source-data","/commerce/source-data"],"tables":["affiliate_commission_ledger_entries","affiliate_commission_ledger_actions"],"publicSafeFields":["commissionLedgerId","checkoutIntentId","referralAttributionId","referralClickId","referralLinkId","partnerId","grossSaleCents","commissionCents","ledgerStatus","reviewStatus","payoutStatus","reviewActionCounts"],"serverPrivateFields":["idempotency_key","audit_correlation_id","metadata_json","actor_user_id","actor_email","private action reason","buyer identifiers","raw Stripe identifiers","partner payout accounts","tax forms","private review notes"],"writeBoundary":"Issue #113 can create one review-only, non-payable commission ledger evidence row from a confirmed sandbox checkout intent that already has referral attribution. Issue #115 lets an owner-gated admin session apply idempotent review, hold, or reversal actions with exact confirmation and stale-state checks. Payable commission state, payout mutation, tax collection, fraud enforcement, partner notification, partner payout accounts, buyer attribution finalization, and direct agent affiliate writes require future confirmed-write APIs."},"commissionReviewActions":{"contract":{"id":"affiliate-commission-review-actions-contract","status":"owner-review-actions-ready","issue":115,"parentIssue":19,"relatedIssues":[15,111,113],"apiRoute":"/api/admin/affiliates/commission-ledger/actions","auth":"Better Auth owner session required","confirmationText":"Apply owner review action to Bumpgrade commission ledger evidence","allowedActions":[{"actionKind":"mark_reviewed","nextLedgerStatus":"review_only","nextReviewStatus":"owner_reviewed","nextPayoutStatus":"not_payable"},{"actionKind":"hold_for_review","nextLedgerStatus":"review_only","nextReviewStatus":"owner_hold","nextPayoutStatus":"not_payable"},{"actionKind":"reverse_evidence","nextLedgerStatus":"reversed","nextReviewStatus":"owner_reversed","nextPayoutStatus":"not_payable"}],"writeSafety":["owner session","exact confirmation text","idempotency key","expectedUpdatedAt stale-state check","audit correlation","public-safe redaction"],"writeBoundary":"Owner review actions may update only review-only commission ledger evidence status. They cannot create payable commission state, payout batches, Stripe payouts, tax records, partner notifications, fraud decisions, buyer attribution finalization, or direct agent writes."}},"partnerReportContract":{"id":"affiliate-partner-report-contract","status":"partner-reports-ready","issue":193,"parentIssue":19,"relatedIssues":[89,109,111,113,115],"sourceDataRoute":"/affiliates/source-data","previewRoute":"/affiliates/indie-launch-partners","stableIds":["affiliatePartnerReportId","affiliatePartnerId","referralLinkId","referralClickId","checkoutIntentId","reviewOnlyCommissionLedgerId","commissionReviewActionId"],"publicSafeFields":["affiliatePartnerReportId","affiliatePartnerId","referralLinkIds","totalClicks","attributedCheckouts","reviewOnlyLedgers","reviewedActions","heldActions","reversedActions","totalCommissionCents","payoutReadinessStatus","redactionFlags"],"serverPrivateFields":["buyer emails","buyer hashes","raw click rows","raw checkout rows","raw owner actor identity","private review reasons","Stripe customer/session identifiers","partner payout accounts","tax forms"],"writeBoundary":"Issue #193 exposes public-safe partner report definitions and aggregate report rows. Reports are read-only and cannot finalize buyer attribution, create payable commission state, trigger payouts, notify partners, store payout accounts, collect tax data, enforce fraud decisions, or accept direct agent writes."},"payoutPreparationContract":{"id":"affiliate-payout-preparation-contract","status":"payout-preparation-ready","issue":195,"parentIssue":19,"relatedIssues":[89,109,111,113,115,193],"sourceDataRoute":"/affiliates/source-data","previewRoute":"/affiliates/indie-launch-partners","stableIds":["payoutPreparationId","payoutBatchId","affiliatePartnerReportId","affiliatePartnerId","referralLinkId","reviewOnlyCommissionLedgerId","commissionReviewActionId"],"publicSafeFields":["payoutPreparationId","payoutBatchId","partnerReportIds","eligibleLedgerIds","blockedLedgerIds","reversedLedgerIds","readinessChecklist","aggregateLedgerCounts","aggregateReviewActionCounts","totalCommissionCents","redactionFlags"],"serverPrivateFields":["buyer emails","buyer hashes","raw ledger rows","raw owner actor identity","private review reasons","Stripe payout and transfer identifiers","partner payout accounts","tax forms","partner notification payloads"],"writeBoundary":"Issue #195 exposes read-only payout preparation rows and readiness checklists. Preparation rows cannot create payable commission state, store payout accounts, collect tax forms, trigger Stripe payouts or transfers, notify partners, override fraud/review decisions, or accept direct agent writes."},"payoutPreparationRecordWrites":{"id":"affiliate-payout-preparation-record-contract","status":"owner-affiliate-payout-preparation-records-ready","issue":273,"parentIssue":19,"apiRoute":"/api/admin/affiliates/payout-preparation-records","auth":"owner-session","tables":["affiliate_payout_preparation_records"],"confirmationText":"Record Bumpgrade affiliate payout preparation evidence","publicSafeFields":["payoutPreparationRecordId","affiliateProgramId","payoutPreparationId","payoutBatchId","expectedPayoutBatchStatus","expectedLedgerCounts","expectedTotalCommissionCents","ownerPayoutPreparationRecordCreated"],"serverPrivateFields":["actor_user_id","actor_email_hash","private_note_sha256","confirmation_text_sha256","payout account","tax data","Stripe payout IDs","partner notification payloads","buyer data","raw ledger rows","private fraud signals","metadata_json"],"writeBoundary":"Issue #273 records owner-confirmed affiliate payout preparation evidence after exact confirmation, idempotency, program revision checks, payout batch status checks, and payout-preparation evidence checks. It creates owner-visible preparation evidence only; it does not create payable commission state, Stripe payouts or transfers, payout accounts, tax records, partner notifications, fraud decisions, buyer data, raw ledger rows, or direct agent payout writes."},"fraudReviewRecordWrites":{"id":"affiliate-fraud-review-record-contract","status":"owner-affiliate-fraud-review-records-ready","issue":275,"parentIssue":19,"apiRoute":"/api/admin/affiliates/fraud-review-records","auth":"owner-session","tables":["affiliate_fraud_review_records"],"confirmationText":"Record Bumpgrade affiliate fraud review evidence","publicSafeFields":["fraudReviewRecordId","affiliateProgramId","reviewFlagId","payoutPreparationId","payoutBatchId","reviewDisposition","expectedPayoutBatchStatus","expectedFlagSeverity","expectedLinkedLedgerCount","ownerFraudReviewRecordCreated"],"serverPrivateFields":["actor_user_id","actor_email_hash","private_note_sha256","confirmation_text_sha256","private fraud signals","buyer data","raw ledger rows","raw click rows","raw checkout rows","payout account","tax data","Stripe payout IDs","partner notification payloads","metadata_json"],"writeBoundary":"Issue #275 records owner-reviewed affiliate fraud review evidence after exact confirmation, idempotency, program revision checks, payout batch status checks, review-flag checks, and public-safe redaction. It creates owner-visible fraud review evidence only; it does not enforce fraud decisions, create payable commission state, create Stripe payouts or transfers, store payout accounts, collect tax data, notify partners, expose buyer data, expose raw ledger/click/checkout rows, expose private fraud signals, or accept direct public agent affiliate writes."},"partnerNotificationReadinessRecordWrites":{"id":"affiliate-partner-notification-readiness-record-contract","status":"owner-affiliate-partner-notification-readiness-records-ready","issue":277,"parentIssue":19,"apiRoute":"/api/admin/affiliates/notification-readiness-records","auth":"owner-session","tables":["affiliate_partner_notification_readiness_records"],"confirmationText":"Record Bumpgrade affiliate partner notification readiness evidence","publicSafeFields":["partnerNotificationReadinessRecordId","affiliateProgramId","affiliatePartnerReportId","affiliatePartnerId","payoutPreparationId","payoutBatchId","reviewFlagId","notificationReadinessDisposition","expectedPartnerReportStatus","expectedPayoutBatchStatus","expectedPayoutPreparationRecordStatus","expectedFraudReviewRecordStatus","expectedReviewFlagSeverity","expectedLinkedLedgerCount","ownerPartnerNotificationReadinessRecordCreated"],"serverPrivateFields":["actor_user_id","actor_email_hash","private_note_sha256","confirmation_text_sha256","recipient email","notification body","provider message ID","send queue rows","private fraud signals","buyer data","raw ledger rows","raw click rows","raw checkout rows","payout account","tax data","Stripe payout IDs","metadata_json"],"writeBoundary":"Issue #277 records owner-reviewed affiliate partner notification readiness evidence after exact confirmation, idempotency, program revision checks, partner report checks, payout batch status checks, payout preparation record status checks, fraud review record status checks, review-flag checks, and public-safe redaction. It creates owner-visible notification readiness evidence only; it does not send partner notifications, call providers, create queue rows, expose recipient emails, expose message bodies, expose provider message IDs, enforce fraud decisions, create payable commission state, create Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, expose private fraud signals, or accept direct public agent affiliate writes."},"partnerNotificationSendPreflightRecordWrites":{"id":"affiliate-partner-notification-send-preflight-record-contract","status":"owner-affiliate-partner-notification-send-preflights-ready","issue":279,"parentIssue":19,"apiRoute":"/api/admin/affiliates/notification-send-preflights","auth":"owner-session","tables":["affiliate_partner_notification_send_preflight_records"],"confirmationText":"Record Bumpgrade affiliate partner notification send preflight evidence","publicSafeFields":["partnerNotificationSendPreflightRecordId","affiliateProgramId","affiliatePartnerReportId","affiliatePartnerId","payoutPreparationId","payoutBatchId","reviewFlagId","notificationSendPreflightDisposition","expectedPartnerReportStatus","expectedPayoutBatchStatus","expectedPayoutPreparationRecordStatus","expectedFraudReviewRecordStatus","expectedNotificationReadinessRecordStatus","expectedReviewFlagSeverity","expectedLinkedLedgerCount","ownerPartnerNotificationSendPreflightRecordCreated","notificationProviderSendEnabled","sendPayloadIncluded"],"serverPrivateFields":["actor_user_id","actor_email_hash","private_note_sha256","confirmation_text_sha256","recipient email","notification body","send payload","provider message ID","send queue rows","private fraud signals","buyer data","raw ledger rows","raw click rows","raw checkout rows","payout account","tax data","Stripe payout IDs","metadata_json"],"writeBoundary":"Issue #279 records owner-reviewed affiliate partner notification send preflight evidence after exact confirmation, idempotency, program revision checks, partner report checks, payout batch status checks, payout preparation record status checks, fraud review record status checks, notification readiness record status checks, review-flag checks, provider-send-disabled checks, and public-safe redaction. It creates owner-visible send preflight evidence only; it does not send partner notifications, enable provider sends, call providers, create send payloads, create queue rows, expose recipient emails, expose message bodies, expose provider message IDs, enforce fraud decisions, create payable commission state, create Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, expose private fraud signals, or accept direct public agent affiliate writes."},"partnerNotificationProviderReadinessRecordWrites":{"id":"affiliate-partner-notification-provider-readiness-record-contract","status":"owner-affiliate-partner-notification-provider-readiness-records-ready","issue":281,"parentIssue":19,"apiRoute":"/api/admin/affiliates/notification-provider-readiness","auth":"owner-session","tables":["affiliate_partner_notification_provider_readiness_records"],"confirmationText":"Record Bumpgrade affiliate partner notification provider readiness evidence","publicSafeFields":["partnerNotificationProviderReadinessRecordId","affiliateProgramId","affiliatePartnerReportId","affiliatePartnerId","payoutPreparationId","payoutBatchId","reviewFlagId","notificationProviderReadinessDisposition","expectedPartnerReportStatus","expectedPayoutBatchStatus","expectedPayoutPreparationRecordStatus","expectedFraudReviewRecordStatus","expectedNotificationReadinessRecordStatus","expectedNotificationSendPreflightRecordStatus","expectedReviewFlagSeverity","expectedLinkedLedgerCount","ownerPartnerNotificationProviderReadinessRecordCreated","notificationProviderConfigured","providerSecretIncluded","senderCredentialIncluded","notificationProviderSendEnabled","sendPayloadIncluded"],"serverPrivateFields":["actor_user_id","actor_email_hash","private_note_sha256","confirmation_text_sha256","notification provider configuration","provider secret","sender credential","recipient email","notification body","send payload","provider message ID","send queue rows","private fraud signals","buyer data","raw ledger rows","raw click rows","raw checkout rows","payout account","tax data","Stripe payout IDs","metadata_json"],"writeBoundary":"Issue #281 records owner-reviewed affiliate partner notification provider readiness evidence after exact confirmation, idempotency, program revision checks, partner report checks, payout batch status checks, payout preparation record status checks, fraud review record status checks, notification readiness record status checks, send preflight record status checks, review-flag checks, provider-configuration-disabled checks, provider-secret-redaction checks, sender-credential-redaction checks, provider-send-disabled checks, and public-safe redaction. It creates owner-visible provider readiness evidence only; it does not configure notification providers, store provider secrets, store sender credentials, send partner notifications, enable provider sends, call providers, create send payloads, create queue rows, expose recipient emails, expose message bodies, expose provider message IDs, enforce fraud decisions, create payable commission state, create Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, expose private fraud signals, or accept direct public agent affiliate writes."},"writeBoundary":"Issue #109 can capture seeded referral clicks with idempotency, destination-route validation, hashed request evidence, and aggregate-only public reporting. Issue #111 can attach validated referral click evidence to sandbox checkout intents. Issue #113 can create review-only, non-payable commission ledger evidence from trusted checkout attribution. Issue #115 can apply owner-gated review, hold, or reversal actions to review-only ledger evidence with exact confirmation, idempotency, actor identity, stale-state checks, and audit correlation. Issue #193 exposes public-safe partner reports from aggregate click, checkout attribution, ledger, and review-action evidence. Issue #195 exposes read-only payout preparation rows and readiness checklists. Issue #273 lets verified owners record payout preparation evidence with exact confirmation, idempotency, revision checks, and public-safe redaction while keeping payout execution disabled. Issue #275 lets verified owners record fraud review evidence with exact confirmation, idempotency, review-flag checks, payout batch status checks, and public-safe redaction while keeping fraud enforcement and payout execution disabled. Issue #277 lets verified owners record partner notification readiness evidence with exact confirmation, idempotency, partner report checks, payout preparation status checks, fraud review status checks, and public-safe redaction while keeping partner sends, provider calls, and queue dispatch disabled. Issue #279 lets verified owners record partner notification send preflight evidence with exact confirmation, idempotency, notification readiness status checks, provider-send-disabled checks, and public-safe redaction while keeping partner sends, provider-send enablement, provider calls, send payloads, and queue dispatch disabled. Issue #281 lets verified owners record notification provider readiness evidence with exact confirmation, idempotency, send preflight status checks, provider-configuration-disabled checks, provider-secret-redaction checks, and public-safe redaction while keeping provider configuration, provider secrets, sender credentials, partner sends, provider calls, send payloads, and queue dispatch disabled. Cookie assignment, buyer attribution finalization, payable commission writes, fraud enforcement, Stripe payout actions, tax collection, payout account storage, partner notification sends, provider-send configuration, provider secret storage, private partner portals, and direct agent review writes require future confirmed-write APIs.","programs":[{"id":"affiliate-program-indie-launch-partners","slug":"indie-launch-partners","title":"Indie launch partner program","status":"draft","issue":195,"parentIssue":19,"sourceDataRoute":"/affiliates/source-data","previewRoute":"/affiliates/indie-launch-partners","linkedFunnelRoute":"/funnels/indie-launch-sandbox","linkedOfferRoute":"/offers/indie-launch-stack","linkedAnalyticsRoute":"/analytics/indie-launch-dashboard","revisionId":"affiliate-program-revision-indie-launch-2026-05-21-notification-provider-readiness","summary":"A partner program example for referral links, checkout attribution, commission review, partner reports, payout preparation, review flags, and careful partner communication.","attributionRules":[{"id":"attribution-rule-first-click-30","model":"first_click","title":"First click, 30-day window","windowDays":30,"priority":1,"appliesTo":["ref-link-launch-circle-waitlist","ref-link-template-partner-sales"],"caveat":"Future live use requires consent-safe click capture, bot filtering, and replay-safe attribution writes."},{"id":"attribution-rule-manual-review","model":"manual_review","title":"Manual review for self-referral or refund edge cases","windowDays":0,"priority":99,"appliesTo":["commission-ledger-refund-reversal","commission-ledger-self-referral-review"],"caveat":"Review flags block payout until an owner confirms the decision and audit note."}],"commissionRules":[{"id":"commission-rule-launch-pass-30","kind":"percentage","title":"Launch pass partner commission","appliesToOfferIds":["offer-primary-sandbox-launch-pass"],"rateBps":3000,"holdDays":14,"currency":"USD","caveat":"Use this as an example partner commission before publishing final affiliate terms."},{"id":"commission-rule-checklist-bump-10","kind":"percentage","title":"Checklist order-bump commission","appliesToOfferIds":["offer-bump-launch-checklist"],"rateBps":1000,"holdDays":14,"currency":"USD","caveat":"Order-bump commission waits for checkout, refund, and tax rules to be finalized."},{"id":"commission-rule-refund-holdback","kind":"holdback","title":"Refund and dispute holdback","appliesToOfferIds":["offer-primary-sandbox-launch-pass","offer-bump-launch-checklist"],"amountCents":0,"holdDays":30,"currency":"USD","caveat":"Holdback rules keep refund and dispute risk visible before payout."}],"partners":[{"id":"affiliate-partner-launch-circle","displayName":"Launch Circle partner","status":"approved","publicProfile":"Newsletter partner with an aligned creator and indie-launch audience.","approvedProgramIds":["affiliate-program-indie-launch-partners"],"referralLinkIds":["ref-link-launch-circle-waitlist"],"privateDataExcluded":["email address","tax form","bank account","payout account","private notes"]},{"id":"affiliate-partner-template-studio","displayName":"Template Studio partner","status":"review","publicProfile":"Template seller awaiting affiliate approval before public links or payout eligibility.","approvedProgramIds":[],"referralLinkIds":["ref-link-template-partner-sales"],"privateDataExcluded":["email address","W-9/W-8 details","payment rail","private fraud notes"]}],"referralLinks":[{"id":"ref-link-launch-circle-waitlist","code":"LAUNCHCIRCLE","status":"draft","partnerId":"affiliate-partner-launch-circle","destinationRoute":"/funnels/indie-launch-sandbox","attributionRuleId":"attribution-rule-first-click-30","linkedOfferIds":["offer-primary-sandbox-launch-pass","offer-bump-launch-checklist"],"utmSource":"affiliate-launch-circle","publicUrlPattern":"https://bumpgrade.com/r/LAUNCHCIRCLE"},{"id":"ref-link-template-partner-sales","code":"TEMPLATESTUDIO","status":"review","partnerId":"affiliate-partner-template-studio","destinationRoute":"/offers/indie-launch-stack","attributionRuleId":"attribution-rule-manual-review","linkedOfferIds":["offer-primary-sandbox-launch-pass"],"utmSource":"affiliate-template-studio","publicUrlPattern":"https://bumpgrade.com/r/TEMPLATESTUDIO"}],"partnerReports":[{"id":"affiliate-partner-report-launch-circle","partnerId":"affiliate-partner-launch-circle","title":"Launch Circle performance report","status":"public_safe_report_ready","issue":193,"reportingWindow":{"id":"affiliate-report-window-public-safe-all-time","label":"All-time aggregate","source":"Seeded fixture plus D1 aggregate summaries from click, checkout attribution, ledger, and review-action tables."},"referralLinkIds":["ref-link-launch-circle-waitlist"],"sourceRoutes":["/affiliates/source-data","/api/affiliates/clicks","/api/commerce/checkout","/api/affiliates/commission-ledger","/api/admin/affiliates/commission-ledger/actions"],"fixtureMetrics":{"fixtureLedgerCount":2,"fixtureReviewRequiredCount":0,"fixtureReversedCount":1,"fixtureCommissionCents":2700,"currency":"USD","runtimeAggregateFields":["totalClicks","attributedCheckouts","reviewOnlyLedgers","reviewedActions","heldActions","reversedActions"]},"payoutReadiness":{"status":"review_required","caveats":["Refund window and reversal evidence must remain reviewable before payout preparation.","Partner payout account, tax form, and private notification data stay private."]},"redaction":{"buyerDataIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false},"caveat":"Report totals help review partner performance before a payable statement is issued."},{"id":"affiliate-partner-report-template-studio","partnerId":"affiliate-partner-template-studio","title":"Template Studio performance report","status":"public_safe_report_ready","issue":193,"reportingWindow":{"id":"affiliate-report-window-public-safe-all-time","label":"All-time aggregate","source":"Seeded fixture plus D1 aggregate summaries from click, checkout attribution, ledger, and review-action tables."},"referralLinkIds":["ref-link-template-partner-sales"],"sourceRoutes":["/affiliates/source-data","/api/affiliates/clicks","/api/commerce/checkout","/api/affiliates/commission-ledger","/api/admin/affiliates/commission-ledger/actions"],"fixtureMetrics":{"fixtureLedgerCount":1,"fixtureReviewRequiredCount":1,"fixtureReversedCount":0,"fixtureCommissionCents":2700,"currency":"USD","runtimeAggregateFields":["totalClicks","attributedCheckouts","reviewOnlyLedgers","reviewedActions","heldActions","reversedActions"]},"payoutReadiness":{"status":"not_payable","caveats":["Partner approval is still in review before reporting can become a partner-facing portal.","Self-referral review remains a blocker before any payout preparation."]},"redaction":{"buyerDataIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false},"caveat":"Report totals help review partner performance before a payable statement is issued."}],"commissionLedger":[{"id":"commission-ledger-launch-pass-fixture","status":"approved_pending_payout","referralLinkId":"ref-link-launch-circle-waitlist","commissionRuleId":"commission-rule-launch-pass-30","sourceEventId":"event-purchase-completed","linkedCheckoutIntentId":"checkout-intent-fixture-affiliate-launch-pass","grossSaleCents":9000,"commissionCents":2700,"currency":"USD","reason":"Paid checkout attributed to the Launch Circle partner inside the 30-day window."},{"id":"commission-ledger-self-referral-review","status":"review_required","referralLinkId":"ref-link-template-partner-sales","commissionRuleId":"commission-rule-launch-pass-30","sourceEventId":"event-purchase-completed","linkedCheckoutIntentId":"checkout-intent-fixture-self-referral","grossSaleCents":9000,"commissionCents":2700,"currency":"USD","reason":"Possible self-referral pattern needs review before payout eligibility."},{"id":"commission-ledger-refund-reversal","status":"reversed","referralLinkId":"ref-link-launch-circle-waitlist","commissionRuleId":"commission-rule-refund-holdback","sourceEventId":"event-refund-fixture","linkedCheckoutIntentId":"checkout-intent-fixture-refund","grossSaleCents":9000,"commissionCents":0,"currency":"USD","reason":"Refund reversed commission before payout batch creation."}],"payoutBatches":[{"id":"payout-batch-indie-launch-may-preview","preparationId":"payout-preparation-indie-launch-may-preview","status":"review_required","issue":195,"ledgerIds":["commission-ledger-launch-pass-fixture","commission-ledger-self-referral-review"],"eligibleLedgerIds":["commission-ledger-launch-pass-fixture"],"blockedLedgerIds":["commission-ledger-self-referral-review"],"reversedLedgerIds":["commission-ledger-refund-reversal"],"partnerReportIds":["affiliate-partner-report-launch-circle","affiliate-partner-report-template-studio"],"totalCommissionCents":2700,"currency":"USD","reviewBeforePayout":["Confirm refund window has elapsed.","Resolve self-referral review flag.","Confirm partner payout account privately."],"readinessChecklist":[{"id":"payout-prep-check-owner-reviewed","title":"Review decision captured","status":"passed","evidence":"Commission rows can be marked, held, or reversed before payout."},{"id":"payout-prep-check-refund-window","title":"Refund and reversal window cleared","status":"blocked","evidence":"Refund-window checks must clear before payout preparation becomes payable."},{"id":"payout-prep-check-private-payout-data","title":"Private payout and tax data available","status":"external_required","evidence":"Partner payout account and tax form checks stay private."}],"sourceRoutes":["/affiliates/source-data","/affiliates/indie-launch-partners","/api/affiliates/commission-ledger","/api/admin/affiliates/commission-ledger/actions"],"redaction":{"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false,"partnerNotificationIncluded":false},"caveat":"This preparation view shows what must be reviewed before a payable partner statement or payout is created."}],"reviewFlags":[{"id":"review-flag-self-referral","severity":"high","title":"Possible self-referral","linkedLedgerIds":["commission-ledger-self-referral-review"],"reason":"Buyer and partner signals need private comparison before payout.","requiredAction":"Approve or reject the commission with a short review note before payout."},{"id":"review-flag-refund-window","severity":"medium","title":"Refund window still open","linkedLedgerIds":["commission-ledger-launch-pass-fixture"],"reason":"Approved commission remains pending while the refund/dispute window is still open.","requiredAction":"Hold payout until the refund and dispute window has elapsed."}],"auditEvents":[{"id":"affiliate-audit-referral-link-created","actor":"agent","action":"proposed_referral_link","targetId":"ref-link-launch-circle-waitlist","evidence":"Draft source-data fixture created from issue #89.","redaction":"No real partner email, tax, bank, IP, cookie, buyer, or Stripe customer data included."},{"id":"affiliate-audit-commission-reviewed","actor":"system","action":"flagged_commission_for_review","targetId":"commission-ledger-self-referral-review","evidence":"Fixture review rule matched self-referral pattern.","redaction":"Private comparison inputs are not present in public source data."}],"writeBoundary":"Issue #109 can capture seeded referral clicks with idempotency, destination-route validation, hashed request evidence, and aggregate-only public reporting. Issue #111 can attach validated referral click evidence to sandbox checkout intents. Issue #113 can create review-only, non-payable commission ledger evidence from trusted checkout attribution. Issue #115 can apply owner-gated review, hold, or reversal actions to review-only ledger evidence with exact confirmation, idempotency, actor identity, stale-state checks, and audit correlation. Issue #193 exposes public-safe partner reports from aggregate click, checkout attribution, ledger, and review-action evidence. Issue #195 exposes read-only payout preparation rows and readiness checklists. Issue #273 lets verified owners record payout preparation evidence with exact confirmation, idempotency, revision checks, and public-safe redaction while keeping payout execution disabled. Issue #275 lets verified owners record fraud review evidence with exact confirmation, idempotency, review-flag checks, payout batch status checks, and public-safe redaction while keeping fraud enforcement and payout execution disabled. Issue #277 lets verified owners record partner notification readiness evidence with exact confirmation, idempotency, partner report checks, payout preparation status checks, fraud review status checks, and public-safe redaction while keeping partner sends, provider calls, and queue dispatch disabled. Issue #279 lets verified owners record partner notification send preflight evidence with exact confirmation, idempotency, notification readiness status checks, provider-send-disabled checks, and public-safe redaction while keeping partner sends, provider-send enablement, provider calls, send payloads, and queue dispatch disabled. Issue #281 lets verified owners record notification provider readiness evidence with exact confirmation, idempotency, send preflight status checks, provider-configuration-disabled checks, provider-secret-redaction checks, and public-safe redaction while keeping provider configuration, provider secrets, sender credentials, partner sends, provider calls, send payloads, and queue dispatch disabled. Cookie assignment, buyer attribution finalization, payable commission writes, fraud enforcement, Stripe payout actions, tax collection, payout account storage, partner notification sends, provider-send configuration, provider secret storage, private partner portals, and direct agent review writes require future confirmed-write APIs.","validation":["/affiliates/source-data returns seeded programs, partners, links, attribution rules, commission rules, ledger fixtures, payout batches, read-only payout preparation rows, and review flags.","/affiliates/source-data exposes public-safe partner report definitions and aggregate report rows without buyer, payout, tax, Stripe, raw click, raw checkout, or private actor data.","/affiliates/source-data exposes read-only payout preparation and owner-confirmed payout preparation records without payout accounts, tax forms, Stripe payout identifiers, private actor identity, raw ledger rows, buyer data, or partner notification payloads.","/affiliates/source-data exposes owner-reviewed affiliate fraud review records without fraud enforcement, buyer data, raw ledger/click/checkout rows, private fraud signals, actor identity, payout accounts, tax forms, Stripe payout identifiers, or partner notifications.","/affiliates/source-data exposes owner-reviewed partner notification readiness records without recipient emails, message bodies, provider message IDs, queue rows, fraud enforcement, buyer data, raw rows, private fraud signals, actor identity, payout accounts, tax forms, Stripe payout identifiers, or partner sends.","/affiliates/source-data exposes owner-reviewed partner notification send preflight records without recipient emails, message bodies, send payloads, provider message IDs, queue rows, provider-send enablement, fraud enforcement, buyer data, raw rows, private fraud signals, actor identity, payout accounts, tax forms, Stripe payout identifiers, or partner sends.","/affiliates/source-data exposes owner-reviewed notification provider readiness records without provider configuration, provider secrets, sender credentials, recipient emails, message bodies, send payloads, provider message IDs, queue rows, provider calls, provider-send enablement, fraud enforcement, buyer data, raw rows, private fraud signals, actor identity, payout accounts, tax forms, Stripe payout identifiers, or partner sends.","/affiliates/indie-launch-partners renders the affiliate/referral preview.","/api/affiliates/clicks stores seeded referral click evidence with idempotency.","/api/commerce/checkout can attach eligible referral click IDs to sandbox checkout intents as public-safe attribution evidence.","/api/affiliates/commission-ledger can create review-only commission ledger evidence from trusted checkout attribution.","/api/admin/affiliates/commission-ledger/actions can apply owner-gated review, hold, or reversal actions without creating payable commissions.","/api/admin/affiliates/payout-preparation-records can create owner-confirmed payout preparation records without creating payout state.","/api/admin/affiliates/fraud-review-records can create owner-confirmed fraud review evidence without enforcing a fraud decision or creating payout state.","/api/admin/affiliates/notification-readiness-records can create owner-confirmed partner notification readiness evidence without sending notifications, calling providers, creating queue rows, or creating payout state.","/api/admin/affiliates/notification-send-preflights can create owner-confirmed partner notification send preflight evidence without enabling provider sends, creating send payloads, sending notifications, calling providers, creating queue rows, or creating payout state.","/agent-docs/source-data lists the affiliate/referral read contract for future MCP resources."]}],"caveat":"This contract proves affiliate and referral read/preview semantics, privacy-safe seeded click capture, checkout attribution evidence, review-only commission ledger evidence, owner-gated review/reversal actions, public-safe partner reports, read-only payout preparation, owner-confirmed payout preparation records, owner-reviewed fraud review evidence, owner-reviewed partner notification readiness evidence, owner-reviewed partner notification send preflight evidence, and owner-reviewed notification provider readiness evidence. Public source-data may expose aggregate click, checkout attribution, commission ledger, owner action, partner report, payout preparation, payout preparation record, fraud review record, notification readiness record, notification send preflight record, and notification provider readiness record counts, but it does not expose raw rows, actor identity, private review reasons, private fraud signals, recipient emails, message bodies, send payloads, provider configuration, provider secrets, sender credentials, provider message IDs, send queue rows, assign cookies, finalize buyer attribution, create payable commissions, store payout accounts, collect tax forms, trigger Stripe payouts, enforce fraud decisions, send partner notifications, enable provider sends, or provide direct public agent write APIs.","clickSummary":{"status":"available","aggregateCounts":[{"referral_link_id":"ref-link-launch-circle-waitlist","referral_code":"LAUNCHCIRCLE","partner_id":"affiliate-partner-launch-circle","destination_route":"/funnels/indie-launch-sandbox","total_clicks":8,"last_click_at":1779174659},{"referral_link_id":"ref-link-template-partner-sales","referral_code":"TEMPLATESTUDIO","partner_id":"affiliate-partner-template-studio","destination_route":"/offers/indie-launch-stack","total_clicks":1,"last_click_at":1779170037}],"rawRowsIncluded":false,"privateDataIncluded":false},"checkoutAttributionSummary":{"status":"available","aggregateCounts":[{"referral_link_id":"ref-link-launch-circle-waitlist","referral_code":"LAUNCHCIRCLE","partner_id":"affiliate-partner-launch-circle","destination_route":"/funnels/indie-launch-sandbox","attribution_status":"checkout_intent_attached","total_checkouts":3,"last_attached_at":1779174659}],"rawRowsIncluded":false,"privateDataIncluded":false,"commissionRowsIncluded":false},"commissionLedgerSummary":{"status":"available","aggregateCounts":[{"referral_link_id":"ref-link-launch-circle-waitlist","referral_code":"LAUNCHCIRCLE","partner_id":"affiliate-partner-launch-circle","ledger_status":"review_only","review_status":"refund_window_open","payout_status":"not_payable","total_ledgers":2,"total_source_checkout_amount_cents":5600,"total_commission_cents":920,"last_created_at":1779174660}],"reviewActionCounts":[],"rawRowsIncluded":false,"privateDataIncluded":false,"payableRowsIncluded":false,"payoutRowsIncluded":false,"taxRowsIncluded":false,"partnerNotificationsIncluded":false},"partnerReviewActionSummary":{"status":"available","aggregateCounts":[],"rawRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutRowsIncluded":false},"partnerReportSummary":{"status":"available","reports":[{"affiliatePartnerReportId":"affiliate-partner-report-launch-circle","affiliatePartnerId":"affiliate-partner-launch-circle","title":"Launch Circle performance report","status":"public_safe_report_ready","issue":193,"reportingWindow":{"id":"affiliate-report-window-public-safe-all-time","label":"All-time aggregate","source":"Seeded fixture plus D1 aggregate summaries from click, checkout attribution, ledger, and review-action tables."},"referralLinkIds":["ref-link-launch-circle-waitlist"],"totals":{"totalClicks":8,"attributedCheckouts":3,"reviewOnlyLedgers":2,"reviewRequiredLedgers":2,"reviewedActions":0,"heldActions":0,"reversedActions":0,"totalCommissionCents":920,"currency":"USD"},"fixtureMetrics":{"fixtureLedgerCount":2,"fixtureReviewRequiredCount":0,"fixtureReversedCount":1,"fixtureCommissionCents":2700,"currency":"USD","runtimeAggregateFields":["totalClicks","attributedCheckouts","reviewOnlyLedgers","reviewedActions","heldActions","reversedActions"]},"payoutReadiness":{"status":"review_required","caveats":["Refund window and reversal evidence must remain reviewable before payout preparation.","Partner payout account, tax form, and private notification data stay private."]},"lastActivityAt":1779174660,"redaction":{"buyerDataIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false},"caveat":"Report totals help review partner performance before a payable statement is issued."},{"affiliatePartnerReportId":"affiliate-partner-report-template-studio","affiliatePartnerId":"affiliate-partner-template-studio","title":"Template Studio performance report","status":"public_safe_report_ready","issue":193,"reportingWindow":{"id":"affiliate-report-window-public-safe-all-time","label":"All-time aggregate","source":"Seeded fixture plus D1 aggregate summaries from click, checkout attribution, ledger, and review-action tables."},"referralLinkIds":["ref-link-template-partner-sales"],"totals":{"totalClicks":1,"attributedCheckouts":0,"reviewOnlyLedgers":0,"reviewRequiredLedgers":0,"reviewedActions":0,"heldActions":0,"reversedActions":0,"totalCommissionCents":0,"currency":"USD"},"fixtureMetrics":{"fixtureLedgerCount":1,"fixtureReviewRequiredCount":1,"fixtureReversedCount":0,"fixtureCommissionCents":2700,"currency":"USD","runtimeAggregateFields":["totalClicks","attributedCheckouts","reviewOnlyLedgers","reviewedActions","heldActions","reversedActions"]},"payoutReadiness":{"status":"not_payable","caveats":["Partner approval is still in review before reporting can become a partner-facing portal.","Self-referral review remains a blocker before any payout preparation."]},"lastActivityAt":1779170037,"redaction":{"buyerDataIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false},"caveat":"Report totals help review partner performance before a payable statement is issued."}],"rawRowsIncluded":false,"privateDataIncluded":false,"buyerDataIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutRowsIncluded":false,"taxRowsIncluded":false,"stripeIdsIncluded":false},"payoutPreparationSummary":{"status":"available","batches":[{"payoutPreparationId":"payout-preparation-indie-launch-may-preview","payoutBatchId":"payout-batch-indie-launch-may-preview","status":"review_required","issue":195,"partnerReportIds":["affiliate-partner-report-launch-circle","affiliate-partner-report-template-studio"],"eligibleLedgerIds":["commission-ledger-launch-pass-fixture"],"blockedLedgerIds":["commission-ledger-self-referral-review"],"reversedLedgerIds":["commission-ledger-refund-reversal"],"readinessChecklist":[{"id":"payout-prep-check-owner-reviewed","title":"Review decision captured","status":"passed","evidence":"Commission rows can be marked, held, or reversed before payout."},{"id":"payout-prep-check-refund-window","title":"Refund and reversal window cleared","status":"blocked","evidence":"Refund-window checks must clear before payout preparation becomes payable."},{"id":"payout-prep-check-private-payout-data","title":"Private payout and tax data available","status":"external_required","evidence":"Partner payout account and tax form checks stay private."}],"reviewBeforePayout":["Confirm refund window has elapsed.","Resolve self-referral review flag.","Confirm partner payout account privately."],"sourceRoutes":["/affiliates/source-data","/affiliates/indie-launch-partners","/api/affiliates/commission-ledger","/api/admin/affiliates/commission-ledger/actions"],"totals":{"eligibleFixtureLedgers":1,"blockedFixtureLedgers":1,"reversedFixtureLedgers":1,"runtimeReviewOnlyLedgers":2,"runtimeReviewedLedgers":0,"runtimeReviewRequiredLedgers":2,"runtimeReversedLedgers":0,"reviewedActions":0,"heldActions":0,"reversedActions":0,"fixtureTotalCommissionCents":2700,"runtimeTotalCommissionCents":920,"currency":"USD"},"execution":{"payableCommissionCreated":false,"stripePayoutCreated":false,"stripeTransferCreated":false,"payoutAccountStored":false,"taxDataCollected":false,"partnerNotificationSent":false,"directAgentWriteAccepted":false},"lastActivityAt":1779174660,"redaction":{"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false,"partnerNotificationIncluded":false},"caveat":"This preparation view shows what must be reviewed before a payable partner statement or payout is created."}],"rawRowsIncluded":false,"privateDataIncluded":false,"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawActorIdentityIncluded":false,"privateReasonsIncluded":false,"payoutRowsIncluded":false,"payoutAccountsIncluded":false,"taxRowsIncluded":false,"stripeIdsIncluded":false,"partnerNotificationsIncluded":false},"payoutPreparationRecords":{"id":"affiliate-payout-preparation-record-contract","status":"owner-affiliate-payout-preparation-records-ready","issue":273,"parentIssue":19,"apiRoute":"/api/admin/affiliates/payout-preparation-records","ownerRoute":"/admin/affiliates","sourceDataRoute":"/affiliates/source-data","source":"d1","loadError":null,"confirmation":{"required":true,"text":"Record Bumpgrade affiliate payout preparation evidence"},"currentEvidence":{"programId":"affiliate-program-indie-launch-partners","programRevisionId":"affiliate-program-revision-indie-launch-2026-05-21-notification-provider-readiness","payoutPreparationId":"payout-preparation-indie-launch-may-preview","payoutBatchId":"payout-batch-indie-launch-may-preview","payoutBatchStatus":"review_required","eligibleLedgerCount":1,"blockedLedgerCount":1,"reversedLedgerCount":1,"totalCommissionCents":2700,"currency":"USD","readinessChecklist":[{"id":"payout-prep-check-owner-reviewed","title":"Review decision captured","status":"passed","evidence":"Commission rows can be marked, held, or reversed before payout."},{"id":"payout-prep-check-refund-window","title":"Refund and reversal window cleared","status":"blocked","evidence":"Refund-window checks must clear before payout preparation becomes payable."},{"id":"payout-prep-check-private-payout-data","title":"Private payout and tax data available","status":"external_required","evidence":"Partner payout account and tax form checks stay private."}],"reviewBeforePayout":["Confirm refund window has elapsed.","Resolve self-referral review flag.","Confirm partner payout account privately."],"ownerRecordAllowed":true,"payableCommissionCreated":false,"stripePayoutCreated":false,"stripeTransferCreated":false,"payoutAccountStored":false,"taxDataCollected":false,"partnerNotificationSent":false,"fraudDecisionEnforced":false,"buyerDataIncluded":false,"rawLedgerRowsExposed":false,"rawActorIdentityIncluded":false},"counts":{"payoutPreparationRecords":0,"ownerConfirmedRecords":0,"ownerRecordCreatedRecords":0,"payableCommissionCreatedRecords":0,"stripePayoutCreatedRecords":0,"stripeTransferCreatedRecords":0,"payoutAccountStoredRecords":0,"taxDataCollectedRecords":0,"partnerNotificationSentRecords":0,"fraudDecisionEnforcedRecords":0,"buyerDataIncludedRecords":0,"rawLedgerRowsExposedRecords":0,"rawActorIdentityIncludedRecords":0},"latestRecords":[],"redaction":{"privateDataIncluded":false,"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawActorIdentityIncluded":false,"actorEmailIncluded":false,"actorEmailHashIncluded":false,"privateNoteIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false,"partnerNotificationIncluded":false,"fraudPrivateSignalsIncluded":false},"privateFieldsExcluded":["actorEmail","actorEmailHash","privateNote","privateNoteSha256","payoutAccount","taxData","stripePayoutId","stripeTransferId","partnerNotificationBody","buyerData","rawLedgerRows","privateFraudSignals","metadataJson"],"writeBoundary":"Issue #273 lets verified owners record redacted affiliate payout-preparation evidence after exact confirmation, idempotency, program revision checks, payout batch status checks, and payout-preparation evidence checks. It creates owner-visible preparation evidence only; it does not create payable commission state, create Stripe payouts or transfers, store payout accounts, collect tax data, notify partners, enforce fraud decisions, expose buyer data, expose raw ledger rows, or accept direct agent payout writes."},"fraudReviewRecords":{"id":"affiliate-fraud-review-record-contract","status":"owner-affiliate-fraud-review-records-ready","issue":275,"parentIssue":19,"apiRoute":"/api/admin/affiliates/fraud-review-records","ownerRoute":"/admin/affiliates","sourceDataRoute":"/affiliates/source-data","source":"d1","loadError":null,"confirmation":{"required":true,"text":"Record Bumpgrade affiliate fraud review evidence"},"currentEvidence":{"programId":"affiliate-program-indie-launch-partners","programRevisionId":"affiliate-program-revision-indie-launch-2026-05-21-notification-provider-readiness","reviewFlagId":"review-flag-self-referral","reviewFlagTitle":"Possible self-referral","reviewFlagSeverity":"high","requiredAction":"Approve or reject the commission with a short review note before payout.","linkedLedgerIds":["commission-ledger-self-referral-review"],"payoutPreparationId":"payout-preparation-indie-launch-may-preview","payoutBatchId":"payout-batch-indie-launch-may-preview","payoutBatchStatus":"review_required","supportedReviewDispositions":["needs_more_review","cleared_for_future_review","reject_before_payout"],"defaultReviewDisposition":"needs_more_review","ownerRecordAllowed":true,"fraudDecisionEnforced":false,"payableCommissionCreated":false,"stripePayoutCreated":false,"stripeTransferCreated":false,"payoutAccountStored":false,"taxDataCollected":false,"partnerNotificationSent":false,"buyerDataIncluded":false,"rawLedgerRowsExposed":false,"rawClickRowsExposed":false,"rawCheckoutRowsExposed":false,"rawActorIdentityIncluded":false,"privateFraudSignalsIncluded":false},"counts":{"fraudReviewRecords":0,"ownerConfirmedRecords":0,"ownerFraudReviewRecordCreatedRecords":0,"fraudDecisionEnforcedRecords":0,"payableCommissionCreatedRecords":0,"stripePayoutCreatedRecords":0,"stripeTransferCreatedRecords":0,"payoutAccountStoredRecords":0,"taxDataCollectedRecords":0,"partnerNotificationSentRecords":0,"buyerDataIncludedRecords":0,"rawLedgerRowsExposedRecords":0,"rawClickRowsExposedRecords":0,"rawCheckoutRowsExposedRecords":0,"rawActorIdentityIncludedRecords":0,"privateFraudSignalsIncludedRecords":0},"latestRecords":[],"redaction":{"privateDataIncluded":false,"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"actorEmailIncluded":false,"actorEmailHashIncluded":false,"privateNoteIncluded":false,"privateFraudSignalsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false,"partnerNotificationIncluded":false},"privateFieldsExcluded":["actorEmail","actorEmailHash","privateNote","privateNoteSha256","buyerData","rawLedgerRows","rawClickRows","rawCheckoutRows","privateFraudSignals","payoutAccount","taxData","stripePayoutId","stripeTransferId","partnerNotificationBody","metadataJson"],"writeBoundary":"Issue #275 lets verified owners record redacted affiliate fraud-review evidence after exact confirmation, idempotency, program revision checks, payout batch status checks, and review-flag evidence checks. It creates owner-visible fraud review evidence only; it does not enforce fraud decisions, create payable commission state, create Stripe payouts or transfers, store payout accounts, collect tax data, notify partners, expose buyer data, expose raw ledger/click/checkout rows, or accept direct public agent affiliate writes."},"partnerNotificationReadinessRecords":{"id":"affiliate-partner-notification-readiness-record-contract","status":"owner-affiliate-partner-notification-readiness-records-ready","issue":277,"parentIssue":19,"apiRoute":"/api/admin/affiliates/notification-readiness-records","ownerRoute":"/admin/affiliates","sourceDataRoute":"/affiliates/source-data","source":"d1","loadError":null,"confirmation":{"required":true,"text":"Record Bumpgrade affiliate partner notification readiness evidence"},"currentEvidence":{"programId":"affiliate-program-indie-launch-partners","programRevisionId":"affiliate-program-revision-indie-launch-2026-05-21-notification-provider-readiness","affiliatePartnerReportId":"affiliate-partner-report-launch-circle","affiliatePartnerId":"affiliate-partner-launch-circle","partnerReportStatus":"public_safe_report_ready","payoutPreparationId":"payout-preparation-indie-launch-may-preview","payoutBatchId":"payout-batch-indie-launch-may-preview","payoutBatchStatus":"review_required","payoutPreparationRecordStatus":"owner-affiliate-payout-preparation-records-ready","fraudReviewRecordStatus":"owner-affiliate-fraud-review-records-ready","reviewFlagId":"review-flag-self-referral","reviewFlagSeverity":"high","linkedLedgerIds":["commission-ledger-self-referral-review"],"notificationChannel":"email","notificationAudience":"redacted_affiliate_partner_summary","supportedNotificationReadinessDispositions":["not_ready_to_send","draft_ready_for_owner_review","blocked_pending_private_data"],"defaultNotificationReadinessDisposition":"not_ready_to_send","readinessChecklist":[{"id":"partner-notification-check-payout-preparation-records","title":"Payout preparation evidence contract is available","status":"passed","evidence":"Issue #273 records owner-confirmed payout preparation evidence without payout execution."},{"id":"partner-notification-check-fraud-review-records","title":"Fraud review evidence contract is available","status":"passed","evidence":"Issue #275 records owner-reviewed fraud evidence without fraud enforcement."},{"id":"partner-notification-check-private-recipient-data","title":"Private partner recipient data remains external","status":"external_required","evidence":"Recipient addresses, message bodies, payout accounts, and tax records are excluded."},{"id":"partner-notification-check-send-path-disabled","title":"Notification send path remains disabled","status":"blocked","evidence":"This readiness record does not call providers, create queue rows, or send partner notifications."}],"ownerRecordAllowed":true,"partnerNotificationSent":false,"notificationProviderCalled":false,"queueDispatchCreated":false,"notificationBodyIncluded":false,"recipientEmailIncluded":false,"providerMessageIdIncluded":false,"sendQueueRowsIncluded":false,"payableCommissionCreated":false,"fraudDecisionEnforced":false,"stripePayoutCreated":false,"stripeTransferCreated":false,"payoutAccountStored":false,"taxDataCollected":false,"buyerDataIncluded":false,"rawLedgerRowsExposed":false,"rawClickRowsExposed":false,"rawCheckoutRowsExposed":false,"rawActorIdentityIncluded":false,"privateFraudSignalsIncluded":false},"counts":{"notificationReadinessRecords":0,"ownerConfirmedRecords":0,"ownerRecordCreatedRecords":0,"partnerNotificationSentRecords":0,"notificationProviderCalledRecords":0,"queueDispatchCreatedRecords":0,"notificationBodyIncludedRecords":0,"recipientEmailIncludedRecords":0,"providerMessageIdIncludedRecords":0,"sendQueueRowsIncludedRecords":0,"payableCommissionCreatedRecords":0,"fraudDecisionEnforcedRecords":0,"stripePayoutCreatedRecords":0,"stripeTransferCreatedRecords":0,"payoutAccountStoredRecords":0,"taxDataCollectedRecords":0,"buyerDataIncludedRecords":0,"rawLedgerRowsExposedRecords":0,"rawClickRowsExposedRecords":0,"rawCheckoutRowsExposedRecords":0,"rawActorIdentityIncludedRecords":0,"privateFraudSignalsIncludedRecords":0},"latestRecords":[],"redaction":{"privateDataIncluded":false,"recipientEmailIncluded":false,"notificationBodyIncluded":false,"providerMessageIdIncluded":false,"sendQueueRowsIncluded":false,"actorEmailIncluded":false,"actorEmailHashIncluded":false,"privateNoteIncluded":false,"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateFraudSignalsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false,"partnerNotificationIncluded":false},"privateFieldsExcluded":["actorEmail","actorEmailHash","privateNote","privateNoteSha256","recipientEmail","notificationBody","providerMessageId","sendQueueRows","buyerData","rawLedgerRows","rawClickRows","rawCheckoutRows","privateFraudSignals","payoutAccount","taxData","stripePayoutId","stripeTransferId","metadataJson"],"writeBoundary":"Issue #277 lets verified owners record redacted affiliate partner notification-readiness evidence after exact confirmation, idempotency, program revision checks, partner report checks, payout preparation checks, payout batch status checks, and fraud review evidence checks. It creates owner-visible readiness evidence only; it does not send partner notifications, call notification providers, create queue dispatch rows, include recipient addresses or message bodies, create payable commission state, enforce fraud decisions, create Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, or accept direct public agent affiliate writes."},"partnerNotificationSendPreflightRecords":{"id":"affiliate-partner-notification-send-preflight-record-contract","status":"owner-affiliate-partner-notification-send-preflights-ready","issue":279,"parentIssue":19,"apiRoute":"/api/admin/affiliates/notification-send-preflights","ownerRoute":"/admin/affiliates","sourceDataRoute":"/affiliates/source-data","source":"d1","loadError":null,"confirmation":{"required":true,"text":"Record Bumpgrade affiliate partner notification send preflight evidence"},"currentEvidence":{"programId":"affiliate-program-indie-launch-partners","programRevisionId":"affiliate-program-revision-indie-launch-2026-05-21-notification-provider-readiness","affiliatePartnerReportId":"affiliate-partner-report-launch-circle","affiliatePartnerId":"affiliate-partner-launch-circle","partnerReportStatus":"public_safe_report_ready","payoutPreparationId":"payout-preparation-indie-launch-may-preview","payoutBatchId":"payout-batch-indie-launch-may-preview","payoutBatchStatus":"review_required","payoutPreparationRecordStatus":"owner-affiliate-payout-preparation-records-ready","fraudReviewRecordStatus":"owner-affiliate-fraud-review-records-ready","notificationReadinessRecordStatus":"owner-affiliate-partner-notification-readiness-records-ready","reviewFlagId":"review-flag-self-referral","reviewFlagSeverity":"high","linkedLedgerIds":["commission-ledger-self-referral-review"],"notificationChannel":"email","notificationAudience":"redacted_affiliate_partner_summary","supportedNotificationSendPreflightDispositions":["blocked_pending_recipient_review","draft_ready_for_owner_review","provider_contract_not_ready"],"defaultNotificationSendPreflightDisposition":"blocked_pending_recipient_review","sendPreflightChecklist":[{"id":"partner-notification-check-payout-preparation-records","title":"Payout preparation evidence contract is available","status":"passed","evidence":"Issue #273 records owner-confirmed payout preparation evidence without payout execution."},{"id":"partner-notification-check-fraud-review-records","title":"Fraud review evidence contract is available","status":"passed","evidence":"Issue #275 records owner-reviewed fraud evidence without fraud enforcement."},{"id":"partner-notification-check-notification-readiness-records","title":"Notification readiness evidence contract is available","status":"passed","evidence":"Issue #277 records owner-reviewed notification readiness evidence without sending partner notifications."},{"id":"partner-notification-check-private-recipient-data","title":"Private partner recipient data remains external","status":"external_required","evidence":"Recipient addresses, message bodies, payout accounts, and tax records are excluded."},{"id":"partner-notification-check-send-path-disabled","title":"Notification send path remains disabled","status":"blocked","evidence":"This send preflight record keeps provider sends disabled, creates no queue rows, and sends no partner notifications."},{"id":"partner-notification-check-send-payload-disabled","title":"Send payload remains unbuilt","status":"blocked","evidence":"No recipient payload, personalized body, provider message ID, or send payload is created."}],"ownerRecordAllowed":true,"partnerNotificationSent":false,"notificationProviderCalled":false,"notificationProviderSendEnabled":false,"queueDispatchCreated":false,"sendPayloadIncluded":false,"notificationBodyIncluded":false,"recipientEmailIncluded":false,"providerMessageIdIncluded":false,"sendQueueRowsIncluded":false,"payableCommissionCreated":false,"fraudDecisionEnforced":false,"stripePayoutCreated":false,"stripeTransferCreated":false,"payoutAccountStored":false,"taxDataCollected":false,"buyerDataIncluded":false,"rawLedgerRowsExposed":false,"rawClickRowsExposed":false,"rawCheckoutRowsExposed":false,"rawActorIdentityIncluded":false,"privateFraudSignalsIncluded":false},"counts":{"notificationSendPreflightRecords":0,"ownerConfirmedRecords":0,"ownerRecordCreatedRecords":0,"partnerNotificationSentRecords":0,"notificationProviderCalledRecords":0,"notificationProviderSendEnabledRecords":0,"queueDispatchCreatedRecords":0,"sendPayloadIncludedRecords":0,"notificationBodyIncludedRecords":0,"recipientEmailIncludedRecords":0,"providerMessageIdIncludedRecords":0,"sendQueueRowsIncludedRecords":0,"payableCommissionCreatedRecords":0,"fraudDecisionEnforcedRecords":0,"stripePayoutCreatedRecords":0,"stripeTransferCreatedRecords":0,"payoutAccountStoredRecords":0,"taxDataCollectedRecords":0,"buyerDataIncludedRecords":0,"rawLedgerRowsExposedRecords":0,"rawClickRowsExposedRecords":0,"rawCheckoutRowsExposedRecords":0,"rawActorIdentityIncludedRecords":0,"privateFraudSignalsIncludedRecords":0},"latestRecords":[],"redaction":{"privateDataIncluded":false,"recipientEmailIncluded":false,"notificationBodyIncluded":false,"providerMessageIdIncluded":false,"sendQueueRowsIncluded":false,"sendPayloadIncluded":false,"providerSendEnabled":false,"actorEmailIncluded":false,"actorEmailHashIncluded":false,"privateNoteIncluded":false,"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateFraudSignalsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false,"partnerNotificationIncluded":false},"privateFieldsExcluded":["actorEmail","actorEmailHash","privateNote","privateNoteSha256","recipientEmail","notificationBody","sendPayload","providerMessageId","sendQueueRows","buyerData","rawLedgerRows","rawClickRows","rawCheckoutRows","privateFraudSignals","payoutAccount","taxData","stripePayoutId","stripeTransferId","metadataJson"],"writeBoundary":"Issue #279 lets verified owners record redacted affiliate partner notification-send-preflight evidence after exact confirmation, idempotency, program revision checks, partner report checks, payout preparation checks, payout batch status checks, fraud review evidence checks, notification readiness contract checks, and provider-send-disabled checks. It creates owner-visible send preflight evidence only; it does not send partner notifications, call notification providers, enable provider sends, create send payloads, create queue dispatch rows, include recipient addresses or message bodies, create payable commission state, enforce fraud decisions, create Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, or accept direct public agent affiliate writes."},"partnerNotificationProviderReadinessRecords":{"id":"affiliate-partner-notification-provider-readiness-record-contract","status":"owner-affiliate-partner-notification-provider-readiness-records-ready","issue":281,"parentIssue":19,"apiRoute":"/api/admin/affiliates/notification-provider-readiness","ownerRoute":"/admin/affiliates","sourceDataRoute":"/affiliates/source-data","source":"d1","loadError":null,"confirmation":{"required":true,"text":"Record Bumpgrade affiliate partner notification provider readiness evidence"},"currentEvidence":{"programId":"affiliate-program-indie-launch-partners","programRevisionId":"affiliate-program-revision-indie-launch-2026-05-21-notification-provider-readiness","affiliatePartnerReportId":"affiliate-partner-report-launch-circle","affiliatePartnerId":"affiliate-partner-launch-circle","partnerReportStatus":"public_safe_report_ready","payoutPreparationId":"payout-preparation-indie-launch-may-preview","payoutBatchId":"payout-batch-indie-launch-may-preview","payoutBatchStatus":"review_required","payoutPreparationRecordStatus":"owner-affiliate-payout-preparation-records-ready","fraudReviewRecordStatus":"owner-affiliate-fraud-review-records-ready","notificationReadinessRecordStatus":"owner-affiliate-partner-notification-readiness-records-ready","notificationSendPreflightRecordStatus":"owner-affiliate-partner-notification-send-preflights-ready","reviewFlagId":"review-flag-self-referral","reviewFlagSeverity":"high","linkedLedgerIds":["commission-ledger-self-referral-review"],"notificationChannel":"email","notificationAudience":"redacted_affiliate_partner_summary","supportedNotificationProviderReadinessDispositions":["blocked_pending_provider_configuration","provider_configuration_ready_for_owner_review","provider_contract_missing"],"defaultNotificationProviderReadinessDisposition":"blocked_pending_provider_configuration","providerReadinessChecklist":[{"id":"partner-notification-check-payout-preparation-records","title":"Payout preparation evidence contract is available","status":"passed","evidence":"Issue #273 records owner-confirmed payout preparation evidence without payout execution."},{"id":"partner-notification-check-fraud-review-records","title":"Fraud review evidence contract is available","status":"passed","evidence":"Issue #275 records owner-reviewed fraud evidence without fraud enforcement."},{"id":"partner-notification-check-notification-readiness-records","title":"Notification readiness evidence contract is available","status":"passed","evidence":"Issue #277 records owner-reviewed notification readiness evidence without sending partner notifications."},{"id":"partner-notification-check-send-preflight-records","title":"Notification send preflight evidence contract is available","status":"passed","evidence":"Issue #279 records owner-reviewed notification send preflight evidence without enabling provider sends."},{"id":"partner-notification-check-private-recipient-data","title":"Private partner recipient data remains external","status":"external_required","evidence":"Recipient addresses, message bodies, payout accounts, provider secrets, and tax records are excluded."},{"id":"partner-notification-check-provider-configuration-disabled","title":"Provider configuration remains disabled","status":"blocked","evidence":"This provider readiness record keeps provider configuration and provider sends disabled, creates no queue rows, and sends no partner notifications."},{"id":"partner-notification-check-send-payload-disabled","title":"Send payload remains unbuilt","status":"blocked","evidence":"No recipient payload, personalized body, provider message ID, or send payload is created."}],"ownerRecordAllowed":true,"partnerNotificationSent":false,"notificationProviderCalled":false,"notificationProviderSendEnabled":false,"notificationProviderConfigured":false,"providerSecretIncluded":false,"senderCredentialIncluded":false,"queueDispatchCreated":false,"sendPayloadIncluded":false,"notificationBodyIncluded":false,"recipientEmailIncluded":false,"providerMessageIdIncluded":false,"sendQueueRowsIncluded":false,"payableCommissionCreated":false,"fraudDecisionEnforced":false,"stripePayoutCreated":false,"stripeTransferCreated":false,"payoutAccountStored":false,"taxDataCollected":false,"buyerDataIncluded":false,"rawLedgerRowsExposed":false,"rawClickRowsExposed":false,"rawCheckoutRowsExposed":false,"rawActorIdentityIncluded":false,"privateFraudSignalsIncluded":false},"counts":{"notificationProviderReadinessRecords":0,"ownerConfirmedRecords":0,"ownerRecordCreatedRecords":0,"partnerNotificationSentRecords":0,"notificationProviderCalledRecords":0,"notificationProviderSendEnabledRecords":0,"notificationProviderConfiguredRecords":0,"providerSecretIncludedRecords":0,"senderCredentialIncludedRecords":0,"queueDispatchCreatedRecords":0,"sendPayloadIncludedRecords":0,"notificationBodyIncludedRecords":0,"recipientEmailIncludedRecords":0,"providerMessageIdIncludedRecords":0,"sendQueueRowsIncludedRecords":0,"payableCommissionCreatedRecords":0,"fraudDecisionEnforcedRecords":0,"stripePayoutCreatedRecords":0,"stripeTransferCreatedRecords":0,"payoutAccountStoredRecords":0,"taxDataCollectedRecords":0,"buyerDataIncludedRecords":0,"rawLedgerRowsExposedRecords":0,"rawClickRowsExposedRecords":0,"rawCheckoutRowsExposedRecords":0,"rawActorIdentityIncludedRecords":0,"privateFraudSignalsIncludedRecords":0},"latestRecords":[],"redaction":{"privateDataIncluded":false,"recipientEmailIncluded":false,"notificationBodyIncluded":false,"providerMessageIdIncluded":false,"sendQueueRowsIncluded":false,"sendPayloadIncluded":false,"providerSendEnabled":false,"providerConfigured":false,"providerSecretIncluded":false,"senderCredentialIncluded":false,"actorEmailIncluded":false,"actorEmailHashIncluded":false,"privateNoteIncluded":false,"buyerDataIncluded":false,"rawLedgerRowsIncluded":false,"rawClickRowsIncluded":false,"rawCheckoutRowsIncluded":false,"rawActorIdentityIncluded":false,"privateFraudSignalsIncluded":false,"payoutAccountIncluded":false,"taxDataIncluded":false,"stripeIdsIncluded":false,"partnerNotificationIncluded":false},"privateFieldsExcluded":["actorEmail","actorEmailHash","privateNote","privateNoteSha256","recipientEmail","notificationBody","sendPayload","providerMessageId","providerSecret","senderCredential","notificationProviderConfig","sendQueueRows","buyerData","rawLedgerRows","rawClickRows","rawCheckoutRows","privateFraudSignals","payoutAccount","taxData","stripePayoutId","stripeTransferId","metadataJson"],"writeBoundary":"Issue #281 lets verified owners record redacted affiliate partner notification-provider-readiness evidence after exact confirmation, idempotency, program revision checks, partner report checks, payout preparation checks, payout batch status checks, fraud review evidence checks, notification readiness contract checks, send preflight contract checks, provider configuration disabled checks, and provider-send-disabled checks. It creates owner-visible provider readiness evidence only; it does not send partner notifications, call notification providers, configure notification providers, store provider secrets or sender credentials, enable provider sends, create send payloads, create queue dispatch rows, include recipient addresses or message bodies, create payable commission state, enforce fraud decisions, create Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, or accept direct public agent affiliate writes."}}