Reference

Troubleshooting and FAQ

Why was a request declined or handed off?

Open the case: from the Action Log, from Cases, or from the ticket. How It Was Handled shows each check in order and the one that decided, in plain words, with the policy version. Common reasons:

What you see What it means What you can do
The customer's identity was not verified. The customer did not prove who they are in a way your policy accepts. Check the Identity step; offer the email code or a signed token.
The charge is older than the refund window. Outside Refund Window. Widen the window if that is your intent.
The amount is above the highest automatic refund. Over your Amount limit. Raise it, or let your team decide.
This reason is not refunded automatically. The reason is not in Refund reasons accepted. Add it.
This type of charge is not refunded automatically. You listed charge types. Stripe reports none, so every Stripe charge fails this check. Remove the charge-type list on a Stripe workspace.
The customer reached the refund limit for the period. Per Customer limit. Tune it; it cannot be switched off.
Your workspace's hourly refund amount would be exceeded / reached its refunds for the day. Workspace Limits. Raise them if your volume grew.
The circuit breaker is open. Refunds are running far above their usual rate. Check for abuse; it closes when the rate falls back.
One of your custom rules matched. A rule on the Rules tab decided; the reason code is yours. Review the rule.
The policy has no limit in this charge's currency. The policy states no amount in the charge's currency, and no settled amount in a currency it states was recorded. Add limits in that currency (Policy → Currencies You Charge In). A team member can refund the charge beyond policy meanwhile.
Paused by your emergency stop. Your kill switch is on. Turn it off in Settings → General (owners and admins).
Your workspace is not live yet. You have not gone live. Finish Get Started.
The customer asked to talk to a person. The customer asked for a human. Answer the ticket.

Before you change the policy, use Simulate This Draft to see what the change would have done over your history.

The widget doesn't appear

  • "This site is not allowed to show this support widget." Add the page's exact origin in Settings → Widget.
  • "Support chat isn't available for this shop yet." The workspace is not live, or is suspended.
  • Nothing at all. Check that the loader is a plain <script src> (not a module or bundled), that data-tenant and data-agent-url are set, and that your Content Security Policy allows the CDN in script-src and frame-src.
  • The launcher is off screen on phones. Add <meta name="viewport" content="width=device-width, initial-scale=1"> and make sure the page does not scroll sideways.

Customers signed in on my site still get asked for a code

The token was rejected. Check that it is signed with the current widget signing secret (or the previous one within 7 days of a rotation), that tenant is your Workspace ID, that sub is the customer's id at your provider (and connection names the right connection if you have several), and that exp is at most one hour ahead. Your page's on('event') handler receives error with identity_token_rejected.

My webhook endpoint isn't receiving events

  • Use Send Test Event on the endpoint and read the result (DNS, TLS, redirect or the HTTP status).
  • The URL must be public https on port 443; redirects are never followed.
  • Check the endpoint is enabled and subscribed to the event.
  • Verify the signature over the raw body, before any JSON parsing.
  • Answer within 15 seconds with a 2xx status. Failed deliveries are retried; duplicates carry the same X-SupportRoute-Delivery.

Stripe data looks incomplete

Check that the Stripe webhook endpoint sends every event listed in Integrations → Stripe and that the restricted key has the permissions listed there. History from before go-live is imported for the window you chose; Stripe sends the card BIN and issuer only to accounts it has enabled (ask Stripe support).

I can't store keys, rotate secrets or override the policy

These need an authenticator code. Turn on two-factor in Security first.

FAQ

Does a person at Chargeless review decisions? No. Your published policy decides; what it does not allow goes to your team.

Can the AI refund more than my policy allows? No. The AI only proposes. Every action is decided by your policy and the safety limits, and the customer must confirm in the chat.

Can my team go beyond the policy? Owners and admins can, from a ticket or a payment page, with an authenticator code. Overrides never pass the emergency stops, what is left to refund, the velocity limits or the circuit breaker, and they are recorded with the person's name.

What happens to requests in progress when I publish a new policy? A decision already made keeps the version it was made under. Anything not yet decided, including a chat waiting for the customer's Confirm, is decided under the new version.

Can a customer be refunded twice for the same request? No. Each action carries a key that names the request, and a repeat is recognised.

Which payment providers are supported? Stripe, and your own system through the merchant-provider contract. dLocal and Ecommpay are not available yet.

Can I test without real money? Yes: connect Stripe with test-mode keys, and use the simulator to replay a draft over your history.

Where is my data stored, and what is kept? See What Chargeless stores.