{"id":387302,"date":"2026-10-26T05:30:52","date_gmt":"2026-10-26T05:30:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/checkout-sentinel-for-woocommerce\/"},"modified":"2026-10-26T11:17:57","modified_gmt":"2026-10-26T11:17:57","slug":"botveil-checkout-protection-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/botveil-checkout-protection-for-woocommerce\/","author":23424165,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.6.0","stable_tag":"0.6.0","tested":"7.1.3","requires":"6.8","requires_php":"8.2","requires_plugins":null,"header_name":"Botveil Checkout Protection for WooCommerce","header_author":"Subhajit Bera","header_description":"Risk-based checkout abuse prevention for WooCommerce.","assets_banners_color":"a2c5ad","last_updated":"2026-10-26 11:17:57","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.6.0":{"tag":"0.6.0","author":"berasubhajit16","date":"2026-10-26 11:17:57","revision":3766249}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3765678,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3765678,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3765678,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3765678,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.6.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3765580,"resolution":"1","location":"assets","locale":"","width":1464,"height":711},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3765580,"resolution":"2","location":"assets","locale":"","width":1460,"height":655},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3765580,"resolution":"3","location":"assets","locale":"","width":1062,"height":535},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3765580,"resolution":"4","location":"assets","locale":"","width":1062,"height":382},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3765580,"resolution":"5","location":"assets","locale":"","width":1062,"height":662},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3765580,"resolution":"6","location":"assets","locale":"","width":1100,"height":636},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3765580,"resolution":"7","location":"assets","locale":"","width":660,"height":466}},"screenshots":{"1":"A risky checkout asks the shopper for a 6-digit code sent to their email. The popup copies the checkout's fonts, colours and buttons.","2":"Settings \u2192 Botveil \u2192 General: choose the mode, the risk thresholds and the action for each risk level.","3":"Rate limits per IP and per email, and what happens when a limit is exceeded.","4":"Timed bans that get longer for repeat offenders.","5":"Popup design: restyle every part of the verification popup, with separate mobile values.","6":"The Botveil dashboard: today's activity, current bans and the event log with the reason for every decision.","7":"Event detail: the signals that fired and their points."}},"plugin_section":[],"plugin_tags":[3148,12891,9210,600,286],"plugin_category":[45,54],"plugin_contributors":[288565],"plugin_business_model":[],"class_list":["post-387302","plugin","type-plugin","status-publish","hentry","plugin_tags-checkout","plugin_tags-fraud","plugin_tags-otp","plugin_tags-security","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-security-and-spam-protection","plugin_contributors-berasubhajit16","plugin_committers-berasubhajit16"],"banners":{"banner":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/banner-772x250.png?rev=3765678","banner_2x":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/banner-1544x500.png?rev=3765678","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/icon-128x128.png?rev=3765678","icon_2x":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/icon-256x256.png?rev=3765678","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/screenshot-1.png?rev=3765580","caption":"A risky checkout asks the shopper for a 6-digit code sent to their email. The popup copies the checkout's fonts, colours and buttons."},{"src":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/screenshot-2.png?rev=3765580","caption":"Settings \u2192 Botveil \u2192 General: choose the mode, the risk thresholds and the action for each risk level."},{"src":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/screenshot-3.png?rev=3765580","caption":"Rate limits per IP and per email, and what happens when a limit is exceeded."},{"src":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/screenshot-4.png?rev=3765580","caption":"Timed bans that get longer for repeat offenders."},{"src":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/screenshot-5.png?rev=3765580","caption":"Popup design: restyle every part of the verification popup, with separate mobile values."},{"src":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/screenshot-6.png?rev=3765580","caption":"The Botveil dashboard: today's activity, current bans and the event log with the reason for every decision."},{"src":"https:\/\/ps.w.org\/botveil-checkout-protection-for-woocommerce\/assets\/screenshot-7.png?rev=3765580","caption":"Event detail: the signals that fired and their points."}],"raw_content":"<!--section=description-->\n<p>Botveil scores every checkout attempt, on the classic shortcode checkout and the Checkout block, and decides what to do:<\/p>\n\n<ul>\n<li><strong>Allow<\/strong> \u2013 normal orders go straight through.<\/li>\n<li><strong>Require email code<\/strong> \u2013 risky orders must enter a 6-digit code sent to the billing email.<\/li>\n<li><strong>Hold for review<\/strong> \u2013 the order is placed but put on hold.<\/li>\n<li><strong>Block<\/strong> \u2013 the checkout is refused with a generic message.<\/li>\n<\/ul>\n\n<h4>How the score works<\/h4>\n\n<p>Signals add points: guest checkout, many checkout attempts from one IP, failed payments (card testing), wrong or excessive verification codes, high order value. Trusted returning customers subtract points. You choose the thresholds and the action for low, medium and high risk.<\/p>\n\n<h4>Limits and bans<\/h4>\n\n<ul>\n<li>Rate limits per IP and per email, with an inline \"N attempts per X seconds \/ minutes \/ hours\" setting.<\/li>\n<li>Too many checkout attempts from an IP, or too many wrong codes for an email, blocks and bans that IP or email for a while. Repeat offences get longer bans (15 min \u2192 1 h \u2192 4 h for IPs by default). Email bans never affect a customer logged in with that email.<\/li>\n<li>The dashboard lists active and recent bans with the IP or email, the matching customer, a link to their events, and Unblock.<\/li>\n<\/ul>\n\n<h4>Verification popup<\/h4>\n\n<p>The code popup copies your checkout's fonts, colours, inputs and Place order button, so it looks like part of your theme. Every element can be restyled (typography, colours, spacing, borders, hover states, separate mobile values), with theme, system or Google Fonts. The code email uses your WooCommerce email design and is editable under WooCommerce \u2192 Settings \u2192 Emails.<\/p>\n\n<h4>Privacy by design<\/h4>\n\n<p>Emails and IP addresses are stored only as keyed hashes (HMAC-SHA256) for scoring and the event log. Only an active ban keeps the banned IP or email, encrypted, so staff can identify and lift it; it is deleted with the ban. Personal data export and erasure are supported, and the plugin suggests privacy policy text.<\/p>\n\n<h4>Monitor mode<\/h4>\n\n<p>Start in monitor mode to see what would be challenged or blocked without affecting customers, then switch to enforce.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to <strong>Google Fonts<\/strong> only if an administrator picks a Google Font in Settings \u2192 Botveil \u2192 Popup design.<\/p>\n\n<ul>\n<li><strong>What and when:<\/strong> when the popup design is saved, the site downloads the stylesheet for the chosen families from <code>https:\/\/fonts.googleapis.com<\/code> and the font files from <code>https:\/\/fonts.gstatic.com<\/code>, and stores them in <code>wp-content\/uploads\/cshield-fonts\/<\/code>. Shoppers' browsers then load the fonts from your own site and never contact Google.<\/li>\n<li><strong>Data sent:<\/strong> the font family names and weights, plus the request metadata any HTTP request carries (your server's IP address and a user agent). No visitor, customer or order data is sent.<\/li>\n<li><strong>Provider:<\/strong> Google LLC \u2014 <a href=\"https:\/\/policies.google.com\/terms\">Terms of Service<\/a>, <a href=\"https:\/\/policies.google.com\/privacy\">Privacy Policy<\/a>, <a href=\"https:\/\/developers.google.com\/fonts\/faq\/privacy\">Google Fonts FAQ<\/a>.<\/li>\n<\/ul>\n\n<p>No other external service is used. Verification emails are sent through your site's own mailer (WooCommerce \/ <code>wp_mail<\/code>).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce.<\/li>\n<li>Upload the plugin and activate it, or install it from Plugins \u2192 Add New.<\/li>\n<li>Go to WooCommerce \u2192 Settings \u2192 Botveil. New installs start in <strong>Enforce<\/strong> mode with safe defaults. To trial first, switch to <strong>Monitor<\/strong>, review WooCommerce \u2192 Botveil for a few days, then switch back to <strong>Enforce<\/strong>.<\/li>\n<li>Behind Cloudflare, a CDN or a load balancer: add its IP ranges under Settings \u2192 Botveil \u2192 Allowlist and network \u2192 <strong>Trusted proxies<\/strong>, and set <strong>Client IP header<\/strong> (e.g. <code>CF-Connecting-IP<\/code>).<\/li>\n<li>Optional: style the code popup under Settings \u2192 Botveil \u2192 <strong>Popup design<\/strong>, and edit the code email under WooCommerce \u2192 Settings \u2192 Emails \u2192 <strong>Checkout verification code<\/strong>.<\/li>\n<li>Optional, for developers: define <code>CSHIELD_SECRET<\/code> in <code>wp-config.php<\/code> to keep the hashing and encryption key out of the database. Set it before going live; changing it later makes existing fingerprints and stored bans unreadable.<\/li>\n<\/ol>\n\n<h4>Settings overview<\/h4>\n\n<p>All settings are under WooCommerce \u2192 Settings \u2192 Botveil:<\/p>\n\n<ul>\n<li><strong>General<\/strong> \u2013 mode (Enforce, Monitor only, Off), score thresholds (medium from 30, high from 60) and the action for each risk level.<\/li>\n<li><strong>Signals<\/strong> \u2013 the weight of each signal, plus the high order value amount and the number of paid orders that make a customer trusted.<\/li>\n<li><strong>Rate limits<\/strong> \u2013 checkout attempts per IP (20 per 10 min), failed checkouts (3 per hour), wrong codes (5 per 15 min), code requests (8 per 10 min); whether the IP and wrong-code limits block; ban lengths, strike look-back and the \"try again in \u2026\" message.<\/li>\n<li><strong>Email verification<\/strong> \u2013 code lifetime (5 min), attempts per code (5), wait between codes (60 s), new codes per verification (3), and how much the total may rise after verifying (10%).<\/li>\n<li><strong>Popup design<\/strong> \u2013 text, colours, fonts, spacing, borders and hover states for every popup element, with separate mobile values.<\/li>\n<li><strong>Allowlist and network<\/strong> \u2013 allowlisted IPs and emails, trusted proxies, client IP header, event retention (30 days) and delete-on-uninstall.<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20account%20or%20api%20key%3F\"><h3>Do I need an account or API key?<\/h3><\/dt>\n<dd><p>No. Botveil runs entirely on your own site. There is no sign-up and no API key, and no outside service is used unless you pick a Google Font for the popup. Verification emails are sent by your store like any other WooCommerce email.<\/p><\/dd>\n<dt id=\"can%20i%20try%20it%20without%20affecting%20customers%3F\"><h3>Can I try it without affecting customers?<\/h3><\/dt>\n<dd><p>Yes. Set <strong>Mode<\/strong> to <strong>Monitor only<\/strong> under WooCommerce \u2192 Settings \u2192 Botveil. Every checkout is checked and logged, but nobody is challenged or blocked. Review what would have happened under WooCommerce \u2192 Botveil, then switch to <strong>Enforce<\/strong>.<\/p><\/dd>\n<dt id=\"will%20it%20block%20real%20customers%3F\"><h3>Will it block real customers?<\/h3><\/dt>\n<dd><p>Normal checkouts go straight through. Risky ones are asked for a code sent to their email rather than blocked. Blocking only happens for clear abuse, such as many checkout attempts from one connection or many wrong codes, and you can switch both off. You can also allowlist your own IPs and trusted customers.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20checkout%20block%20and%20my%20theme%3F\"><h3>Does it work with the Checkout block and my theme?<\/h3><\/dt>\n<dd><p>Yes. It works with both the Checkout block and the classic checkout page. The code popup copies your checkout's fonts, colours and buttons, and you can restyle it under Settings \u2192 Botveil \u2192 Popup design.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20checkout%3F\"><h3>Will it slow down checkout?<\/h3><\/dt>\n<dd><p>Checks run only when an order is placed, not while shoppers fill in the form, and add about four quick database lookups. Sites with a persistent object cache use it instead.<\/p><\/dd>\n<dt id=\"real%20customers%20are%20asked%20for%20a%20code%20too%20often.%20what%20should%20i%20change%3F\"><h3>Real customers are asked for a code too often. What should I change?<\/h3><\/dt>\n<dd><p>Open WooCommerce \u2192 Botveil and check the \"Why\" column to see what triggered the code. Then raise <strong>Medium risk from score<\/strong> under Settings \u2192 Botveil \u2192 General, or lower the weight of that signal (usually Guest checkout) under Settings \u2192 Botveil \u2192 Signals.<\/p><\/dd>\n<dt id=\"everyone%20is%20suddenly%20blocked.%20why%3F\"><h3>Everyone is suddenly blocked. Why?<\/h3><\/dt>\n<dd><p>Your site is probably behind Cloudflare, another CDN or a load balancer, so every visitor appears to come from the same address. Under Settings \u2192 Botveil \u2192 Allowlist and network, add its IP ranges to <strong>Trusted proxies<\/strong> and set <strong>Client IP header<\/strong> (<code>CF-Connecting-IP<\/code> for Cloudflare). Then unblock the address under WooCommerce \u2192 Botveil.<\/p><\/dd>\n<dt id=\"how%20do%20i%20lift%20a%20ban%3F\"><h3>How do I lift a ban?<\/h3><\/dt>\n<dd><p>Go to WooCommerce \u2192 Botveil \u2192 Blocked now and click <strong>Unblock<\/strong>, or use <strong>Find<\/strong> to look up an IP address or email.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20orders%20held%20for%20review%3F\"><h3>What happens to orders held for review?<\/h3><\/dt>\n<dd><p>They are placed with status On hold and get an order note saying Botveil flagged them. The reasons are in the WooCommerce \u2192 Botveil event log. Process or cancel the order as usual.<\/p><\/dd>\n<dt id=\"shoppers%20don%27t%20receive%20the%20code%20email.\"><h3>Shoppers don't receive the code email.<\/h3><\/dt>\n<dd><p>Codes are sent through your site's normal mailer, so check that your store's emails are delivered reliably (an SMTP plugin helps). You can edit the email under WooCommerce \u2192 Settings \u2192 Emails \u2192 Checkout verification code.<\/p><\/dd>\n<dt id=\"how%20do%20i%20preview%20the%20popup%3F\"><h3>How do I preview the popup?<\/h3><\/dt>\n<dd><p>Click <strong>Preview popup on checkout<\/strong> under Settings \u2192 Botveil \u2192 Popup design. No code is checked in preview.<\/p><\/dd>\n<dt id=\"what%20customer%20data%20does%20it%20store%3F\"><h3>What customer data does it store?<\/h3><\/dt>\n<dd><p>Emails and IP addresses are stored only as scrambled fingerprints, not as readable values. A ban keeps the banned email or IP encrypted so you can see who is blocked, and it is deleted along with the ban record. Events are deleted after 30 days by default, and WordPress's personal data export and erase tools are supported.<\/p><\/dd>\n<dt id=\"something%20went%20wrong.%20how%20do%20i%20turn%20it%20off%20quickly%3F\"><h3>Something went wrong. How do I turn it off quickly?<\/h3><\/dt>\n<dd><p>Set <strong>Mode<\/strong> to <strong>Off<\/strong> under WooCommerce \u2192 Settings \u2192 Botveil. If you can't reach the admin, add <code>define( 'CSHIELD_EMERGENCY_DISABLE', true );<\/code> to <code>wp-config.php<\/code>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>Renamed to \"Botveil Checkout Protection for WooCommerce\" (slug botveil-checkout-protection-for-woocommerce).<\/li>\n<li>Settings and Botveil links on the Plugins screen.<\/li>\n<\/ul>\n\n<h4>0.5.2<\/h4>\n\n<ul>\n<li>Fix: the verification popup did not open on the Checkout block with WooCommerce 11+.<\/li>\n<\/ul>\n\n<h4>0.5.1<\/h4>\n\n<ul>\n<li>Removed one-time upgrade code used during development.<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Renamed to \"Checkout Sentinel for WooCommerce\" (slug <code>checkout-sentinel-for-woocommerce<\/code>); settings, tables and hooks now use the <code>cshield_<\/code> prefix.<\/li>\n<li>Added <code>readme.txt<\/code> with external services documentation.<\/li>\n<li>Monitor\/off notice can be dismissed per admin and reappears if the mode changes.<\/li>\n<li>Settings script moved to an enqueued file; database queries simplified.<\/li>\n<\/ul>\n\n<h4>0.4.4<\/h4>\n\n<ul>\n<li>Dashboard: \"Blocked attempts today\" and a \"Recently banned\" list.<\/li>\n<\/ul>\n\n<h4>0.4.3<\/h4>\n\n<ul>\n<li>Ban list shows the IP or email (encrypted at rest), customer link and events link.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Timed bans with escalation for repeat offenders.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Full popup style controls, self-hosted Google Fonts, separate mobile values.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Popup matches the theme; verification code email is a WooCommerce email.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Stops checkout bots and abuse. Risky checkouts verify their email with a one-time code; repeat offenders are blocked for a while.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/387302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=387302"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/berasubhajit16"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=387302"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=387302"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=387302"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=387302"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=387302"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=387302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}