Description
Raffle for WooCommerce helps you run raffles and sell tickets through your WooCommerce store. Create unlimited raffles, generate printable tickets with QR codes, and let customers buy tickets for someone else. Perfect for charities, clubs, schools, and promotional giveaways.
This plugin is completely free. No premium version. No feature locks. Everything works
out of the box.
Buy Tickets for Someone Else
This is the feature that makes us different. Your customers can purchase raffle tickets as a gift for friends, family, or colleagues. The recipient gets an email notification with their ticket details. Their name goes into the draw, not the buyer’s name.
This works great for:
- Charity supporters buying tickets for elderly relatives who cannot purchase online.
- Club members purchasing tickets for their family.
- Businesses buying raffle entries for employees or clients.
- Anyone who wants to gift a chance to win.
All Features Included
Every feature listed below is free. No upgrades needed.
Raffle Management:
- Unlimited raffles with no restrictions.
- Unlimited ticket sales per raffle.
- Configurable start and end dates with live countdown timer.
- Progress bar displaying tickets sold vs available.
- Auto-close raffles when all tickets are sold.
- Full WooCommerce integration with all payment gateways.
- Mass refund and selective refund with three methods: standard, payment gateway, or wallet credit via TeraWallet.
Gift Purchases:
- Gift ticket purchasing with automatic recipient notification.
- Per-ticket gift recipient assignment with name, email, and personal message.
- Works with both WooCommerce Block Checkout and Classic Checkout.
Winner Selection & Management:
- Winner selection through manual picks, automatic draws, or Random.org verified selection.
- Winner management tabs: All Tickets, Winners, and Claimed for cross-raffle overview.
- Quick “Mark Claimed” and “Resend Notification” buttons with bulk claim action.
- Prize claimed confirmation email to winners when their prize is marked as claimed.
Shortcodes:
[raffle_card id="123"]– Full product card with image, countdown, prize, and buy button.[raffle_cards]– Multiple raffle cards in a responsive grid:[raffle_cards ids="123,456,789"]– Display specific raffles by ID.[raffle_cards category="prizes" limit="4"]– Display raffles from a product category.[raffle_cards status="active" limit="6" columns="3"]– All active raffles in a 3-column grid.[raffle_cards status="all" orderby="random" limit="8"]– All raffles in random order.
[raffle_countdown id="123"]– Live countdown timer (compact or full format).[raffle_progress id="123"]– Ticket sales progress bar.[raffle_prize id="123"]– Prize information display.[raffle_status id="123"]– Status badge (Active / Ended / Winner Selected / Cancelled / Failed / Coming Soon / Sold Out).[raffle_winners id="123"]– Winner announcement banner with Gravatar, city, ticket number, and product link. Attributes:show_avatar,show_city,show_ticket,show_date,show_link,limit.- All shortcodes support
id="latest"andid="active"keywords to auto-pick raffles.
Tickets & Validation:
- Printable ticket generation with unique ticket numbers.
- QR code generation for checking tickets at events.
- QR code scanner in admin for live event validation.
- CSV export for all ticket data.
- Ticket search by number, name, or email.
Email Notifications (6 built-in):
- Ticket Confirmation sent to purchaser after buying tickets.
- Gift Received sent to gift recipients with their ticket details.
- Winner Notification sent to winners when they are drawn.
- Prize Claimed Confirmation sent to winners when their prize is marked as claimed.
- Admin Winner Alert sent to admin when a winner is selected.
- Admin Draw Failed Alert sent to admin when an automatic draw fails.
- All emails are configurable in WooCommerce > Settings > Raffle > Emails and in WooCommerce > Settings > Emails.
Display Options:
- Winner announcement banner with Gravatar, city, ticket number, and product link.
- Compact countdown badge on shop and archive pages (optional setting).
- Urgency color shift when less than 3 days remain.
- Status badges on archive pages: Winner Selected, Ended, Cancelled, and Failed.
- Customizable primary color, badge text, and footer for printable tickets.
Compliance & Legal:
- Skill-testing question system with configurable question pool (text and multiple choice). Global pool questions are pinned per product for consistency.
- Free entry route with “Paid Entry” / “Free Entry” tab interface for jurisdictions requiring “no purchase necessary” alternatives. Includes the skill-testing question so postal entrants know what to answer.
- Per-product compliance overrides to enable or disable skill questions and free entry on individual raffles.
- Store address auto-replacement in free entry instructions using the
[Your Address]placeholder.
Analytics & Reporting:
- Analytics dashboard showing sales and performance.
- Activity log tracking ticket generation, winner draws, prize claims, and more.
- Full audit trail for charity compliance and reporting.
- GDPR compliant with personal data export and erasure.
Technical:
- Works with WooCommerce High Performance Order Storage (HPOS).
- Works with WooCommerce Block Checkout.
- REST API available for custom integrations.
- Translation ready for any language.
- Hooks and filters throughout for customization.
Who Should Use This Plugin
- Charities and nonprofits running online fundraisers.
- Golf clubs, sports clubs, and social clubs doing member prize draws.
- Schools and parent associations raising funds.
- Churches and community groups organizing raffles.
- Local businesses running customer promotions.
- Online stores creating giveaways and contests.
How to Create Your First Raffle
- Add a new product in WooCommerce.
- Select Raffle as the product type.
- Set your ticket price and how many tickets you want to sell.
- Choose start and end dates for your raffle.
- Turn on gift purchasing if you want customers to buy for others.
- Publish your raffle and start selling.
- When the raffle ends, pick a winner manually or let the system choose automatically.
- The winner gets an email with prize details.
Embed Raffles Anywhere with Shortcodes
Use shortcodes to display raffle information on any page, post, or landing page, not just WooCommerce product pages.
The [raffle_card] shortcode gives you a complete, self-contained raffle preview with image, countdown, prize, and buy button. Perfect for homepages, blog posts, and landing pages. Use [raffle_cards] to display multiple raffles in a responsive grid. Filter by IDs, category, or status with customizable columns. Use [raffle_winners] to showcase past winners with their avatar, city, and winning ticket on a dedicated Winners page.
All shortcodes accept a product ID or use id="latest" / id="active" to automatically pick the most relevant running raffle. See the full documentation for examples.
Built for Developers
- Compatible with WooCommerce 8.0 and newer.
- Works with High Performance Order Storage out of the box.
- Block checkout support included.
- REST API available for custom integrations.
- Translation ready for any language.
- Hooks and filters throughout for customization.
Get Help
- Read the documentation at Themology.
- Ask questions in the WordPress.org support forum.
- Visit Themology.com for bug reports or feature requests.
External Services
This plugin connects to the following external services to provide certain functionality.
QR Server API
The plugin generates QR code images for raffle tickets using the QR Server API.
What gets sent: Only the ticket validation URL that gets encoded into the QR image. No personal information is transmitted.
When this happens: When a customer views or prints their ticket.
Provider: Foundata GmbH (Germany)
Privacy policy: goqr.me/de/rechtliches/datenschutz-qrserver.html
The API is free and does not require registration.
Random.org (Optional)
When you select a winner using the Random.org method, the plugin requests random numbers from their API. This gives you certified random selection for fair draws.
What gets sent: A request for random numbers. No customer data or personal information leaves your site.
When this happens: Only when you click the button to select a winner using Random.org. Never automatic.
You can read their terms at random.org/terms and their privacy policy at random.org/privacy.
You do not need to use Random.org. Manual and automatic selection work without any external connections.
Screenshots

Plugins Settings 
Plugins Settings 
Plugins Settings 
Plugins Settings 
Plugins Settings 
Countdown timer and progress bar on the product page. 
Gift ticket purchase option at checkout. 
Admin order details. 
Customer ticket list in My Account. 
Printable ticket with QR code. 
Admin winner selection screen. 
Raffle product settings showing dates and ticket limits. 
Ticket management list 
QR code scanner for event check in. 
Analytics dashboard with sales data. 
Prize claimed.
Installation
Install from WordPress
- Go to Plugins then Add New in your WordPress admin.
- Search for Raffle for WooCommerce.
- Click Install Now and then Activate.
- Go to WooCommerce then Settings then Raffle to set up your options.
Install Manually
- Download the plugin zip file.
- Go to Plugins then Add New then Upload Plugin.
- Upload the zip file and click Activate.
- Go to WooCommerce then Settings then Raffle to set up your options.
What You Need
- WordPress 6.0 or newer.
- WooCommerce 8.0 or newer.
- PHP 7.4 or newer.
FAQ
-
Is this plugin actually free?
-
Yes. Every feature works without paying anything. We built this plugin because charities and small organizations deserve good raffle tools without expensive subscriptions.
-
How does gift ticket purchasing work?
-
When a customer adds raffle tickets to their cart, they can choose to buy them as a gift. They enter the recipient’s name and email at checkout. The recipient gets an email saying they received raffle tickets. The recipient’s name appears on the ticket and enters the draw.
-
What winner selection options do I have?
-
You can pick winners three ways. Manual selection lets you browse all tickets and choose yourself. Automatic selection picks a random winner when the raffle ends. Random.org selection uses their certified random number service for verified fair draws.
-
Can I run multiple raffles at the same time?
-
Yes. Create as many raffles as you need. Each raffle is a separate WooCommerce product with its own settings.
-
How do customers see their tickets?
-
Customers can view all their raffle tickets in the My Account section. They can also print tickets with QR codes for each entry.
-
Can I check tickets at a live event?
-
Yes. Use the QR code scanner in your WordPress admin. Scan the QR code on any ticket to verify it and mark it as checked in.
-
Does this work with WooCommerce subscriptions?
-
This plugin handles one time raffle ticket purchases. You can create new raffles whenever you want.
-
Can I export ticket data?
-
Yes. Export all tickets to a CSV file from the admin dashboard. Filter by raffle, date, or status before exporting.
-
Is this plugin GDPR compliant?
-
Yes. The plugin integrates with WordPress privacy tools. Customers can request their data or ask for deletion. Gift recipient data is only used for ticket delivery and draw purposes.
-
Can I display raffle countdowns or cards on any page?
-
Yes. The plugin includes seven shortcodes you can use on any page, post, or landing page. Use
[raffle_card id="123"]for a full product card with image, countdown, and buy button, or[raffle_cards ids="123,456" columns="3"]to display multiple raffles in a grid. Use[raffle_countdown id="123"]for just the timer,[raffle_progress id="123"]for the progress bar,[raffle_prize id="123"]for prize info,[raffle_status id="123"]for a status badge, or[raffle_winners id="123"]to display the winner announcement with avatar, city, and ticket details. You can also useid="latest"orid="active"instead of a product ID. -
Can I show countdown timers on the shop page?
-
Yes. Go to WooCommerce > Settings > Raffle > Display and enable “Show Countdown on Shop Pages.” This adds a compact countdown badge below the price for raffle products on shop and category archive pages. Products with less than 3 days remaining show an urgency-colored badge.
-
How do I manage winners across all raffles?
-
Go to WooCommerce > Raffle Tickets. The page has three tabs: All Tickets, Winners, and Claimed. The Winners tab shows all winners across all raffles with quick “Mark Claimed” and “Resend Notification” buttons. You can also bulk-select winners and mark them as claimed in one click. The per-product Winner Selection metabox on the product edit page still works for per-raffle management.
-
What email notifications does the plugin send?
-
The plugin includes six email notifications: Ticket Confirmation (to purchaser), Gift Received (to gift recipient), Winner Notification (to winner), Prize Claimed Confirmation (to winner when claimed), Admin Winner Alert (to admin), and Admin Draw Failed Alert (to admin). Each can be toggled on or off in WooCommerce > Settings > Raffle > Emails, and customized in WooCommerce > Settings > Emails.
-
Will this work with my theme?
-
Yes. The plugin uses minimal styling and inherits your theme’s appearance. It works with any theme that supports WooCommerce.
-
Can I customize the printable tickets?
-
Yes. You can customize the primary color, badge text, and footer message in WooCommerce Settings under the Raffle > Print Ticket section. Email templates use the standard WooCommerce email system.
-
What happens if a winner does not claim their prize?
-
You can redraw a new winner from the admin panel. The original winner can be marked as unclaimed.
-
How do skill-testing questions work?
-
Go to WooCommerce > Settings > Raffle > Compliance and enable Skill-Testing Questions. Build a question pool with text or multiple choice questions. When enabled, customers see a randomly selected question on the product page and must answer correctly to add tickets to the cart. Answers are validated server-side with secure hashing. You can also override the global setting per product in the product’s Compliance Settings tab.
-
How do refunds work for failed or cancelled raffles?
-
Go to WooCommerce > Raffle Tickets > Mass Refund tab. Select a failed or cancelled raffle and click “Refund All Tickets”. You can also select individual tickets from the All Tickets tab and refund just those. Three refund methods are available: Standard refund (creates WooCommerce refund records for manual processing), Refund via payment gateway (automatically returns money for Stripe, PayPal, etc., with fallback for offline gateways), and Refund to wallet (credits the customer’s TeraWallet balance so they can reuse it for future purchases). The wallet option requires the free TeraWallet plugin to be installed and active.
-
What is the free entry route?
-
The free entry option adds a “Paid Entry” / “Free Entry” tab interface on the raffle product page. This satisfies “no purchase necessary” requirements in jurisdictions like Canadian provinces. Enable it in WooCommerce > Settings > Raffle > Compliance and write your own instructions. Use the
[Your Address]placeholder to auto-insert your WooCommerce store address. You can also override this per product.
Reviews
Contributors & Developers
“Raffle for WooCommerce” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Raffle for WooCommerce” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.10
Released February 2026.
New Features:
- New: Enhanced winner announcement banner — now displays winner’s Gravatar/profile picture, city (from billing data), and a link to the raffle product page. City display respects the existing
rfwc_mask_winner_namefilter for privacy. A newrfwc_show_winner_cityfilter allows stores to disable city display. - New:
[raffle_winners]shortcode to display winner announcements on any page or post. Supports attributes:id(required — product ID, “latest”, or “active”),show_avatar,show_city,show_ticket,show_date,show_link, andlimit. Reuses the existing winner banner styling. - New: Search and CSV export on the Winners, Claimed, and Mass Refund admin tabs. All tabs are now self-sufficient with their own search box and export button, matching the All Tickets tab functionality.
Improvements:
- Renamed the “Refunded” top-level tab to “Mass Refund” to clearly distinguish it from the “Refunded” status filter within the All Tickets tab. This eliminates the “2 refunded sections” confusion reported by users.
- Raffle filter dropdowns throughout the Tickets admin page now group raffles by status (Active, Upcoming, Ended, Completed, Failed, Cancelled) using
<optgroup>headers, making it much easier to find specific raffles on stores with many raffles.
Bug Fixes:
- Fixed theme compatibility issue where themes applying
display: flextoform.cart(Campo, Astra, OceanWP, Kadence, etc.) would compress the raffle quantity input and make it visually invisible. The plugin now resetsform.carttodisplay: blockon raffle product pages.
1.0.9
Released February 2026.
New Features:
- New: Wallet refund support via TeraWallet. When the plugin is active, a “Refund to wallet” option appears in both the mass refund and selective refund modals, crediting the refund amount directly to each customer’s wallet balance.
- New: Refund method selection has been upgraded from a single checkbox to a clear radio button group: Standard refund, Refund via payment gateway, and Refund to wallet (when TeraWallet is active).
- New: “Wallet Refunded” badge (indigo) on the Refunded tab for orders refunded to wallet, with corresponding filter option.
Improvements:
- Improved refund mode UI. The gateway checkbox has been replaced with explicit radio options that better communicate what each refund method does, reducing confusion around manual/offline refunds.
- Guest orders gracefully fall back to standard refund when wallet refund is selected, since guest accounts cannot hold wallet balances. A clear info notice now explains this in the results modal.
Bug Fixes:
- Fixed wallet credit failure silently reported as successful. If TeraWallet’s credit() call fails (locked account, DB error), the refund now correctly falls back to “Manual – Action Required” instead of showing “Wallet Refunded” with no actual credit applied.
- Fixed mass refund confirmation dialog showing incorrect total when store has taxes enabled. The preview amount now includes line item tax, matching the actual refund amount.
- Fixed selective refund confirmation dialog using current product price instead of actual order line item amounts. The preview now calculates from order data including tax, accounting for coupons, sale prices, and price changes since purchase.
- Fixed guest fallback notice (walletGuestFallback) defined in PHP but never displayed in JavaScript. When wallet refund is selected and guest orders fall back to manual, both the mass and selective refund result modals now show an explanatory info notice.
1.0.8
Released February 2026.
New Features:
- New: Mass refund system for failed and cancelled raffles. Select a raffle from the Refunded tab, and all ticket orders are refunded in batch with a live progress bar and confirmation dialog showing order count and total amount.
- New: “Cancelled” raffle status. Admins can now cancel an active raffle at any time, which stops ticket sales and makes the raffle eligible for mass refund.
- New: Admin UI to manually fail or cancel a raffle from the product edit screen or via quick action on the Tickets page.
- New: Selective refund from the ticket list. Select individual tickets and refund only those, with automatic partial refund amount calculation per line item.
- New: Smart Refund Mode. Gateway-aware mass and selective refunds. A “Refund via payment gateway” checkbox in the refund modal attempts automated refunds for Stripe, PayPal, etc., and gracefully falls back to manual refund records for offline gateways (BACS, COD, check).
- New: Manual Refund Tracker. After processing refunds, orders paid via offline gateways are listed in a warning table with clickable order links, amounts, and payment methods. Includes a “Copy List” button for exporting to spreadsheets.
- New: Persistent refund tracking on the Refunded tab. Each order stores its refund method and displays color-coded badges: “Gateway Refunded” (green), “Manual – Action Required” (amber), or “Manual – Done” (teal).
- New: “Mark Done” button on manual refund rows. Admins click it after sending money offline. Updates the badge and adds a WooCommerce order note for audit trail.
- New: Refund method filter on the Refunded tab. Filter by “Gateway Refunded”, “Manual – Action Required”, or “Manual – Done” to quickly find orders needing attention.
- New: Ticket Status Distribution doughnut chart on the Analytics page showing Active, Winners, Cancelled, and Refunded ticket counts.
- New: Skill question compliance audit trail. The question text, answer type, pass result, and timestamp are saved as order item meta and displayed in the admin order Raffle Information metabox.
- New: Bulk/Tiered Ticket Pricing. Define up to 5 percentage-based volume discount tiers per raffle (e.g., “5+ tickets = 10% off”). Discounts are calculated from the total ticket quantity in the cart and applied automatically at checkout with a live price preview on the product page.
Bug Fixes:
- Fixed shop archive and shortcodes showing “Winner Selected” for cancelled and failed raffles. Cancelled raffles now show “Cancelled” and failed raffles show “Failed” on archive badges and the
[raffle_status]shortcode. - Fixed single product page showing no message for cancelled or failed raffles. Previously, these raffles silently hid the add-to-cart form with no explanation. Now shows “This raffle has been cancelled.” or “This raffle did not reach its goal and has ended.”
- Fixed ticket scanner manual entry not finding tickets when the ticket prefix has no dash separator. Entering a formatted number like “RFW0YT6U7E2” returned “Ticket not found” because the lookup only handled dash-separated prefixes (e.g., “RFL-0002”). The scanner now collects all known ticket prefixes and strips them to match the raw ticket number.
- Fixed free entry tab not showing skill question answer choices. The Paid Entry tab displayed multiple-choice options correctly, but the Free Entry tab only showed the question text. Postal entrants could not see the possible answers.
- Fixed compact countdown timers wrapping to a second line in product grid cards and not loading on the homepage. The pill badges had a CSS display issue causing full-width rendering, and JS/CSS were not enqueued on
is_front_page()pages. - Fixed “Max per customer” setting not being enforced consistently. The product page allowed quantities up to the configured limit, but the cart (both classic and block) would reset non-gift quantities to 1 regardless of the setting. All code paths now respect the admin-configured limit.
Improvements:
- Improvement: Failed and cancelled raffles now appear in the Analytics dashboard activity log with dedicated event types and icons.
- Improvement: Payment and Refund Status columns added to the Refunded tab table for better admin visibility and money tracking.
- Improvement: Replaced the “Gift vs Self Purchases” doughnut chart with the more useful “Ticket Status Distribution” chart. Gift data is already shown in the stat cards and the line chart.
- Improvement: Cart quantity display now renders an editable input when max per customer is greater than 1 or bulk discounts are configured, instead of always showing a fixed “1” span.
1.0.7
Released February 2026.
Improvements:
- Improvement: Global pool skill-testing questions are now pinned per product. When a raffle uses the global question pool, a question is randomly assigned once on first page view and persists permanently, ensuring postal (free entry) participants always see the same question. Previously, a random question was selected on every page load.
- Improvement: New searchable “Pinned question” dropdown on the raffle product edit screen lets admins browse and select a specific question from the global pool, or leave it on auto-assign for automatic selection on first customer visit.
- Improvement: The free entry (postal) tab on the product page now displays the skill-testing question text so postal entrants know which question to answer in their mail entry.
- Improvement: New “Frontend Accent Color” setting under Display lets store owners customize the accent color for all raffle UI elements (countdown, progress bar, prize badges, tabs, buttons, etc.). All 20+ hardcoded color instances have been replaced with CSS custom properties for full flexibility.
- Improvement: The postal address in the free entry instructions is now automatically highlighted with bold text and a subtle green background tint for better visibility.
1.0.6
Released February 2026.
New Features:
- New: Skill-testing question system for Canadian and legal compliance. Configure a global question pool with text and multiple choice questions. Customers must answer correctly before adding raffle tickets to the cart.
- New: Free entry route with “Paid Entry” / “Free Entry” tab interface on the product page. Meets “no purchase necessary” requirements for jurisdictions that require an alternative entry method.
- New: Per-product compliance overrides. Enable or disable skill-testing questions and free entry on individual raffle products, with optional custom question pools per product.
- New: Store address auto-replacement in free entry instructions using the
[Your Address]placeholder, pulling from WooCommerce store settings.
Bug Fixes:
- Fixed cart quantity enforcement when switching from regular purchase to gift at checkout. Per-customer limits are now correctly bypassed for gift items.
- Fixed
get_max_purchase_quantity()to skip per-customer limit when cart items are flagged as gift, preventing quantity cap from blocking multiple gift recipients. - Fixed race condition in Block Checkout where
updateCartQuantity()could fire beforeupdateServerData()completed, causing the gift flag to be missing when the server enforced limits. - Fixed gift flag propagation.
handle_gift_data_update()now sets therfwc_is_giftflag directly on cart item data, not just in the WC session. - Fixed classic checkout AJAX handler. Gift items are now explicitly flagged before cart quantity update to prevent enforcement hooks from blocking the change.
- Fixed cart quantity enforcement hooks (
enforce_cart_item_quantity_limitandenforce_cart_item_quantity_display) with WC session fallback for gift data, guarding against race conditions between async API requests. - Fixed PHPCS compliance: explicit
esc_attr()at output point in settings page, collapsed multi-line ternary for proper nonce verification ignore coverage.
Improvements:
- Improved gift checkout flow: customers can now start a regular purchase and switch to gift mode at checkout with full support for adding multiple recipients and automatic quantity adjustment.
- Updated plugin documentation with comprehensive coverage of skill-testing questions, free entry route, shortcodes, per-ticket gift recipients, compliance settings, and all email configurations.
1.0.5
Released February 2026.
Bug Fixes:
- Fixed gift checkout race condition where recipient data could be lost with Block Checkout due to async session sync timing.
- Fixed gift data now embedded directly in checkout request body as a reliable alternative to session-based sync.
- Fixed “Other Tickets” label showing on admin order page for non-gift purchases. Now shows “Raffle Tickets”.
- Fixed empty Gift Details rows appearing on Order Received / My Account when recipient data was missing.
- Fixed ticket generation fallback so partial recipient data still marks tickets as gifts using order-level data.
- Fixed cart quantity enforcement for non-gift purchases.
Improvements:
- Added three-layer data reliability for Block Checkout gift purchases (blocking sync, extension data, and server-side patching).
- Analytics page now gracefully handles Chart.js load failures. Stats and tables still display when charts cannot render.
- Analytics AJAX now shows clear error messages instead of staying on “Loading…” forever when data fetch fails.
New Features:
- New:
[raffle_cards]multi-card shortcode for displaying multiple raffle cards in a responsive grid.[raffle_cards ids="123,456,789"]– Display specific raffles by ID.[raffle_cards category="prizes" limit="4"]– Display raffles from a product category.[raffle_cards status="active" limit="6" columns="3"]– Display active raffles in a 3-column grid.- Supports
orderby(date, price, title, random),order(ASC/DESC),columns(1-4), andlimitparameters. - Responsive grid automatically collapses to fewer columns on smaller screens.
1.0.4
Released February 2026.
Bug Fixes:
- Fix: Progress bar now counts both active and winner tickets as “sold.” Previously, winning tickets were excluded from the count after a draw, making the bar appear to go backwards.
- Fix: Countdown timer now stops immediately when winners are selected early (before the scheduled end date). Previously it kept ticking until the original end date.
New Features:
- New: Compact countdown badge on shop/archive pages. Enable in WooCommerce > Settings > Raffle > Display > “Show Countdown on Shop Pages.” Displays a slim inline “Ends in: 18d 4h 26m” pill under the price for raffle products.
- New: Five shortcodes for embedding raffle data on any page or post:
[raffle_card id="123"]– Full product card with image, countdown, prize, and CTA button.[raffle_countdown id="123"]– Live countdown timer (compact orformat="full").[raffle_progress id="123"]– Ticket sales progress bar.[raffle_prize id="123"]– Prize information display.[raffle_status id="123"]– Status badge (Active / Ended / Winner Selected / Cancelled / Failed / Coming Soon / Sold Out).- All shortcodes support
id="latest"andid="active"keywords.
- New: Winner management tabs on the Raffle Tickets page. Three tabs (All Tickets, Winners, Claimed) give a cross-raffle overview without navigating to individual product pages. Includes quick “Mark Claimed” and “Resend Notification” buttons, bulk claim action, and raffle filter.
- New: Prize Claimed Confirmation email. When an admin marks a winner’s prize as claimed, the winner receives a confirmation email. Configurable in WooCommerce > Settings > Raffle > Emails and customizable in WooCommerce > Settings > Emails.
- New: All mark-claimed actions (single, bulk, and product metabox) are logged to the activity trail and trigger the prize claimed email notification.
1.0.3
Released February 2026.
Security:
- Security: Fixed XSS vulnerability in QR scanner JavaScript where unescaped raffle and holder names could execute scripts in admin context.
- Security: Fixed XSS vulnerability in analytics JavaScript where raffle and purchaser names were injected via raw HTML concatenation.
- Security: QR code verification hashes are now computed locally using wp_hash(). No ticket data beyond the validation URL is sent to the QR image API.
- Security: Public QR validation page now masks ticket holder names for GDPR compliance. Full names only shown in admin scanner.
New Features:
- New: Admin Winner Alert email notification. Sends email to admin when a winner is drawn. Uses the existing setting in Raffle > Emails, now fully wired.
- New: Admin Draw Failed Alert email notification. Sends email to admin when an automatic draw fails. New setting added in Raffle > Emails.
- New: Ticket search in admin. Search box on the Raffle Tickets page searches across ticket number, recipient name, recipient email, purchaser name, and purchaser email. Works with status tabs and CSV export.
- New: Activity Log section on the Analytics page showing recent raffle events like ticket generation, winner draws, and errors.
- New: Per-ticket gift recipient assignment. Each raffle ticket can now have its own unique recipient with separate name, email, and personal gift message.
- New: Full gift checkout support for WooCommerce Classic (shortcode) Checkout, matching the Block Checkout experience with dynamic add/remove recipient fields.
Enhancements:
- Enhancement: Adding or removing gift recipients in Classic Checkout now automatically updates the order summary and totals via AJAX.
- Enhancement: Theme-aware styling for gift checkout fields. Interactive elements inherit the theme primary color via CSS custom properties across both checkout types.
- Enhancement: Admin orders list Gift column now shows recipient count or single recipient name instead of a basic flag.
- Enhancement: Contextual empty state messages for ticket tabs (e.g., “No winners have been drawn yet” for Winners tab).
- Enhancement: Search respects current status tab filter. Tab highlighting stays active during search. Clear search on tab click.
Bug Fixes:
- Fix: Winners tab always showed 0 results because winner selection set ticket status to ‘won’ instead of the valid ‘winner’ status.
- Fix: Raffle email settings (ticket confirmation, gift notification, winner notification) were dead checkboxes with no implementation. All three are now wired to their email classes.
- Fix: Duplicate ticket generation from concurrent order status transitions. Added transient-based mutex lock.
- Fix: No availability check during ticket generation. Quantity is now clamped if raffle capacity is exceeded.
- Fix: Winner save failure was silently ignored. Now rolls back the transaction and returns an error.
- Fix: Winner transaction used a non-locking read allowing concurrent draws to both succeed. Added SELECT FOR UPDATE.
- Fix: Completed and failed raffles still showed “Buy Ticket” button. Now checks raffle status in is_active().
- Fix: Cancelling an order overwrote winner ticket status. Winner tickets are now skipped during cancellation.
- Fix: Cart quantity update on cart page bypassed raffle validation. Added woocommerce_update_cart_validation hook.
- Fix: No date validation on product save. Added format validation, range checks, and end-after-start cross-field validation.
- Fix: Resend winner notification also triggered a duplicate admin alert. Now calls the email directly.
- Fix: Failed auto-draws no longer cause infinite retry loops. Raffle is marked as failed after draw failure.
- Fix: Timezone handling uses wp_timezone() consistently for raffle start/end times.
- Fix: Audit logging now writes to the correct database column.
- Fix: Manual winner selection now properly marks the raffle as completed.
- Fix: Server-side cart validation enforces raffle status, ticket availability, and per-customer limits.
- Fix: Tickets reactivate when an order is restored from cancelled status.
- Fix: schedule_draw() uses correct timezone conversion for WP-Cron scheduling.
- Fix: Random.org fallback proof metadata is preserved in the audit trail.
- Fix: Deleted orders now cancel their associated tickets for both legacy and HPOS storage.
- Fix: Analytics CSV exports via Blob download instead of server-side file, avoiding PII files left on disk.
- Fix: Order received page, My Account order details, and admin order metabox now display all gift recipients with their assigned ticket numbers instead of only the first.
- Fix: Gift recipient emails are now sent per unique recipient with only their specific tickets, instead of all tickets going to the first recipient.
- Fix: Block Checkout race condition resolved. Recipient data is synced immediately on add/remove and verified before order submission.
- Fix: Removed “(optional)” label from the gift checkbox in Classic Checkout.
- Fix: Hidden raw order item meta from the admin order items display.
- Fix: Fuzzy LIKE lookup in QR validation now uses LIMIT 1 to prevent matching wrong tickets.
- Fix: Broken HTML in recent validations table from misuse of esc_attr() on inline styles.
- Fix: Missing public_scan source label in validation log.
Developer / Code Quality:
- Dev: Duplicate QR hash generation logic consolidated into a single method.
- Dev: Removed duplicate RFWC_Settings and RFWC_Admin_Notices instantiations.
- Dev: Removed dead code: show_if_raffle() empty method and get_bulk_print_url() unused method.
- Dev: Removed phantom rfwc_daily_cleanup dead code.
- Dev: Added missing purchaser_email database index for ticket lookups.
- Dev: Added request-level caching for get_tickets_sold() to avoid repeated COUNT queries.
- Dev: Ticket meta no longer set to autoload in wp_options for better scalability.
- Dev: Expired ticket status now has proper UI support with badge, counts, and translatable labels.
- Dev: Accessibility improvement for analytics filter dropdowns with proper labels.
- Dev: Hardcoded i18n strings in JavaScript moved to wp_localize_script objects.
- Dev: uninstall.php cleans up all new options and meta including HPOS order meta.
- Dev: Deactivation now clears individual raffle draw cron events.
- Dev: WordPress coding standards compliance with translators comments, nonce verification handling, and output escaping.
1.0.2
Released February 2026.
- Fix: Draw Winners success and error messages were not visible (message box stayed hidden). Messages now display correctly.
- Improvement: Draw Winners “Number of winners” reflects the value from product settings; helper text now says “X ticket(s) in the draw” for clarity.
1.0.1
Released February 2026.
- Fix: “Draw Winners” button and related winner UI not working due to class name mismatch (rfw- vs rfwc-).
- Fix: Align all admin and frontend class prefixes to rfwc- for gift checkout, ticket list, order metabox, analytics, ticket generator, and QR validator.
- Fix: QR ticket scanner “Start Camera” and manual validation form not responding (JS selectors now match HTML IDs).
1.0.0
Released January 2026.
- First public release.
- Raffle product type for WooCommerce.
- Gift ticket purchasing with recipient email notifications.
- Printable ticket generation with unique numbers and QR codes.
- QR code validation and event check in system.
- Winner selection with manual, automatic, and Random.org options.
- Multiple winner support for raffles with several prizes.
- Countdown timer widget.
- Progress bar showing tickets sold.
- Customer ticket management in My Account.
- Admin ticket management with filters and export.
- Email notifications through WooCommerce email system.
- Analytics dashboard with charts and statistics.
- Prize fulfillment for product prizes and store credit.
- Full audit trail for compliance.
- GDPR compliant with data export and erasure.
- Works with WooCommerce HPOS.
- Works with WooCommerce block checkout.
