Why doesn't my newly added card show up immediately?

Last updated May 19, 2026Subscriptions & billing

Most newly-added cards show up in the Valid Email Checker Payment Methods list within a second or two. Occasionally one takes a few seconds longer, or seems to be missing right after you finish the card form. This is almost always a webhook-timing issue, not a save failure. The card is saved at Stripe (or Paddle); VEC just has not heard about it yet.

How the save propagates

When you submit the card form, the order of events is:

  1. Browser sends the card details to Stripe (or Paddle) directly. VEC servers do not see it.
  2. Stripe tokenises the card, attaches it to your Stripe customer, and responds OK to your browser.
  3. Stripe fires a payment_method.attached webhook to VEC.
  4. VEC validates the webhook signature, checks the card_attach_intent_at stamp, and inserts the card into the payment_methods table.
  5. On your next page load, the Payment Methods tab queries that table and renders the card.

Steps 1 and 2 are instant. Steps 3 and 4 usually take under a second, but webhooks occasionally queue under load and arrive a few seconds late. If you opened the Payment Methods tab the very instant the form closed, the card may not be in the database yet.

What to do if it is missing

  1. Refresh the page. This re-queries payment_methods and almost always surfaces the card.
  2. Wait a few seconds, refresh again. Webhook lag rarely exceeds 10 seconds. If it is still missing after a minute, the webhook may have failed entirely.
  3. Trigger a manual sync. Open the Payment Methods tab and click the sync icon (if present), or simply navigate away and back. VEC calls the sync-payment-methods edge function on tab focus, which fetches the full card list directly from Stripe and reconciles.
  4. Check the portal directly. Open the customer portal and confirm the card is listed there. If yes but VEC still does not have it, contact support with your account email and the card last 4 — we can run the sync server-side.

Why VEC syncs by brand + last 4, not by processor ID

A quirk of Stripe's behaviour: each Checkout session generates a new processor payment-method ID even when the underlying physical card is the same. If VEC keyed cards purely by processor ID, the same Visa ending in 4242 would create a new row in our table every time you ran Checkout, leading to duplicate-looking rows. We instead deduplicate on (user_id, processor_name, card_brand, card_last4) so the same physical card always maps to the same row.

The card is at Stripe even if it is not at VEC
A delayed webhook does not mean the card was not saved. If you check the Stripe customer portal and the card is there, the save was successful — VEC is just slow to mirror it. Almost never a problem in practice.