Copywriting and CTAs for SaaS flows·

The Decline Screen Is Your Second-Best Checkout Page: A Copy Teardown for Failed Payments

The Decline Screen Is Your Second-Best Checkout Page: A Copy Teardown for Failed Payments

Most SaaS checkout copy stops at the pay button. But when payment fails, you get a second chance to close the sale. Most teams waste it with a red box that says 'Payment failed' and a generic 'Try again' button. That is not an error state. It is a checkout page with worse hierarchy, worse trust, and worse guidance.

Your failed-payment screen is a checkout page, not an error state

When a card is declined, the buyer is still committed. They want the thing. The decline creates anxiety: Did I get charged? Is my card broken? Is this a scam? Your copy has to answer those questions before the user decides to leave.

  • Clarity: Say what happened in plain language. No codes, no 'transaction declined by issuer'.
  • Trust: Confirm whether the charge went through. If it did not, say so.
  • Guidance: Give one primary next step and one escape hatch.
  • Hierarchy: The retry CTA should be the most prominent thing on the screen, not the error text.

This is a classic Nielsen-style heuristic moment: visibility of system status, match between system and real world, and error recovery. Not a checklist. A moment where copy decides whether the buyer tries again.

The three questions a decline screen must answer in 3 seconds

  1. What happened? 'Your bank declined the card ending in 4242.'
  2. What do I do now? 'Try another card' or 'Contact your bank.'
  3. Will I be charged? 'You have not been charged.'

If your screen answers only the first question, you are asking the buyer to do detective work. They will not.

Before/after: rewriting the decline message and retry CTA

Here is the same failed payment, written two ways.

BeforeAfterWhy it works
Headline: Payment failed. Error code: card_declined.Headline: Your bank declined the card ending in 4242. You have not been charged.Names the card, removes blame, kills billing anxiety.
CTA: RetryCTA: Try another cardGives a new action instead of repeating a failed one.
Body: Please try again or contact support.Body: If you want to use this card, call the number on the back. Otherwise, add a different card.Splits the path by user intent.

Other common decline reasons, rewritten:

  • Insufficient funds
    • Before: 'Insufficient funds.'
    • After: 'That card was declined for insufficient funds. No charge was made. Try a different card or update your billing details.'
    • CTA: 'Use a different card'
  • Authentication required
    • Before: 'Authentication failed.'
    • After: 'Your bank needs one more step to approve this payment. You have not been charged yet.'
    • CTA: 'Finish bank verification'
  • Expired card
    • Before: 'Invalid card.'
    • After: 'That card expired in 04/24. Update the date or use another card.'
    • CTA: 'Update card details'

If you want to know which failure state is costing you the most, run a free audit on your checkout flow and look at the P0 items first.

Mini playbook: rewrite your decline screen in 20 minutes

  1. Pull your top three decline reasons from your payment provider.
  2. For each one, write a headline that says what happened and whether the buyer was charged.
  3. Write one primary CTA that names the next action. Write one secondary link for the escape hatch.
  4. Delete every error code, internal label, and 'try again'.
  5. Test with a real failed card in test mode. Read the screen out loud. If it sounds like a robot, rewrite it.

What to fix first: P0/P1/P2

P0 — Stop the bleed

  • Replace 'Payment failed' with a plain-language reason.
  • Add 'You have not been charged' when true.
  • Change 'Try again' to a specific CTA like 'Try another card'.

P1 — Reduce repeat failures

  • Name the card last four.
  • Add per-reason copy for insufficient funds, expired card, and authentication.
  • Put the primary CTA above the fold on mobile.

P2 — Recover the almost-lost

  • Add a recovery email with a one-click link back to checkout.
  • Track recovery rate by decline reason.
  • Test a secondary path: 'Contact your bank' vs 'Use a different card'.

The retry CTA is not 'Try again'

'Trying again' asks the buyer to repeat an action that already failed. That is friction disguised as a button. Better options:

  • 'Try another card' — when the card is the problem.
  • 'Update card details' — when the data is the problem.
  • 'Finish bank verification' — when the bank needs a step.
  • 'Contact your bank' — when only the bank can fix it.

Your decline screen is not a dead end. It is a conversion page. Write it with the same care as your pricing page. If you want a prioritized P0/P1/P2 fix list for your own checkout, start a free audit at /signup. You will see exactly which copy and CTA changes to make first.