When you support both Stripe and PayPal, you’re maintaining two parallel error catalogues with overlapping but non-identical semantics. The biggest gotcha: Stripe is unusually generous with decline metadata (decline_code: insufficient_funds), while PayPal often returns only a generic INSTRUMENT_DECLINED and forces customers to investigate via PayPal directly.
For new integrations, lean on Stripe’s structured errors for in-app messaging and treat PayPal as a “send the customer to PayPal to resolve” pattern.