Letting Customers Set Their Own USDC Billing Caps: Tradeoffs and Examples
Explore the pros and cons of letting customers set their own recurring USDC payment caps in onchain billing. See real examples and learn about implementation tradeoffs.

Stablecoin billing needs a balance between flexibility for customers and predictable cash flow for merchants. In onchain USDC recurring billing, payment caps define the maximum a merchant can collect in a single period, based on a signed approval. The default is for the merchant to set this cap. But some teams consider letting customers choose for themselves. This has both upsides and real tradeoffs.
Why Consider Customer-Selected Caps?
Merchants sometimes want to give customers more control. This can increase trust and reduce friction for onboarding. A user might want to limit exposure, or simply pay a lower tier. Sometimes, compliance teams want to avoid asking for blanket approvals, even if they are capped. Letting the customer set their spending limit can address these cases.
There are business reasons too. A self-serve SaaS might let users select from multiple plans, each with a different USDC limit. A B2B service could let an operator set a monthly budget, with overage handled by manual top-up.
Mechanics: How Would This Work?
The approval step is the key difference. In a typical onchain recurring billing flow, the merchant proposes a cap, say, 100 USDC per month. The customer signs an approval (ERC-20 approve() or a permit) for this cap. The merchant can then collect up to this amount per period, but never more.
If you let the customer pick the cap, the UI changes. At checkout or in the customer portal, the user enters the maximum they want to allow. The backend then generates the approval transaction with this amount. The rest of the flow is unchanged: collection can never exceed the approved cap, and a new approval is needed if the customer wants to increase it.
Worked Example: SaaS with Customer-Set Caps
Suppose you run a SaaS that offers three plans:
- Basic: 10 USDC/month
- Pro: 40 USDC/month
- Custom: customer picks any cap, minimum 20 USDC/month
A customer selects the Custom plan and sets their own cap at 30 USDC/month. The onboarding flow generates an approval for 30 USDC. Your collection logic can only pull up to 30 USDC per period. If the customer later wants to upgrade to a higher tier, you must prompt for a new approval. If usage exceeds 30 USDC, you cannot bill for the excess until the customer signs a new cap.
No funds are ever held by the billing platform. Each collection moves USDC from the customer’s wallet to your settlement address. There are no reversals if a collection succeeds. If the customer’s wallet balance is below the cap, you can only collect what is available, this is true regardless of who set the cap.
Code: Approval Generation with Customer-Selected Cap
For a developer, the only code change is to parameterize the cap amount.
// Assume customerCap is user input, validated for min/max
const tx = usdcContract.methods.approve(
merchantSettlementAddress,
customerCap // e.g., 30 * 1e6 for 30 USDC
)
Advantages for Customers
- Transparency: The user sees and chooses the maximum exposure.
- Control: Customers can align the cap with their own budget or risk tolerance.
- Reduced onboarding friction: Some users are more willing to approve when they pick the limit.
Tradeoffs for Merchants
- Unpredictable revenue: If customers pick low caps, you risk under-collection. This can hurt cash flow, especially for usage-based services.
- Upgrade friction: Raising the cap requires a new signature. Some users will drop off at this step.
- Edge cases: Customers can set the cap below the minimum needed for their plan. Your UI must prevent this or handle failed payments gracefully.
Handling Edge Cases
Say a customer sets a cap of 7 USDC/month, below your Basic plan. Your onboarding flow should enforce minimums. If a customer tries to upgrade but does not sign a higher cap, they cannot access the new tier. For usage-based billing, if the customer’s cap is spent before the period ends, you must notify them and prompt for a new approval.
Security and UX Considerations
Letting customers set their own cap never increases risk for the customer, but it can increase support burden. Some users may set a cap that is too low, then expect uninterrupted service. Others may misunderstand how onchain approvals work. Clear UI and reminders help. The approval must always state the exact cap, the recipient, and the period.
For the merchant, caps set by the customer are just as secure as those set by you. No more than the approved amount can ever be collected. There is no way to transfer funds beyond the cap without a new signature.
When to Allow Customer-Selected Caps
This pattern fits best when:
- You have variable pricing or usage-based plans
- Compliance or onboarding friction are key concerns
- You want to offer a sense of control to end users
It is less useful for flat-rate SaaS where a single price point is the norm. In those cases, letting customers set their own cap mostly adds UI complexity.
We support both approaches at Reclack. Our approval flows always require a signed, bounded cap, never an unlimited approval. You can set the cap in your product, or let the customer pick within your constraints. Every transaction moves funds directly from the customer’s wallet to your settlement address, with no custody or reversals. This gives both sides clarity and control.


