{"id":363110,"date":"2026-09-10T23:16:48","date_gmt":"2026-09-10T23:16:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kindlyvote\/"},"modified":"2026-09-10T23:16:17","modified_gmt":"2026-09-10T23:16:17","slug":"kindlyvote","status":"publish","type":"plugin","link":"https:\/\/en-gb.wordpress.org\/plugins\/kindlyvote\/","author":18146179,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.3","stable_tag":"1.4.3","tested":"7.1","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"KindlyVote","header_author":"Samuel Ajala","header_description":"Modern voting & elections for WordPress \u2014 events, contestants, and webhook-verified payments for Africa.","assets_banners_color":"6697cd","last_updated":"2026-09-10 23:16:17","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/kindlyvote.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":55,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.3":{"tag":"1.4.3","author":"generalistsam","date":"2026-09-10 23:16:17","revision":3690598}},"upgrade_notice":{"1.4.3":"<p>First public release of KindlyVote.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3690988,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3690988,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3690988,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3690988,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.4.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3690988,"resolution":"1","location":"assets","locale":"","width":2880,"height":2048},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3690988,"resolution":"2","location":"assets","locale":"","width":2880,"height":2048},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3690988,"resolution":"3","location":"assets","locale":"","width":2880,"height":2048},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3690988,"resolution":"4","location":"assets","locale":"","width":2880,"height":2048},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3690988,"resolution":"5","location":"assets","locale":"","width":2880,"height":2048},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3690988,"resolution":"6","location":"assets","locale":"","width":2880,"height":2048},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3690988,"resolution":"7","location":"assets","locale":"","width":2880,"height":2048},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3690988,"resolution":"8","location":"assets","locale":"","width":2880,"height":2048}},"screenshots":{"1":"The KindlyVote dashboard \u2014 live totals, revenue, and top contestants.","2":"Creating a voting event with dates, mode, and price-per-vote.","3":"A contestant profile with photo gallery and social links.","4":"The front-end contestant grid with vote buttons.","5":"The mobile-friendly vote popup.","6":"The leaderboard with ranked standings.","7":"Voting Logs \u2014 a filterable audit trail of every vote.","8":"Settings \u2014 currency and payment gateways."}},"plugin_section":[],"plugin_tags":[15180,7232,13437,2254,11300],"plugin_category":[53],"plugin_contributors":[280147],"plugin_business_model":[],"class_list":["post-363110","plugin","type-plugin","status-publish","hentry","plugin_tags-awards","plugin_tags-contest","plugin_tags-elections","plugin_tags-poll","plugin_tags-voting","plugin_category-ratings-and-reviews","plugin_contributors-generalistsam","plugin_committers-generalistsam"],"banners":{"banner":"https:\/\/ps.w.org\/kindlyvote\/assets\/banner-772x250.png?rev=3690988","banner_2x":"https:\/\/ps.w.org\/kindlyvote\/assets\/banner-1544x500.png?rev=3690988","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kindlyvote\/assets\/icon-128x128.png?rev=3690988","icon_2x":"https:\/\/ps.w.org\/kindlyvote\/assets\/icon-256x256.png?rev=3690988","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-1.png?rev=3690988","caption":"The KindlyVote dashboard \u2014 live totals, revenue, and top contestants."},{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-2.png?rev=3690988","caption":"Creating a voting event with dates, mode, and price-per-vote."},{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-3.png?rev=3690988","caption":"A contestant profile with photo gallery and social links."},{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-4.png?rev=3690988","caption":"The front-end contestant grid with vote buttons."},{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-5.png?rev=3690988","caption":"The mobile-friendly vote popup."},{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-6.png?rev=3690988","caption":"The leaderboard with ranked standings."},{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-7.png?rev=3690988","caption":"Voting Logs \u2014 a filterable audit trail of every vote."},{"src":"https:\/\/ps.w.org\/kindlyvote\/assets\/screenshot-8.png?rev=3690988","caption":"Settings \u2014 currency and payment gateways."}],"raw_content":"<!--section=description-->\n<p>KindlyVote turns any WordPress site into a complete voting and elections platform. Run beauty\npageants, award shows, talent contests, and school, church, or association elections \u2014 as free\npolls, or as paid contests where every vote is only counted after the payment gateway confirms it.<\/p>\n\n<p>Built for African organizers, KindlyVote supports <strong>Paystack<\/strong> and <strong>Flutterwave<\/strong> out of the box,\nworks in local currencies (NGN, GHS, ZAR, KES, RWF, XOF), and records paid votes only after a\nsignature-verified webhook \u2014 so a vote is never counted before the money is confirmed.<\/p>\n\n<h4>Use cases<\/h4>\n\n<ul>\n<li>Beauty pageants and modeling contests<\/li>\n<li>Award shows and \"of the year\" competitions<\/li>\n<li>Talent shows and fan voting<\/li>\n<li>School and student-union elections<\/li>\n<li>Church, NGO, and association elections<\/li>\n<li>Any contest that sells votes, or any free poll<\/li>\n<\/ul>\n\n<h4>Create your event<\/h4>\n\n<ul>\n<li>Unlimited voting events, each with its own start and end window (timezone-aware)<\/li>\n<li>Paid or free mode per event, with a simple price-per-vote for paid contests<\/li>\n<li>Organize contestants into categories or positions, each with its own ready-to-copy shortcode<\/li>\n<\/ul>\n\n<h4>Contestant profiles<\/h4>\n\n<ul>\n<li>Featured photo, bio, brand or business name, and a contest number<\/li>\n<li>A drag-to-reorder photo gallery, with thumbnails that swap the main image<\/li>\n<li>Social links (Instagram, Facebook, X, TikTok, website) and a video URL<\/li>\n<\/ul>\n\n<h4>Free voting<\/h4>\n\n<ul>\n<li>One vote per email \u2014 per contestant, per category, per event, or unlimited<\/li>\n<li>Optional CAPTCHA \u2014 Cloudflare Turnstile or Google reCAPTCHA<\/li>\n<li>Per-IP rate limiting to curb spam<\/li>\n<li>Restrict voting to specific email domains (e.g. only @company.com) for internal elections<\/li>\n<\/ul>\n\n<h4>Paid voting<\/h4>\n\n<ul>\n<li>Paystack and Flutterwave, with webhook plus server-side verification<\/li>\n<li>The amount is always set on the server \u2014 the browser can never change the price<\/li>\n<li>Idempotent recording \u2014 a webhook and a browser callback can both fire without double-counting<\/li>\n<\/ul>\n\n<h4>Display and results<\/h4>\n\n<ul>\n<li><code>[kvote_contest]<\/code> \u2014 a responsive grid of contestants with vote buttons<\/li>\n<li><code>[kvote_leaderboard]<\/code> \u2014 a ranked standings board with vote bars<\/li>\n<li>A mobile-friendly vote popup, and a Primary colour setting to match your site<\/li>\n<\/ul>\n\n<h4>Administration and audit<\/h4>\n\n<ul>\n<li>A paginated Voting Logs screen \u2014 filter by status, voter email, and date range for a full audit trail<\/li>\n<li>Add or set a contestant's vote count manually, recorded as an auditable adjustment<\/li>\n<li>A dashboard with live totals, revenue, and top contestants<\/li>\n<\/ul>\n\n<p>KindlyVote is built on modern, secure, object-oriented foundations and is designed to scale to\nlarge events. For live real-time results, advanced analytics, and fully hosted elections, see\nKindlyVote Cloud at https:\/\/kindlyvote.com.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on third-party payment and bot-protection services. None of them are contacted\nuntil you enable and configure that specific service in the plugin settings. If you run only free\nevents with no CAPTCHA, the plugin makes no external connections.<\/p>\n\n<p><strong>Paystack<\/strong> (payment gateway)<\/p>\n\n<ul>\n<li>What it is and why: a payment gateway used to collect votes as payments on paid events.<\/li>\n<li>What is sent and when: when a voter chooses to pay, the plugin loads Paystack's checkout script\nfrom <code>js.paystack.co<\/code> and sends the transaction details (amount, currency, a unique reference, and\nthe voter's email) to <code>api.paystack.co<\/code> to create and then verify the payment. Verification also\nhappens server-to-server against <code>api.paystack.co<\/code>, and Paystack confirms payments back to your\nsite via a signed webhook.<\/li>\n<li>Conditions: only on paid votes, and only if you have entered your Paystack API keys.<\/li>\n<li>Terms of service: https:\/\/paystack.com\/terms<\/li>\n<li>Privacy policy: https:\/\/paystack.com\/privacy\/merchant<\/li>\n<\/ul>\n\n<p><strong>Flutterwave<\/strong> (payment gateway)<\/p>\n\n<ul>\n<li>What it is and why: a payment gateway used to collect votes as payments on paid events.<\/li>\n<li>What is sent and when: when a voter chooses to pay, the plugin loads Flutterwave's checkout script\nfrom <code>checkout.flutterwave.com<\/code> and sends the transaction details (amount, currency, a unique\nreference, and the voter's email) to Flutterwave. Verification happens server-to-server against\n  api.flutterwave.com, and Flutterwave confirms payments back to your site via a signed webhook.<\/li>\n<li>Conditions: only on paid votes, and only if you have entered your Flutterwave API keys and selected\nFlutterwave as a gateway.<\/li>\n<li>Terms of service: https:\/\/flutterwave.com\/terms<\/li>\n<li>Privacy policy: https:\/\/flutterwave.com\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>Cloudflare Turnstile<\/strong> (optional CAPTCHA)<\/p>\n\n<ul>\n<li>What it is and why: a bot-protection challenge on the free vote form, used only if you enable\nTurnstile as your CAPTCHA provider.<\/li>\n<li>What is sent and when: when the vote form is shown, the challenge widget is loaded from\n  challenges.cloudflare.com; on submit, the challenge token and the visitor's IP are sent\nserver-to-server to <code>challenges.cloudflare.com\/turnstile\/v0\/siteverify<\/code> to confirm the visitor is\nhuman.<\/li>\n<li>Conditions: only on free-vote submissions, and only if Turnstile is configured.<\/li>\n<li>Terms of service: https:\/\/www.cloudflare.com\/website-terms\/<\/li>\n<li>Privacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/li>\n<\/ul>\n\n<p><strong>Google reCAPTCHA<\/strong> (optional CAPTCHA)<\/p>\n\n<ul>\n<li>What it is and why: a bot-protection challenge on the free vote form, used only if you enable\nreCAPTCHA as your CAPTCHA provider.<\/li>\n<li>What is sent and when: when the vote form is shown, the reCAPTCHA widget is loaded from\n  www.google.com\/recaptcha; on submit, the challenge token and the visitor's IP are sent\nserver-to-server to <code>www.google.com\/recaptcha\/api\/siteverify<\/code> to confirm the visitor is human.<\/li>\n<li>Conditions: only on free-vote submissions, and only if reCAPTCHA is configured.<\/li>\n<li>Terms of service: https:\/\/policies.google.com\/terms<\/li>\n<li>Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>kindlyvote<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it from the Plugins screen.<\/li>\n<li>Activate the plugin through the \"Plugins\" menu in WordPress.<\/li>\n<li>Set your site timezone under Settings \u2192 General so voting windows are accurate.<\/li>\n<li>Open <strong>KindlyVote \u2192 Settings<\/strong> to choose your currency and, for paid contests, add your payment\ngateway keys.<\/li>\n<li>Create an <strong>Event<\/strong>, add <strong>Categories<\/strong> and <strong>Contestants<\/strong>.<\/li>\n<li>Place the <code>[kvote_contest]<\/code> shortcode (shown on the Categories screen) on any page to start voting,\nand <code>[kvote_leaderboard]<\/code> to show standings.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20know%20how%20to%20code%3F\"><h3>Do I need to know how to code?<\/h3><\/dt>\n<dd><p>No. You manage everything from the WordPress admin and display contestants with a shortcode you copy\nfrom the Categories screen.<\/p><\/dd>\n<dt id=\"which%20payment%20gateways%20are%20supported%3F\"><h3>Which payment gateways are supported?<\/h3><\/dt>\n<dd><p>Paystack and Flutterwave. You can enable one or both and choose a primary gateway.<\/p><\/dd>\n<dt id=\"can%20i%20run%20a%20completely%20free%20election%3F\"><h3>Can I run a completely free election?<\/h3><\/dt>\n<dd><p>Yes. Set an event to \"free\" mode and no payment is required \u2014 ideal for internal or community elections.<\/p><\/dd>\n<dt id=\"are%20votes%20counted%20before%20payment%20is%20confirmed%3F\"><h3>Are votes counted before payment is confirmed?<\/h3><\/dt>\n<dd><p>No. Paid votes are recorded only after the gateway's webhook confirms and the payment is re-verified\non your server. The vote amount is always calculated server-side, so it cannot be tampered with.<\/p><\/dd>\n<dt id=\"how%20do%20i%20display%20contestants%20on%20a%20page%3F\"><h3>How do I display contestants on a page?<\/h3><\/dt>\n<dd><p>Use the <code>[kvote_contest]<\/code> shortcode. The Categories screen shows the exact shortcode for each category\n(with its ID filled in) \u2014 just copy and paste it onto any page or post.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20each%20person%20to%20one%20vote%3F\"><h3>Can I limit each person to one vote?<\/h3><\/dt>\n<dd><p>Yes. For free events you can allow one vote per email \u2014 per contestant, per category, per event \u2014 or\nallow unlimited votes. Paid votes are never limited, since each vote is purchased.<\/p><\/dd>\n<dt id=\"which%20currencies%20are%20supported%3F\"><h3>Which currencies are supported?<\/h3><\/dt>\n<dd><p>Nigerian Naira (NGN), Ghanaian Cedi (GHS), South African Rand (ZAR), Kenyan Shilling (KES), Rwandan\nFranc (RWF), and West African CFA Franc (XOF).<\/p><\/dd>\n<dt id=\"does%20uninstalling%20delete%20my%20data%3F\"><h3>Does uninstalling delete my data?<\/h3><\/dt>\n<dd><p>Only if you choose to. Data is preserved by default; enable \"Delete all data on uninstall\" in\nSettings if you want everything removed when the plugin is deleted.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Renamed all internal registrations (post types, taxonomy, shortcodes, AJAX actions, capability,\nmeta keys, and database tables) to use a longer, more distinctive prefix, preventing name\ncollisions with other plugins. The front-end shortcodes are now <code>[kvote_contest]<\/code> and\n  [kvote_leaderboard] (the legacy <code>[kindlyvote_contest]<\/code> alias still works).<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Fixed: a contestant's video URL now appears as a \"Watch video\" link on the front-end contestant\ncard (the field was previously saved but not displayed).<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Code-quality and security hardening pass (output escaping and autoloader robustness) plus readme\nimprovements for the WordPress.org listing.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Front end: the Vote button now opens a modal popup (better on mobile than inline fields).<\/li>\n<li>Settings: a Primary colour option drives vote buttons, leaderboard bars, and highlights.<\/li>\n<li>Dashboard: added KindlyVote Cloud and KindlyVote AI cards.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Dashboard: added a \"KindlyVote Cloud\" panel highlighting hosted-platform features.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Categories screen now offers a ready-to-copy, category-scoped [kv_leaderboard] shortcode alongside\nthe contestants one, so leaderboards are scoped by default.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: contestant photo gallery \u2014 add multiple images from the media library (drag to reorder);\nthumbnails on the contestant card swap the main photo.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>New: a Shortcodes reference page (KindlyVote \u2192 Shortcodes) documenting every shortcode with\nattributes and copy-ready examples.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: [kv_leaderboard] shortcode \u2014 a ranked standings board (by category, event, or overall) with\nvote bars and optional photos.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Contestants: added profile fields \u2014 brand\/business name, contest number, social links, and a video\nURL, shown on the front-end contestant cards.<\/li>\n<li>Contestants: set a vote count to an exact number directly (recorded as a single ledger adjustment,\nso totals stay auditable).<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Voting Logs: added a From \/ To date-range filter.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>New: Voting Logs admin page \u2014 a paginated, filterable audit view of every free, paid, and manual\nvote (status and voter-email filters).<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Voting window: interpret event start\/end in the site timezone, and clearly distinguish \"Voting\nopens on \" (not started) from \"Voting has closed\".<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Voting form: show the allowed email domain(s) as a hint, with an instant client-side check before\nsubmit (the server still enforces eligibility).<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Events: restrict voting to specific email domains (e.g. only @company.com) via a per-event\n\"Allowed email domains\" setting. Applies to free and paid voting.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Anti-fraud: optional CAPTCHA on free voting \u2014 Cloudflare Turnstile or Google reCAPTCHA, with\nserver-side token verification.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Free voting: added a \"Free vote limit\" setting to control repeat votes from the same email \u2014 per\ncontestant (default), per category, per event, or unlimited.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Flutterwave: reliably dismiss the inline checkout after a successful payment.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial build: events, contestants, categories, settings, and lifecycle management.<\/li>\n<\/ul>","raw_excerpt":"Modern voting &amp; elections for WordPress \u2014 events, contestants, and webhook-verified payments for Africa.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/363110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=363110"}],"author":[{"embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/generalistsam"}],"wp:attachment":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=363110"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=363110"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=363110"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=363110"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=363110"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=363110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}