Documentation

    Documentation

    Documentation

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    1. /
    2. /PaymentConductor architecture

    Updated Jun 12, 20264 min listen

    1. /
    2. /PaymentConductor architecture

    Updated Jun 12, 20264 min listen

    1. /
    2. /PaymentConductor architecture

    Updated Jun 12, 20264 min listen

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Architecture
    Data Model
    Real Time
    Discovery Mutation Sync
    Security
    Backend Services
    k8s-postgres-fcm Mode
    Firebase Integration
    Features
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Tunnel Protocol
    Wallet & Credit System
    Multi-Vendor Store
    Referral Codes (Refcodes)
    Affiliate & Referral Enablement
    Payments Overview
    PaymentConductor
    SubscriptionConductor
    VideoConductor
    News Module - Digital Newspaper Experience
    Member Blogs
    Public Profile Pages
    Username Reservation System
    Scientific Editor
    Locale System
    Security & Compliance
    NFT Marketplace
    Token Staking System
    Performance Optimization Patterns
    Mobile Experience
    Wallet
    Wallet Security Tips
    API
    Authentication
    Email AI-CRM API
    Entities
    Opportunities
    Messaging API
    Notifications API
    Wallet API
    Store API
    Admin API
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Branding
    Themes
    Web3
    Token launch jurisdictions
    Deployment
    Self-hosted deployment
    Vercel
    Docker
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Development
    Local Setup
    Code Structure
    Documentation components
    Community tooling
    Ring MCP Server
    Generative Images (ImageConductor)
    Autonomous Newsroom (Grok)
    OSS vs enterprise
    Whitelabel Navigation
    Best Practices
    Workflow
    Code Style
    Performance
    Testing
    Deployment
    Debugging
    Contributing
    MCP
    ring-image-create
    ring-video-create
    Examples
    Quick Start
    White Label
    Real World
    Integrations
    Ethereum wallets (Wagmi v3)

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Architecture
    Data Model
    Real Time
    Discovery Mutation Sync
    Security
    Backend Services
    k8s-postgres-fcm Mode
    Firebase Integration
    Features
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Tunnel Protocol
    Wallet & Credit System
    Multi-Vendor Store
    Referral Codes (Refcodes)
    Affiliate & Referral Enablement
    Payments Overview
    PaymentConductor
    SubscriptionConductor
    VideoConductor
    News Module - Digital Newspaper Experience
    Member Blogs
    Public Profile Pages
    Username Reservation System
    Scientific Editor
    Locale System
    Security & Compliance
    NFT Marketplace
    Token Staking System
    Performance Optimization Patterns
    Mobile Experience
    Wallet
    Wallet Security Tips
    API
    Authentication
    Email AI-CRM API
    Entities
    Opportunities
    Messaging API
    Notifications API
    Wallet API
    Store API
    Admin API
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Branding
    Themes
    Web3
    Token launch jurisdictions
    Deployment
    Self-hosted deployment
    Vercel
    Docker
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Development
    Local Setup
    Code Structure
    Documentation components
    Community tooling
    Ring MCP Server
    Generative Images (ImageConductor)
    Autonomous Newsroom (Grok)
    OSS vs enterprise
    Whitelabel Navigation
    Best Practices
    Workflow
    Code Style
    Performance
    Testing
    Deployment
    Debugging
    Contributing
    MCP
    ring-image-create
    ring-video-create
    Examples
    Quick Start
    White Label
    Real World
    Integrations
    Ethereum wallets (Wagmi v3)

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Architecture
    Data Model
    Real Time
    Discovery Mutation Sync
    Security
    Backend Services
    k8s-postgres-fcm Mode
    Firebase Integration
    Features
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Tunnel Protocol
    Wallet & Credit System
    Multi-Vendor Store
    Referral Codes (Refcodes)
    Affiliate & Referral Enablement
    Payments Overview
    PaymentConductor
    SubscriptionConductor
    VideoConductor
    News Module - Digital Newspaper Experience
    Member Blogs
    Public Profile Pages
    Username Reservation System
    Scientific Editor
    Locale System
    Security & Compliance
    NFT Marketplace
    Token Staking System
    Performance Optimization Patterns
    Mobile Experience
    Wallet
    Wallet Security Tips
    API
    Authentication
    Email AI-CRM API
    Entities
    Opportunities
    Messaging API
    Notifications API
    Wallet API
    Store API
    Admin API
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Branding
    Themes
    Web3
    Token launch jurisdictions
    Deployment
    Self-hosted deployment
    Vercel
    Docker
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Development
    Local Setup
    Code Structure
    Documentation components
    Community tooling
    Ring MCP Server
    Generative Images (ImageConductor)
    Autonomous Newsroom (Grok)
    OSS vs enterprise
    Whitelabel Navigation
    Best Practices
    Workflow
    Code Style
    Performance
    Testing
    Deployment
    Debugging
    Contributing
    MCP
    ring-image-create
    ring-video-create
    Examples
    Quick Start
    White Label
    Real World
    Integrations
    Ethereum wallets (Wagmi v3)

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)
    Docs
    Architecture
    Docs
    Architecture
    Docs
    Architecture

    PaymentConductor architecture

    PaymentConductor v1 (2026-05-22) is Ring Platform's config-driven payment layer. One PostgreSQL ledger (payment_transactions) and one webhook dispatcher serve store checkout, membership upgrades, news promotion, and optional wallet top-up.

    Operator setup: Payment integration · Environment — PaymentConductor

    Operator guide

    PSP dashboards and env vars

    Feature overview

    Purposes and rails

    Docs components

    MDX authoring reference

    Request flow

    Core modules

    ModulePathResponsibility
    Conductorlib/payments/conductor/payment-conductor.tscreateCheckout, handleWebhook, transaction lookup
    Dispatcherlib/payments/conductor/webhook-dispatcher.tsVerify PSP payloads; route to purpose handlers
    Typeslib/payments/conductor/types.tsPaymentPurpose, PaymentRail, PaymentProcessorId, statuses
    Order referenceslib/payments/order-reference.tsBuild / parse idempotent orderReference strings
    Ledger servicelib/payments/payment-transaction-service.tsCRUD on payment_transactions
    Configlib/payments/payment.config.tsgetPaymentProvider, isRailEnabled, webhook URL helpers

    Purpose handlers

    PurposeHandler file
    store_orderconductor/handlers/store-order.ts
    membership_upgradeconductor/handlers/membership-upgrade.ts
    news_promotionconductor/handlers/news-promotion.ts

    Processors

    ProcessorFileRail
    WayForPayprocessors/wayforpay.processor.tsmerchant_redirect
    Stripeprocessors/stripe.processor.tsmerchant_redirect
    Internal creditprocessors/internal-credit.processor.tsinternal_credit

    Signature verification: processors/wayforpay-verify.ts (store vs generic membership/news), stripe.processor.ts (verifyStripeWebhook).

    Legacy services (lib/payments/wayforpay-service.ts, wayforpay-store-service.ts) remain for specialized store/membership helpers; new flows go through the conductor.

    Types

    CreateCheckoutContext carries purpose, optional rail, userId, amount, currency, returnUrl, and purpose-specific fields (orderId, articleId, targetRole, etc.).

    Configuration surface

    lib/payments/payment.config.ts:

    • getPaymentProvider(purpose) — resolves WayForPay vs Stripe from env overrides
    • getProcessorForPurpose(purpose) — alias of above
    • isRailEnabled(purpose, rail) — credit / token gates
    • getDefaultStoreCurrencySymbol() — PAYMENT_FIAT_CURRENCY (default USD)
    • canSpendCreditForOrderCurrency(orderCurrency) — PAYMENT_CREDIT_ACCEPT_ORDER_CURRENCY
    • getWebhookUrl(provider) — ${site}/api/payments/${provider}/webhook

    Env keys per purpose: PAYMENT_STORE_PROCESSOR, PAYMENT_MEMBERSHIP_PROCESSOR, PAYMENT_NEWS_PROCESSOR, PAYMENT_WALLET_TOPUP_PROCESSOR. Default: PAYMENT_DEFAULT_PROCESSOR (wayforpay | stripe).

    Order reference prefixes

    Stable orderReference values tie PSP callbacks to domain entities. Webhook dispatcher parses prefix before invoking handlers.

    PurposePatternExample
    store_orderstore_{orderId}_{timestamp}store_ord_abc_1717000000000
    membership_upgrademembership_{userId}_{timestamp}membership_user123_1717000000000
    membership_upgrade (legacy)ring_{userId}_{timestamp}still accepted
    news_promotionnews-promo-{base64url(articleId)}-{timestamp}news-promo-YWJj-1717000000000

    buildOrderReference / parseOrderReference in order-reference.ts. Duplicate webhook delivery is safe: ledger enforces unique order_reference.

    Ledger (payment_transactions)

    Migration: data/migrations/004_payment_transactions.sql

    JSON data fields (via payment-transaction-service.ts):

    • purpose, processor, rail, order_reference
    • entity_type, entity_id, user_id
    • amount_minor, currency, status, status_history
    • processor_payload, paid_at, timestamps

    createPending returns existing row if order_reference already exists — idempotent checkout creation.

    Webhook dispatcher

    1. 1

      WayForPay — dispatchWayForPayWebhook: parse orderReference → verify signature (store vs generic) → purpose handler → membership returns WayForPay ACK.

    2. 2

      Stripe — dispatchStripeWebhook: verify stripe-signature → read metadata.purpose → handleNewsStripeWebhook on checkout.session.completed.

    3. 3

      Canonical routes: app/api/payments/wayforpay/webhook/route.ts, app/api/payments/stripe/webhook/route.ts.

    API routes

    MethodPathRole
    POST/api/payments/wayforpay/webhookUnified WayForPay callback
    POST/api/payments/stripe/webhookStripe signed events
    POST/api/store/payments/wayforpayStore redirect checkout
    GET/api/store/payments/[orderId]/statusPoll status
    POST/api/store/payments/creditInternal credit
    POST/api/membership/payment/tokenRING membership
    POST/api/news/promotion/submitNews promotion checkout

    PaymentConductor API

    createCheckout resolves processor from ctx.rail (internal credit) or getPaymentProvider(ctx.purpose), then delegates to the matching processor. Processors write ledger rows before returning redirect URLs.

    Security notes

    • Never store raw card numbers — hosted PSP checkout only
    • WayForPay: HMAC / merchant signature verification per flow (store vs generic)
    • Stripe: stripe-signature header + STRIPE_WEBHOOK_SECRET
    • Webhook handlers return PSP-expected ACK bodies (WayForPay accept JSON for membership)
    • Internal credit routes require authenticated session + order ownership checks

    Related

    Payment integration

    Operator PSP setup

    Payments feature

    User-facing flows

    Migrations

    Migration 004 ledger

    PaymentConductor architecture

    PaymentConductor v1 (2026-05-22) is Ring Platform's config-driven payment layer. One PostgreSQL ledger (payment_transactions) and one webhook dispatcher serve store checkout, membership upgrades, news promotion, and optional wallet top-up.

    Operator setup: Payment integration · Environment — PaymentConductor

    Operator guide

    PSP dashboards and env vars

    Feature overview

    Purposes and rails

    Docs components

    MDX authoring reference

    Request flow

    Core modules

    ModulePathResponsibility
    Conductorlib/payments/conductor/payment-conductor.tscreateCheckout, handleWebhook, transaction lookup
    Dispatcherlib/payments/conductor/webhook-dispatcher.tsVerify PSP payloads; route to purpose handlers
    Typeslib/payments/conductor/types.tsPaymentPurpose, PaymentRail, PaymentProcessorId, statuses
    Order referenceslib/payments/order-reference.tsBuild / parse idempotent orderReference strings
    Ledger servicelib/payments/payment-transaction-service.tsCRUD on payment_transactions
    Configlib/payments/payment.config.tsgetPaymentProvider, isRailEnabled, webhook URL helpers

    Purpose handlers

    PurposeHandler file
    store_orderconductor/handlers/store-order.ts
    membership_upgradeconductor/handlers/membership-upgrade.ts
    news_promotionconductor/handlers/news-promotion.ts

    Processors

    ProcessorFileRail
    WayForPayprocessors/wayforpay.processor.tsmerchant_redirect
    Stripeprocessors/stripe.processor.tsmerchant_redirect
    Internal creditprocessors/internal-credit.processor.tsinternal_credit

    Signature verification: processors/wayforpay-verify.ts (store vs generic membership/news), stripe.processor.ts (verifyStripeWebhook).

    Legacy services (lib/payments/wayforpay-service.ts, wayforpay-store-service.ts) remain for specialized store/membership helpers; new flows go through the conductor.

    Types

    CreateCheckoutContext carries purpose, optional rail, userId, amount, currency, returnUrl, and purpose-specific fields (orderId, articleId, targetRole, etc.).

    Configuration surface

    lib/payments/payment.config.ts:

    • getPaymentProvider(purpose) — resolves WayForPay vs Stripe from env overrides
    • getProcessorForPurpose(purpose) — alias of above
    • isRailEnabled(purpose, rail) — credit / token gates
    • getDefaultStoreCurrencySymbol() — PAYMENT_FIAT_CURRENCY (default USD)
    • canSpendCreditForOrderCurrency(orderCurrency) — PAYMENT_CREDIT_ACCEPT_ORDER_CURRENCY
    • getWebhookUrl(provider) — ${site}/api/payments/${provider}/webhook

    Env keys per purpose: PAYMENT_STORE_PROCESSOR, PAYMENT_MEMBERSHIP_PROCESSOR, PAYMENT_NEWS_PROCESSOR, PAYMENT_WALLET_TOPUP_PROCESSOR. Default: PAYMENT_DEFAULT_PROCESSOR (wayforpay | stripe).

    Order reference prefixes

    Stable orderReference values tie PSP callbacks to domain entities. Webhook dispatcher parses prefix before invoking handlers.

    PurposePatternExample
    store_orderstore_{orderId}_{timestamp}store_ord_abc_1717000000000
    membership_upgrademembership_{userId}_{timestamp}membership_user123_1717000000000
    membership_upgrade (legacy)ring_{userId}_{timestamp}still accepted
    news_promotionnews-promo-{base64url(articleId)}-{timestamp}news-promo-YWJj-1717000000000

    buildOrderReference / parseOrderReference in order-reference.ts. Duplicate webhook delivery is safe: ledger enforces unique order_reference.

    Ledger (payment_transactions)

    Migration: data/migrations/004_payment_transactions.sql

    JSON data fields (via payment-transaction-service.ts):

    • purpose, processor, rail, order_reference
    • entity_type, entity_id, user_id
    • amount_minor, currency, status, status_history
    • processor_payload, paid_at, timestamps

    createPending returns existing row if order_reference already exists — idempotent checkout creation.

    Webhook dispatcher

    1. 1

      WayForPay — dispatchWayForPayWebhook: parse orderReference → verify signature (store vs generic) → purpose handler → membership returns WayForPay ACK.

    2. 2

      Stripe — dispatchStripeWebhook: verify stripe-signature → read metadata.purpose → handleNewsStripeWebhook on checkout.session.completed.

    3. 3

      Canonical routes: app/api/payments/wayforpay/webhook/route.ts, app/api/payments/stripe/webhook/route.ts.

    API routes

    MethodPathRole
    POST/api/payments/wayforpay/webhookUnified WayForPay callback
    POST/api/payments/stripe/webhookStripe signed events
    POST/api/store/payments/wayforpayStore redirect checkout
    GET/api/store/payments/[orderId]/statusPoll status
    POST/api/store/payments/creditInternal credit
    POST/api/membership/payment/tokenRING membership
    POST/api/news/promotion/submitNews promotion checkout

    PaymentConductor API

    createCheckout resolves processor from ctx.rail (internal credit) or getPaymentProvider(ctx.purpose), then delegates to the matching processor. Processors write ledger rows before returning redirect URLs.

    Security notes

    • Never store raw card numbers — hosted PSP checkout only
    • WayForPay: HMAC / merchant signature verification per flow (store vs generic)
    • Stripe: stripe-signature header + STRIPE_WEBHOOK_SECRET
    • Webhook handlers return PSP-expected ACK bodies (WayForPay accept JSON for membership)
    • Internal credit routes require authenticated session + order ownership checks

    Related

    Payment integration

    Operator PSP setup

    Payments feature

    User-facing flows

    Migrations

    Migration 004 ledger

    PaymentConductor architecture

    PaymentConductor v1 (2026-05-22) is Ring Platform's config-driven payment layer. One PostgreSQL ledger (payment_transactions) and one webhook dispatcher serve store checkout, membership upgrades, news promotion, and optional wallet top-up.

    Operator setup: Payment integration · Environment — PaymentConductor

    Operator guide

    PSP dashboards and env vars

    Feature overview

    Purposes and rails

    Docs components

    MDX authoring reference

    Request flow

    Core modules

    ModulePathResponsibility
    Conductorlib/payments/conductor/payment-conductor.tscreateCheckout, handleWebhook, transaction lookup
    Dispatcherlib/payments/conductor/webhook-dispatcher.tsVerify PSP payloads; route to purpose handlers
    Typeslib/payments/conductor/types.tsPaymentPurpose, PaymentRail, PaymentProcessorId, statuses
    Order referenceslib/payments/order-reference.tsBuild / parse idempotent orderReference strings
    Ledger servicelib/payments/payment-transaction-service.tsCRUD on payment_transactions
    Configlib/payments/payment.config.tsgetPaymentProvider, isRailEnabled, webhook URL helpers

    Purpose handlers

    PurposeHandler file
    store_orderconductor/handlers/store-order.ts
    membership_upgradeconductor/handlers/membership-upgrade.ts
    news_promotionconductor/handlers/news-promotion.ts

    Processors

    ProcessorFileRail
    WayForPayprocessors/wayforpay.processor.tsmerchant_redirect
    Stripeprocessors/stripe.processor.tsmerchant_redirect
    Internal creditprocessors/internal-credit.processor.tsinternal_credit

    Signature verification: processors/wayforpay-verify.ts (store vs generic membership/news), stripe.processor.ts (verifyStripeWebhook).

    Legacy services (lib/payments/wayforpay-service.ts, wayforpay-store-service.ts) remain for specialized store/membership helpers; new flows go through the conductor.

    Types

    CreateCheckoutContext carries purpose, optional rail, userId, amount, currency, returnUrl, and purpose-specific fields (orderId, articleId, targetRole, etc.).

    Configuration surface

    lib/payments/payment.config.ts:

    • getPaymentProvider(purpose) — resolves WayForPay vs Stripe from env overrides
    • getProcessorForPurpose(purpose) — alias of above
    • isRailEnabled(purpose, rail) — credit / token gates
    • getDefaultStoreCurrencySymbol() — PAYMENT_FIAT_CURRENCY (default USD)
    • canSpendCreditForOrderCurrency(orderCurrency) — PAYMENT_CREDIT_ACCEPT_ORDER_CURRENCY
    • getWebhookUrl(provider) — ${site}/api/payments/${provider}/webhook

    Env keys per purpose: PAYMENT_STORE_PROCESSOR, PAYMENT_MEMBERSHIP_PROCESSOR, PAYMENT_NEWS_PROCESSOR, PAYMENT_WALLET_TOPUP_PROCESSOR. Default: PAYMENT_DEFAULT_PROCESSOR (wayforpay | stripe).

    Order reference prefixes

    Stable orderReference values tie PSP callbacks to domain entities. Webhook dispatcher parses prefix before invoking handlers.

    PurposePatternExample
    store_orderstore_{orderId}_{timestamp}store_ord_abc_1717000000000
    membership_upgrademembership_{userId}_{timestamp}membership_user123_1717000000000
    membership_upgrade (legacy)ring_{userId}_{timestamp}still accepted
    news_promotionnews-promo-{base64url(articleId)}-{timestamp}news-promo-YWJj-1717000000000

    buildOrderReference / parseOrderReference in order-reference.ts. Duplicate webhook delivery is safe: ledger enforces unique order_reference.

    Ledger (payment_transactions)

    Migration: data/migrations/004_payment_transactions.sql

    JSON data fields (via payment-transaction-service.ts):

    • purpose, processor, rail, order_reference
    • entity_type, entity_id, user_id
    • amount_minor, currency, status, status_history
    • processor_payload, paid_at, timestamps

    createPending returns existing row if order_reference already exists — idempotent checkout creation.

    Webhook dispatcher

    1. 1

      WayForPay — dispatchWayForPayWebhook: parse orderReference → verify signature (store vs generic) → purpose handler → membership returns WayForPay ACK.

    2. 2

      Stripe — dispatchStripeWebhook: verify stripe-signature → read metadata.purpose → handleNewsStripeWebhook on checkout.session.completed.

    3. 3

      Canonical routes: app/api/payments/wayforpay/webhook/route.ts, app/api/payments/stripe/webhook/route.ts.

    API routes

    MethodPathRole
    POST/api/payments/wayforpay/webhookUnified WayForPay callback
    POST/api/payments/stripe/webhookStripe signed events
    POST/api/store/payments/wayforpayStore redirect checkout
    GET/api/store/payments/[orderId]/statusPoll status
    POST/api/store/payments/creditInternal credit
    POST/api/membership/payment/tokenRING membership
    POST/api/news/promotion/submitNews promotion checkout

    PaymentConductor API

    createCheckout resolves processor from ctx.rail (internal credit) or getPaymentProvider(ctx.purpose), then delegates to the matching processor. Processors write ledger rows before returning redirect URLs.

    Security notes

    • Never store raw card numbers — hosted PSP checkout only
    • WayForPay: HMAC / merchant signature verification per flow (store vs generic)
    • Stripe: stripe-signature header + STRIPE_WEBHOOK_SECRET
    • Webhook handlers return PSP-expected ACK bodies (WayForPay accept JSON for membership)
    • Internal credit routes require authenticated session + order ownership checks

    Related

    Payment integration

    Operator PSP setup

    Payments feature

    User-facing flows

    Migrations

    Migration 004 ledger