Bot protection
How ShopAssist detects scripted traffic, proof-of-work and Cloudflare Turnstile challenges, and the daily cost guard that protects your AI budget.
Public chat widgets attract bots that try to use your AI for free. ShopAssist protects your store in three layers.
Abuse scoring
Every chat session gets a score from signals such as automation user agents, missing browser headers, data-center IP ranges, many sessions from one network, repeated identical messages and prompt-injection attempts. A high score triggers a challenge; a very high score blocks the session. Conversations blocked before an AI reply are never billed.
Challenges
By default the challenge is a proof of work: the shopper's browser solves a small puzzle in the background, without cookies or third parties. Under budget pressure the puzzle gets harder.
For stores under repeated attack, use Cloudflare Turnstile with your own Cloudflare account:
- Create a Turnstile widget in Cloudflare for your storefront hostnames.
- In Settings → Security → Challenges, enter the site key and secret (the secret is write-only).
- Add
https://challenges.cloudflare.comto your CSP (Content Security Policy).
Cloudflare then processes the challenge as your sub-processor. You can also challenge every new session (Challenge mode → Always).
Cost guard
Daily limits per store protect your AI budget (especially with your own key): AI replies, input tokens and, with your own key, an estimated provider cost in USD. You can change them in Settings → Security. As usage approaches a limit:
| Daily usage | Effect |
|---|---|
| 50 % | Every new session is challenged |
| 80 % | Harder challenges, shorter context; owners are emailed |
| 90 % | The rest is reserved for verified shoppers and signed-in customers |
| 100 % | The assistant pauses until midnight UTC and shows your contact options |
No single network may use more than a fair share of the daily limits, so one attacker can't use up your budget for everyone. Sudden surges in new sessions turn on challenges automatically for an hour.
Last updated on