Skip to main content

Frequently asked questions

crxbase works with any Chromium-based browser (Chrome, Edge, Brave, Arc, etc.) and Firefox.
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.
crxbase charges a 5% fee on each transaction. This is deducted automatically by Stripe during payment processing.
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.
Sessions last 90 days. After that, getUser() returns null and the user needs to log in again. See authentication for details.
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

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 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.
The API allows a maximum of 2 requests per second. Add delays between requests or reduce polling frequency. Handle the error:
try {
  const user = await client.getUser();
} catch (error: any) {
    if (error?.name === "rate_limited") {
    // Wait and retry after a delay
  }
}
Match the exact string from Error handling when checking error.name.
  • past_due — a renewal payment failed but Stripe is still retrying.
  • unpaid — payment failed at checkout before the subscription became active.
Direct the user to update their payment method:
client.openManagePage();

Need help?

Contact us at support@crxbase.com.