Diagnose and fix failed payments, Stripe connection issues, declined cards, and broken checkout flows on your UniLink store or paid link page.
You have set up a product, a digital download, or a paid subscription on your UniLink page. Visitors are arriving, clicking "Buy", and — nothing. The checkout fails, the card is declined, or the payment button simply does not work. For any creator or business using UniLink to generate revenue, a broken checkout is a critical issue that needs to be resolved immediately.
UniLink processes payments through Stripe, one of the world's most reliable payment platforms. When payments fail, the cause is almost always a configuration issue (your Stripe account is not properly connected or verified) or a buyer-side issue (their card was declined for a reason unrelated to UniLink). This guide walks through every failure scenario from both sides so you can identify the root cause and restore a working checkout fast.
What This Guide Covers
This article covers the complete payment failure diagnostic process: verifying your Stripe connection and account verification status, understanding common card decline codes and what they mean for you versus your buyer, diagnosing webhook delivery failures that cause order status to get stuck, handling currency restriction issues for international buyers, and using Stripe test cards to safely verify your checkout without processing real transactions.
The guide separates issues that are your responsibility to fix (Stripe configuration, webhook URLs, test mode) from issues on the buyer's side (card limits, 3DS authentication) so you always know whether action is required from you or from the customer.
Whether payments have never worked (first-time setup) or stopped working after previously functioning correctly (something changed in configuration), this guide covers both scenarios with concrete steps for each.
How to Get Started
- Check Stripe connection status — in the UniLink Dashboard go to Settings → Payments → Stripe. Verify that the status shows "Connected" and that the account shown is the correct Stripe account. If it shows "Not connected" or displays a different account, reconnect.
- Verify you are not in test mode — in the same Payments settings, check whether the toggle reads "Live mode" or "Test mode". Test mode processes payments with test cards only — real cards are declined. Switch to Live mode to accept real payments.
- Check your Stripe account's verification status — log into your Stripe Dashboard at dashboard.stripe.com. If there is a banner warning that your account is restricted or that verification is required, you must complete that process before live payments will be accepted. Stripe requires identity and bank account verification before you can receive payouts.
- Attempt a test checkout yourself — using Stripe's test card number 4242 4242 4242 4242, any future expiry, and any 3-digit CVC, go through the full checkout on your page. If this test card also fails, the issue is on your Stripe configuration side. If it succeeds, the issue is with specific real cards (likely a buyer-side decline).
- Check the currency you have set — in the product or payment block settings, verify that the currency matches what Stripe has enabled for your account. Some currencies require additional Stripe configuration to activate.
Step-by-Step Guide
- Reconnect Stripe if disconnected — in Dashboard → Settings → Payments, click "Connect Stripe". You will be redirected to Stripe's OAuth flow. Log in with your Stripe account credentials and authorize the connection. After being returned to UniLink, verify the connection shows your correct Stripe account name and is in Live mode.
- Complete Stripe account verification — log into dashboard.stripe.com and navigate to Settings → Account. Complete any pending identity verification steps (government ID, business registration, bank account details). Until verification is complete, Stripe holds or blocks payouts and may decline live card charges. This process typically takes 1–2 business days after submitting documents.
- Switch from test mode to live mode — in UniLink Dashboard → Settings → Payments, toggle from "Test mode" to "Live mode". Save the setting and republish your page. Test mode is the default when you first connect Stripe and is the single most common reason real payments fail for new sellers.
- Interpret card decline codes — when a buyer's card is declined, Stripe generates a decline code. The most common ones are: insufficient_funds (buyer needs to use a different card or add funds), card_not_supported (the card type is not enabled for online purchases — common with some prepaid or international debit cards), and authentication_required (the buyer's bank requires 3D Secure — the buyer should check their bank's app or email for an approval prompt). These are buyer-side issues that you cannot fix from your Stripe settings.
- Verify webhook delivery — in your Stripe Dashboard go to Developers → Webhooks. Find the webhook endpoint that UniLink registered (it will be a unilink.us URL). Check the Recent Deliveries section. If you see failed deliveries (red status), click on a failed event to see the error. Common causes are the UniLink endpoint returning a non-200 response, or the webhook URL being outdated. In UniLink Dashboard → Settings → Payments, disconnect and reconnect Stripe to refresh the webhook registration.
- Check currency support — if international buyers are experiencing failures but domestic buyers are not, the buyer's country may have restrictions on accepting your currency. In Stripe Dashboard → Settings → Payment Methods, verify that the payment methods you expect to support (credit card, Apple Pay, etc.) are enabled for the currencies and countries relevant to your audience. You may need to enable specific payment methods for specific regions.
- Test checkout with Stripe test cards — to safely verify every scenario without processing real transactions, switch to test mode temporarily and use these Stripe test card numbers: 4242 4242 4242 4242 (successful payment), 4000 0025 0000 3155 (requires 3DS authentication — tests your 3DS flow), 4000 0000 0000 9995 (simulates insufficient funds decline). After testing, switch back to live mode.
Key Settings Explained
| Setting | What it controls | Best practice |
|---|---|---|
| Stripe connection (Live mode) | Whether your UniLink page can process real payments via your Stripe account | Always verify connection after any Stripe account changes; reconnect if status shows anything other than "Connected — Live" |
| Test mode / Live mode toggle | Switches between Stripe's test environment and live payment processing | Use test mode for setup and QA; switch to live mode before sharing your page with any paying customers |
| Stripe account verification | Stripe's KYC/identity check that unlocks live payment acceptance and payouts | Complete verification immediately after creating your Stripe account; payouts are blocked until it is done |
| Webhook endpoint | Stripe sends payment events (paid, failed, refunded) to UniLink via this URL to update order status | After reconnecting Stripe, verify that the webhook appears as healthy in Stripe Dashboard → Developers → Webhooks |
| Currency setting on product block | The currency shown to buyers and charged via Stripe | Set to the currency your Stripe account is configured to accept; adding a new currency may require Stripe-side activation first |
How to Get the Most Out of It
The most important habit for a seller on UniLink is monitoring both your UniLink Dashboard (Orders section) and your Stripe Dashboard simultaneously. UniLink shows order status from its perspective; Stripe shows the underlying charge status. When these two disagree — for example, UniLink shows an order as "Pending" but Stripe shows the charge as "Succeeded" — it almost always means a webhook delivery failure. Checking both dashboards together makes this pattern obvious immediately.
Set up Stripe's email notifications for every payment event: successful charge, failed charge, dispute opened, payout sent. You receive these directly from Stripe regardless of what UniLink does, which means you always have a second source of truth for payment activity even if something goes wrong with the UniLink webhook pipeline.
If you sell to an international audience, log into your Stripe Dashboard and go to Settings → Payment Methods to enable Apple Pay, Google Pay, and local payment methods (iDEAL for Netherlands, SEPA Debit for Europe, etc.). These increase checkout conversion for buyers who prefer not to enter card numbers, and they are often more reliable than card payments for international transactions where 3DS is required.
For digital products, enable Stripe's automatic receipts in Stripe Dashboard → Settings → Emails. Buyers receive a Stripe payment receipt automatically after every successful charge, which reduces "did my payment go through?" support inquiries and helps with buyers' expense tracking.
Troubleshooting Common Issues
| Problem | Likely cause | Fix |
|---|---|---|
| Payment button does nothing on click | Stripe not connected, or page still in test mode with no test card | Check Dashboard → Settings → Payments; reconnect Stripe if needed; switch to live mode |
| Card declined for all buyers | Stripe account not verified, or account restricted by Stripe | Log into dashboard.stripe.com and complete any pending verification or respond to any restriction notice |
| Payment succeeds in Stripe but order shows "Pending" in UniLink | Webhook delivery failure — UniLink did not receive the payment confirmation event | Go to Stripe → Developers → Webhooks → Recent Deliveries and resend the failed event; reconnect Stripe in UniLink to refresh webhook |
| International buyers cannot complete payment | 3DS authentication failed, or buyer's country has card restrictions for this currency | Verify 3DS flow with test card 4000 0025 0000 3155; enable local payment methods in Stripe for buyer's region |
Pros
- Stripe is one of the world's most reliable payment processors — infrastructure failures are extremely rare
- Test mode with Stripe test cards lets you verify the full checkout flow without any real money moving
- Stripe Dashboard provides detailed decline codes that tell you exactly why each payment failed
- Webhook events are logged in Stripe Dashboard and can be manually resent after a delivery failure
Cons
- Stripe account verification takes 1–2 business days and blocks live payments until complete
- 3DS authentication failures on the buyer's side cannot be resolved from your settings — the buyer must approve via their bank
- Webhook failures require manual intervention — UniLink does not automatically retry failed order status updates
Frequently Asked Questions
A buyer says their payment failed but I can see the charge in Stripe — do I need to do anything?
If the charge status in Stripe shows "Succeeded" but your UniLink order shows "Pending" or "Failed", this is a webhook delivery issue. Go to Stripe Dashboard → Developers → Webhooks → Recent Deliveries, find the charge.succeeded event for that transaction, and click "Resend". This replays the event to UniLink and should update the order status. Also go to UniLink Dashboard → Settings → Payments and reconnect Stripe to ensure future webhooks deliver correctly.
How do I know if my Stripe account is in test mode or live mode on UniLink?
In UniLink Dashboard → Settings → Payments, the mode is shown next to your Stripe connection status. You can also check the URL you see when the Stripe checkout opens: test mode checkouts show "Using test key" in Stripe's hosted checkout interface. If you are unsure, use Stripe test card 4242 4242 4242 4242 — if it processes successfully, you are in test mode.
Can I accept payments in multiple currencies?
Yes, if your Stripe account supports multiple currencies. Set the currency on each product block individually. Stripe will charge the buyer in the currency you set and convert to your payout currency at Stripe's exchange rate. Not all currency combinations are available in all countries — check Stripe's currency support documentation for your account's location.
A buyer completed 3DS verification but the payment still failed — why?
The buyer completing the 3DS step does not guarantee the payment succeeds. After 3DS, the bank still performs its own authorization check and can decline for separate reasons (insufficient funds, fraud flags, card limits). Ask the buyer to contact their bank directly to understand why the authorization was declined after 3DS. They may need to use a different card.
How long does Stripe hold funds before I can withdraw them?
Stripe's standard payout schedule is 2 business days for US accounts and 7 days for many international accounts. New accounts often start with a 7-day rolling window that shortens as you build a payment history. You can see your payout schedule and pending balance in Stripe Dashboard → Balance → Payouts. If payouts are on hold, check for any open verification requests in your Stripe account settings.
Key Takeaways
- Test mode is the single most common reason real payments fail for new sellers — always switch to Live mode before sharing your page publicly.
- Stripe account verification must be completed before live payments are accepted; check dashboard.stripe.com for any pending requirements.
- Card declines with codes like insufficient_funds or authentication_required are buyer-side issues — you cannot fix them from your Stripe settings.
- Webhook failures cause order status mismatches between Stripe and UniLink — resend the failed event from Stripe Dashboard to resync.
- Use Stripe test card 4000 0025 0000 3155 before launch to verify your checkout handles 3DS authentication correctly for international buyers.
Ready to start selling on your UniLink page?
Connect Stripe, add your products, and turn your profile link into a fully functional storefront — no separate e-commerce platform needed.
Get Started Free