Frequently asked questions
Which browsers are supported?
Which browsers are supported?
crxbase works with any Chromium-based browser (Chrome, Edge, Brave, Arc, etc.) and Firefox.
Does it work with extension frameworks like WXT or Plasmo?
Does it work with extension frameworks like WXT or Plasmo?
Yes. The
@crxbase/payments library works in any environment — WXT, Plasmo, vanilla Manifest V3, or any other framework. Import and use it in your
background script, content script, or popup.What is the platform fee?
What is the platform fee?
crxbase charges a 5% fee on each transaction. This is deducted automatically by Stripe during payment processing.
Can users have multiple plans?
Can users have multiple plans?
Users can have one active recurring subscription (monthly or yearly) across all tiers, plus one lifetime purchase per tier. A lifetime purchase at a
given tier blocks new subscriptions in the same tier or a lower tier. See plan switching for the full interaction rules.
How long do user sessions last?
How long do user sessions last?
Sessions last 90 days. After that,
getUser() returns null and the user needs to log in again. See authentication
for details.What happens when a subscription payment fails?
What happens when a subscription payment fails?
The plan status changes to
past_due and Stripe retries the payment automatically. After multiple failures, the subscription is canceled. Users can update their payment method through the Stripe portal (client.openManagePage()).Troubleshooting
getUser() returns null for a logged-in user
getUser() returns null for a logged-in user
The user’s session has likely expired (90 days) or they were signed out. Call
client.openLoginPage() to prompt the user to log in again.OTP code not working
OTP code not working
OTP codes expire after 10 minutes. There is also a rate limit of 5 OTP requests per 10 minutes per email. If the code has expired, the user should
request a new one.
RATE_LIMITED error
RATE_LIMITED error
The API allows a maximum of 2 requests per second. Add delays between requests or reduce polling frequency. Handle the error:Match the exact string from Error handling when checking
error.name.Plan status shows past_due or unpaid
Plan status shows past_due or unpaid
past_due— a renewal payment failed but Stripe is still retrying.unpaid— payment failed at checkout before the subscription became active.

