Use this file to discover all available pages before exploring further.
If a user hits a usage limit you granted them, they may be willing to purchase a top-up.These are typically one-time purchases (but can also be recurring add-ons) that grant a fixed usage of a feature.This gives users full spend control and allows your business to be paid upfront. For these reasons, it tends to be a more popular alternative to usage-based pricing — eg, OpenAI uses this model for their API.
Free Plan
Create a free plan, and assign 10 messages to it. We’ll add an interval of “month”, so that the user is granted 10 periodically.
Make sure to set the auto-enable flag on the free plan, so that it is automatically assigned to new customers.
Top up Plan
Now we’ll create our top-up plan. Again, we’ll assign the messages feature, but this time with a prepaid price of $10 per 100 messages.Since these messages have interval “one-off”, the messages will last forever (unlike our Free plan messages, which reset every month).Features with a prepaid price require a quantity to be passed in when a customer purchases the plan, so the customer can specify how many messages they want to top up with.
When users run out of messages, they can purchase additional messages using our top-up plan. In this example, the user is purchasing 200 premium messages, which will cost them $20.
You can display to the user by getting balances from the customer method. Under the customer.features record, you’ll be able to retrieve a current balance, total granted, and a breakdown of their monthly vs top-up messages.
import { useCustomer } from "autumn-js/react";const { customer } = useCustomer();const messages = customer?.features?.messages;// Get breakdown of monthly vs prepaid balancesconst monthlyBalance = messages?.breakdown?.find( (b) => b.interval === "month");const prepaidBalance = messages?.breakdown?.find( (b) => b.interval === "lifetime");// Display both balances to the userreturn ( <div> <p>Monthly: {monthlyBalance?.balance ?? 0} remaining</p> <p>Prepaid: {prepaidBalance?.balance ?? 0} remaining</p> <p>Total: {messages?.balance ?? 0} messages available</p> </div>);