Card declined or payment failed at Whizi checkout

The short answer

If your card was genuinely declined, the refusal came from your bank through Stripe, not from Whizi, so the fix is a different card or a call to your bank. Whizi does not have a card declined message anywhere in it. Card details are entered on Stripe's hosted checkout page, which sits outside Whizi's codebase, and Whizi's Stripe webhook handler has no declined payment message to show you.

So if you saw an error with Whizi wording on it, it was not a decline. It was one of the strings below, and each one has a different cause and a different fix.

The three that are easiest to mistake for a decline:

What you sawWhat it meansWhat to do
A $0.99 intro trial has already been used with this payment method.That card has already claimed the intro trialSubscribe at the normal rate, or use a card that has not claimed it. Retrying will not work
Pricing is temporarily unavailable.Whizi could not read the price table from StripeWait and try again later. Nothing on your side fixes this
Failed to create Stripe checkout session.The checkout call failed and the backend supplied no messageRetry once. If it repeats, contact support

Every error the Whizi backend returns at checkout

These come from the server, so they arrive with an HTTP status and an error code that support can match in a network trace. Every backend error body is JSON in the shape {"error": {"code": "...", "message": "..."}}, so the code sits next to the message. The rows below are ordered by HTTP status.

MessageHTTPCodeTriggered when
A plan and billing cycle are required.400invalid_checkout_requestThe checkout body could not be parsed
Invalid plan or billing cycle.400invalid_plan_or_cycleThe plan or cycle does not map to a known Stripe price
No subscription item found for the active subscription.400subscription_item_missingAn in place plan change ran against a subscription with no item on it
The supplied discount must be an active 100% promotion code or coupon ID.400invalid_discountThe code supplied is not an active 100 percent promotion code or coupon ID
Temporary email addresses are not allowed. Please use a permanent email address.400disposable_email_blockedThe signed in account's email is on the disposable domain list
A $0.99 intro trial has already been used with this payment method.403duplicate_trial_payment_methodThe card fingerprint has already claimed the intro trial
User not found.404not_foundThe checkout route could not read your user row
Pricing is temporarily unavailable.503pricing_unavailableThe localized price table could not be read from Stripe

What to do with each. The intro trial refusal has its own section below. Pricing is temporarily unavailable. is server side: HTTP 503, returned when the localized price table cannot be read from Stripe, and there is no setting on your account that changes it. Failed to create Stripe checkout session. is not a server message at all, which is why it names no reason: it is the website's own fallback text, shown when the checkout call fails and the backend supplied no message. Both are wait and retry.

A plan and billing cycle are required. and Invalid plan or billing cycle. both mean the request did not carry a plan the server recognises, so start again from the pricing page and pick the plan and the monthly or annual toggle there rather than reusing an old or edited checkout link.

User not found. means your session points at a user row the server cannot read. Sign out, sign back in, then start checkout again.

No subscription item found for the active subscription. fires during a plan change rather than a first purchase, and it is not fixable from the interface. Contact support.

Errors the website shows before checkout even opens

These come from the browser, not the server, so they have no HTTP code. They all mean the same broad thing: something failed while Whizi was preparing your account for the handoff to Stripe, so no charge was ever attempted.

MessageTriggered when
Failed to create Stripe checkout session.The checkout call failed and the backend supplied no message
Could not open checkout. Please try again.The upgrade modal's checkout call threw with no message
Authentication failed. Please sign in again.The token fetch returned nothing before checkout
Failed to save user before checkout.The pre checkout user save call was not OK
Could not prepare your account for checkout.The pricing page could not save the user before checkout
Missing user or Stripe customer details.The user id was absent at checkout time
Checkout response did not include a Stripe URL.Checkout succeeded but returned neither a URL nor a subscription id
Something went wrong while starting your trial. Please try again.The pricing page's generic trial start failure

For anything on this list, sign out, sign back in, and start checkout again from the pricing page. That clears the cases where the token fetch returned nothing before checkout, which is what Authentication failed. Please sign in again. reports.

Checkout response did not include a Stripe URL. is the one worth pausing on. It means the call succeeded, so before you try to pay again, open your account settings and check whether a subscription is already there.

Two more appear on the sign in and sign up pages when you pick a plan first and authenticate second: Signed in, but checkout could not start. Please choose your plan again. and Your account was created, but checkout could not start. Please sign in and choose your plan again. Both mean the account part worked and only the handoff failed. Your account exists. Go to pricing and pick the plan again.

One last cause of a mysterious failure: retrying checkout many times in a row can trip the rate limiter, which returns HTTP 429 and Too many requests. Please wait and try again. Every request on the account, whatever the route, counts against a ceiling of 30 per minute. Wait a minute rather than clicking again.

The intro trial refusal, which no retry will clear

A $0.99 intro trial has already been used with this payment method. is HTTP 403 with the code duplicate_trial_payment_method. It is the one checkout error on this page that a retry will never clear.

The check is keyed to the card rather than to the account: the refusal is returned when the card fingerprint has already claimed the intro trial.

Your two options: subscribe at the standard rate for the plan you want, or pay with a payment method that has not claimed the trial before.

Plan prices, the trial terms and what happens at conversion are all in billing, trials and how to cancel.

Payment went through but the account is still on the free plan

A charged card plus an account that still behaves as free is a different symptom from checkout failing, and it has its own page.

Read you paid but the plan features are still locked for the strings that appear in that state, the check that tells you which account holds the subscription, and what to send support.

What Whizi cannot tell you

Three gaps, so you do not spend time hunting for answers that are not there.

Whizi never sees why your bank declined a card, because that exchange happens on Stripe's hosted checkout page, outside Whizi's codebase. A sweep of both Whizi repos found no card declined or payment declined string of any kind, and the Stripe webhook handler carries no declined payment message. So there is no decline reason stored in your account, no retry button, and nothing for Whizi to override. The reason sits with your bank.

Whizi also has no message for a failed or past due renewal. No user-facing string for one exists in either repo, so if a renewal charge fails later you will not get a Whizi error explaining it. The one renewal adjacent notice that does exist is a push notification reading "Your subscription is no longer active." under the title "Whizi subscription updated", sent when a RevenueCat webhook syncs an account down to the free tier. That is the RevenueCat webhook path, so it is not a report of a Stripe renewal failing.

Whizi billing runs through Stripe, so which cards can pay at all is decided there rather than in Whizi. A Russian or Iranian card cannot complete registration. Ukraine, Kazakhstan, Turkey, Indonesia and India work end to end.

Workflow checklist
  • A real card decline comes from your bank through Stripe, not from Whizi
  • Whizi has no card declined message and no decline reason to show you
  • Whizi wording on the error means it was not a decline
  • Session errors clear by signing out and back in, then retrying from pricing
  • Pricing is temporarily unavailable is server side: wait, do not retry in a loop
  • The intro trial is keyed to the card fingerprint rather than to the account
  • Charged but still on the free plan is a different symptom, covered in subscription-not-active
Common questions

Frequently asked questions

Why does Whizi say my payment failed but my bank shows no attempt?

Because the string you saw was raised by the website before Stripe was ever reached, so no charge was attempted. The quick way to tell one of those apart from a real backend refusal: a backend refusal arrives as JSON carrying an error code, such as pricing_unavailable or invalid_plan_or_cycle, and shows an HTTP status in a network trace. A browser-side string has neither. If what you saw carried no code, nothing reached your bank.

What does A $0.99 intro trial has already been used with this payment method. mean?

It means the card you entered has already claimed the intro trial. It is not a decline: Whizi has no card declined string at all, and this one comes from Whizi's own checkout route as HTTP 403 with the code duplicate_trial_payment_method, which is worth quoting if you write in. Either subscribe at the standard rate or use a payment method that has not claimed the trial.

I got Pricing is temporarily unavailable. Is my card the problem?

No. It is HTTP 503 pricing_unavailable, and it comes from the route that reads the localized price table from Stripe, not from the checkout route that would take a card. There is no fix on your side, so wait rather than trying a different card. If you saw Failed to create Stripe checkout session. instead, that is a separate string with a separate origin: the website's fallback when the checkout call failed and the backend supplied no message.

My promo code was rejected. Why?

Checkout returns The supplied discount must be an active 100% promotion code or coupon ID. as HTTP 400 invalid_discount. The discount field at checkout only accepts an active 100 percent promotion code or coupon ID, so an expired code or a partial discount code will be refused there. Remove it and check out at the normal price if you need access now.

Whizi rejected my email at checkout. What happened?

You saw Temporary email addresses are not allowed. Please use a permanent email address. The checkout route returns it as HTTP 400 disposable_email_blocked when the signed in account's email domain is on the disposable list. The same string is used at sign up as HTTP 403. Use a permanent address on the account and checkout will proceed.

I was charged twice. What should I do?

Contact support with both Stripe receipts rather than cancelling blindly. Cancelling is a separate action with its own outcome: for an active subscription the cancel route answers Subscription cancellation scheduled for end of billing period., so that subscription runs to the end of the period it is already paid for.