Funnel analysis shows a ~21% drop-off between Review order and Enter card details – noticeably worse than any other step. Session replays show people re-typing card details, hitting vague “payment failed” errors, and abandoning.
Support tickets mentioning “card declined / payment didn’t go through” are up ~30% QoQ.
At current volume this drop-off is roughly £80–100k / month in lost bookings, plus support load.
Before touching billing tech, we tried a low-effort change:
- Clarified “Your card was declined” to more specific messages.
- Added reassurance copy around security and accepted cards.
- Tweaked CTA from “Pay now” to “Complete payment”.
Two-week A/B test showed no meaningful change in billing completion. Confirms the issue isn’t just wording; points to deeper problems with the billing flow / tech.
Engineering spike uncovering the current state:
- Custom card form + validation coupled to legacy code.
- Single gateway integration with flaky error handling.
- No owner; billing changes are a “favour” from whoever has time.
- Adding new payment methods is weeks of work + risky deploys.
Every pricing experiment, payment method, or checkout improvement is blocked on the same fragile stack and a couple of engineers.
We compared three paths:
- Refactor in-house over 6–12 months.
- Move to Stripe (Payment Elements + Billing).
- Move to Adyen and use their checkout SDK.
Key factors:
- Both vendors support our markets; Stripe has better self-serve tooling for retries/dunning.
- Team has prior Stripe experience; none with Adyen.
- Stripe offers a phased rollout (elements first, then subscriptions).
- Engineering effort for “refactor in-house” is high with unclear end state.
Decision:
Take a phased migration to Stripe, starting with new customers.
First step of the migration:
- Replaced the legacy card form with Stripe Payment Elements for new EU customers only.
- Removed redundant fields (card nickname, extra address line).
- Enabled Stripe’s real-time validation and 3DS where required.
- Wrapped the whole thing in a feature flag so we can dial traffic back.
Rolled out to 5% of new EU sign-ups for 48 hours, then 100% EU once metrics looked stable.
Two weeks after the EU rollout:
- Billing step drop-off improved by ~7 percentage points vs control.
- “Card declined / payment failed” support tickets for EU new sign-ups are down ~25%.
- No Stripe-related incidents; on-call reports have been quiet.
Based on the EU results, we:
- Switched all new sign-ups globally to the Stripe checkout.
- Left existing subscriptions on the old system but synced key data nightly for support.
- Assigned ownership of the Stripe integration to the Payments squad with a clear incident runbook.
A month into global rollout:
- New-customer billing conversion is +9 pts vs pre-Stripe baseline.
- Estimated revenue uplift £45–60k / month for the migrated cohort.
- Support time on billing issues continues to trend down.
Based on this, we agreed to:
- Plan migration of existing subscriptions to Stripe over the next two quarters.
- Target deprecation of the in-house billing path once 90%+ of active subscriptions are on Stripe.