| Account-creation wall before checkout | ~25% of abandoners cite it directly | Guest default; offer an account post-purchase |
| Coupon field wide open | Users leave to hunt codes; many never return | Collapse behind a "Have a code?" link |
| Surprise shipping/tax at the final step | Top cited abandonment reason (~48%) | Show the estimated total from the cart onward |
| "Submit" / "Continue" on the money button | Ambiguity at the moment of maximum anxiety | "Pay $48.20" with the real amount |
| Wiping form state on error or decline | User must re-type card + address; most won't | Persist all fields through every error path |
| Express pay below the card form | Ready buyers forced through 8 fields first | Express pay first, "or pay with card" divider below |
| First/last/street/apt/city/state/zip all separate and required | 10+ fields of friction | Address autocomplete; a single full-name field |
| Redirect to a third-party page that looks unrelated | Trust collapse mid-payment | Embedded, branded payment (Stripe Elements/Checkout) |
| Double-charge on double-click | Support tickets and chargebacks | Disable on first tap; idempotency keys |
| Generic error: "Payment error (code 402)" | User can't act on it | State the cause and the next step in plain words |
| Pre-checked upsells or insurance in the cart | "Sneak into basket" dark pattern; illegal in the EU | All add-ons opt-in, clearly priced |
| Confirmation page without an order number | Reads as failure; triggers re-orders and support load | Full confirmation anatomy above |
| Validation only on submit, errors listed at the top | User hunts for which field is wrong | Inline on-blur validation beside each field |
| Charging a different amount than the button showed | Chargebacks and lost trust | Re-confirm any price change before charging |
| Required phone number with no stated reason | Perceived data grab; field-level abandonment | Optional, labeled "for delivery updates only" |
| Cart emptied on session expiry | Return visitors start from zero | Persist carts server-side (signed-in) or in local storage |
| Shipping options without delivery dates | User can't trade cost against time | "Arrives Thu, Jul 16" on every option |
| Express-pay-only checkout | Wallet failure strands the purchase | Card form always available below a divider |