The Session Expiry Problem
20 minutes is usually enough for a motivated customer. But real users get interrupted — a phone call, a slow exchange withdrawal, or a hesitant first-time crypto user. A hard "session expired" page loses sales that could be recovered.
Pattern 1: One-Click Renewal
When the countdown hits zero, instead of showing an error, show a "Renew Session" button. This calls your backend to start a fresh session for the same order. The new address is different from the old one.
async function renewSession(orderId) {
// Clean up old session in your DB
await db.query('UPDATE orders SET session_id = NULL WHERE id = $1', [orderId]);
// Create new session
const session = await paychainly.createSession({
userId: String(orderId),
amount: order.totalUsdt,
});
return session;
}Pattern 2: Late Payment Handling
What if the customer pays after the session officially expires in your system, but the deposit address still receives funds? Paychainly detects deposits regardless of your session state — the webhook fires anyway.
Your webhook handler should check the txHash for a pending order even if the session is marked expired. If found, fulfill the order and mark it paid.
Pattern 3: Persistent Cart + Email Recovery
For high-value orders, send a recovery email when a session expires without payment. Include a new payment link. This is the highest-converting recovery strategy for hesitant buyers.
Communicating Urgency
Show a visible countdown timer starting from 20:00. At 5 minutes, change the timer color to amber. At 2 minutes, red. This creates appropriate urgency without being annoying for customers who pay quickly.