Concepts, value, and typical clone scenarios — less code.
Concepts, value, and typical clone scenarios — less code.
Preparing Ring content
Preparing Ring content
Preparing Ring content
Use Founder / Developer tabs in the docs sidebar to filter this page. Member-facing flows render at /membership; this article documents the tiers, pricing, and payment rails.
Membership is how a Ring clone distinguishes community tiers and monetizes access. The role ladder is the SSOT (features/auth/user-role.ts), upgrade pricing is config-driven (lib/membership/pricing.ts), and every payment — card, credit balance, PayPal, or native token — flows through PaymentConductor.
| Role | Meaning |
|---|---|
visitor | Non-authenticated, viewing-only |
subscriber | Paying basic subscriber — baseline community access |
member | Elevated status with more access |
confidential | Access to confidential resources |
admin | Platform admin |
superadmin | Top-level platform admin |
Upgrades move a user from subscriber → member. confidential tier config explicitly requires the confidential role.
membership.ring.memberUpgradeAmount), yearly gets 20% off monthly × 12, and live quotes use the desk oracle so the billed amount matches the quote.MEMBERSHIP_DESK_CREDIT_HINT_MIN), the UI hints the Token Desk swap instead of buying credit.membership.ring amounts and the member tier config in ring-config.json.Deep-dive: the credit ledger and two-rate SSOT membership payments settle into.
Depends-on: card, PayPal, and token rails all run through PaymentConductor.
Same-workflow: renewal lifecycle and cancellation handling.
See-also: how credit_balance and the subscription ledger live in the JSONB schema.
Use Founder / Developer tabs in the docs sidebar to filter this page. Member-facing flows render at /membership; this article documents the tiers, pricing, and payment rails.
Membership is how a Ring clone distinguishes community tiers and monetizes access. The role ladder is the SSOT (features/auth/user-role.ts), upgrade pricing is config-driven (lib/membership/pricing.ts), and every payment — card, credit balance, PayPal, or native token — flows through PaymentConductor.
| Role | Meaning |
|---|---|
visitor | Non-authenticated, viewing-only |
subscriber | Paying basic subscriber — baseline community access |
member | Elevated status with more access |
confidential | Access to confidential resources |
admin | Platform admin |
superadmin | Top-level platform admin |
Upgrades move a user from subscriber → member. confidential tier config explicitly requires the confidential role.
membership.ring.memberUpgradeAmount), yearly gets 20% off monthly × 12, and live quotes use the desk oracle so the billed amount matches the quote.MEMBERSHIP_DESK_CREDIT_HINT_MIN), the UI hints the Token Desk swap instead of buying credit.membership.ring amounts and the member tier config in ring-config.json.Deep-dive: the credit ledger and two-rate SSOT membership payments settle into.
Depends-on: card, PayPal, and token rails all run through PaymentConductor.
Same-workflow: renewal lifecycle and cancellation handling.
See-also: how credit_balance and the subscription ledger live in the JSONB schema.
Use Founder / Developer tabs in the docs sidebar to filter this page. Member-facing flows render at /membership; this article documents the tiers, pricing, and payment rails.
Membership is how a Ring clone distinguishes community tiers and monetizes access. The role ladder is the SSOT (features/auth/user-role.ts), upgrade pricing is config-driven (lib/membership/pricing.ts), and every payment — card, credit balance, PayPal, or native token — flows through PaymentConductor.
| Role | Meaning |
|---|---|
visitor | Non-authenticated, viewing-only |
subscriber | Paying basic subscriber — baseline community access |
member | Elevated status with more access |
confidential | Access to confidential resources |
admin | Platform admin |
superadmin | Top-level platform admin |
Upgrades move a user from subscriber → member. confidential tier config explicitly requires the confidential role.
membership.ring.memberUpgradeAmount), yearly gets 20% off monthly × 12, and live quotes use the desk oracle so the billed amount matches the quote.MEMBERSHIP_DESK_CREDIT_HINT_MIN), the UI hints the Token Desk swap instead of buying credit.membership.ring amounts and the member tier config in ring-config.json.Deep-dive: the credit ledger and two-rate SSOT membership payments settle into.
Depends-on: card, PayPal, and token rails all run through PaymentConductor.
Same-workflow: renewal lifecycle and cancellation handling.
See-also: how credit_balance and the subscription ledger live in the JSONB schema.
| Purpose |
|---|
/api/membership/payment/card | POST, GET | Card checkout for membership |
/api/membership/payment/credit | POST, GET | Credit-balance payment path |
/api/membership/payment/paypal | POST, GET | PayPal checkout |
/api/membership/payment/token | POST, GET | Native token payment |
/api/membership/subscription/create | POST | Create a subscription |
/api/membership/subscription/status | GET | Read subscription status |
/api/membership/subscription/cancel | POST, GET | Cancel a subscription |
Where money lands
Paid upgrades write to the subscription ledger (subscription_ledger) — the credit_balance provider marks credit-paid renewals (next_payment_due indexed in data/schema.sql). Credit itself lives on the user record (users.data.credit_balance), with wallet transactions as the audit trail (features/wallet/services/credit-balance-service.ts).
Billing periods
MembershipBillingPeriod = 'monthly' | 'yearly'. Yearly cost = annualUpgradeAmount when set, otherwise monthly × 12 × 0.8 (20% off). Tier shape: MemberTierConfig { amount, currency, description, duration }.
| Purpose |
|---|
/api/membership/payment/card | POST, GET | Card checkout for membership |
/api/membership/payment/credit | POST, GET | Credit-balance payment path |
/api/membership/payment/paypal | POST, GET | PayPal checkout |
/api/membership/payment/token | POST, GET | Native token payment |
/api/membership/subscription/create | POST | Create a subscription |
/api/membership/subscription/status | GET | Read subscription status |
/api/membership/subscription/cancel | POST, GET | Cancel a subscription |
Where money lands
Paid upgrades write to the subscription ledger (subscription_ledger) — the credit_balance provider marks credit-paid renewals (next_payment_due indexed in data/schema.sql). Credit itself lives on the user record (users.data.credit_balance), with wallet transactions as the audit trail (features/wallet/services/credit-balance-service.ts).
Billing periods
MembershipBillingPeriod = 'monthly' | 'yearly'. Yearly cost = annualUpgradeAmount when set, otherwise monthly × 12 × 0.8 (20% off). Tier shape: MemberTierConfig { amount, currency, description, duration }.
| Purpose |
|---|
/api/membership/payment/card | POST, GET | Card checkout for membership |
/api/membership/payment/credit | POST, GET | Credit-balance payment path |
/api/membership/payment/paypal | POST, GET | PayPal checkout |
/api/membership/payment/token | POST, GET | Native token payment |
/api/membership/subscription/create | POST | Create a subscription |
/api/membership/subscription/status | GET | Read subscription status |
/api/membership/subscription/cancel | POST, GET | Cancel a subscription |
Where money lands
Paid upgrades write to the subscription ledger (subscription_ledger) — the credit_balance provider marks credit-paid renewals (next_payment_due indexed in data/schema.sql). Credit itself lives on the user record (users.data.credit_balance), with wallet transactions as the audit trail (features/wallet/services/credit-balance-service.ts).
Billing periods
MembershipBillingPeriod = 'monthly' | 'yearly'. Yearly cost = annualUpgradeAmount when set, otherwise monthly × 12 × 0.8 (20% off). Tier shape: MemberTierConfig { amount, currency, description, duration }.