{"id":401880,"date":"2026-11-11T12:01:22","date_gmt":"2026-11-11T12:01:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/gatemi-birthday-coupons\/"},"modified":"2026-11-11T12:01:06","modified_gmt":"2026-11-11T12:01:06","slug":"gatemi-birthday-coupons","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/gatemi-birthday-coupons\/","author":23559004,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Gatemi Birthday Coupons","header_author":"Gatemi","header_description":"Email each customer a single-use coupon for their birthday. One customer, one code a year, tied to them \u2014 and the claim is atomic, so a daily job that runs twice cannot send two.","last_updated":"2026-11-11 12:01:06","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/gatemi-birthday-coupons\/","header_author_uri":"https:\/\/gatemi.com\/","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","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"gatemi","date":"2026-11-11 12:01:06","revision":3796233}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3796233,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3796233,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3796233,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3796233,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3796233,"resolution":"1","location":"assets","locale":"","width":2560,"height":1600},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3796233,"resolution":"2","location":"assets","locale":"","width":2560,"height":1440}},"screenshots":{"1":"The settings screen: the discount, how long the coupon lasts, and where the date is asked for.","2":"The date of birth in My Account, where a customer can change or clear it."}},"plugin_section":[],"plugin_tags":[1435,591,331,3377,286],"plugin_category":[45],"plugin_contributors":[279530],"plugin_business_model":[],"class_list":["post-401880","plugin","type-plugin","status-publish","hentry","plugin_tags-birthday","plugin_tags-coupons","plugin_tags-discount","plugin_tags-loyalty","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-gatemi","plugin_committers-gatemi"],"banners":{"banner":"https:\/\/ps.w.org\/gatemi-birthday-coupons\/assets\/banner-772x250.png?rev=3796233","banner_2x":"https:\/\/ps.w.org\/gatemi-birthday-coupons\/assets\/banner-1544x500.png?rev=3796233","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/gatemi-birthday-coupons\/assets\/icon-128x128.png?rev=3796233","icon_2x":"https:\/\/ps.w.org\/gatemi-birthday-coupons\/assets\/icon-256x256.png?rev=3796233","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/gatemi-birthday-coupons\/assets\/screenshot-1.png?rev=3796233","caption":"The settings screen: the discount, how long the coupon lasts, and where the date is asked for."},{"src":"https:\/\/ps.w.org\/gatemi-birthday-coupons\/assets\/screenshot-2.png?rev=3796233","caption":"The date of birth in My Account, where a customer can change or clear it."}],"raw_content":"<!--section=description-->\n<p>Ask your customers for their date of birth in My Account or on the classic\ncheckout, and a daily job emails each of them a coupon a week before their birthday \u2014\nso it is in their inbox in time, and still valid on the day.<\/p>\n\n<h4>How it works<\/h4>\n\n<p><strong>One customer, one coupon a year \u2014 and the claim is atomic.<\/strong> A daily job is\nexactly the job that runs twice: WP-Cron spawns on page loads, so two visitors\nlanding in the same second can both start the run, and a store with a real\nsystem cron <em>and<\/em> WP-Cron left on has two by construction. The year is claimed\nwith a single database insert that succeeds for exactly one caller, so the\ncustomer gets one birthday coupon however many runs overlap.<\/p>\n\n<p><strong>A birthday is a day in your shop's calendar, not an interval.<\/strong> It is worked\nout in your store's own timezone, so a shop in Auckland does not send its\ncoupons on the wrong day for four months of the year. And 29 February is\nobserved on 28 February in a common year, because somebody born on it has a\nbirthday every year.<\/p>\n\n<p><strong>A date of birth is personal data, and this plugin treats it as such.<\/strong> It is\nstored on the customer's account and nowhere else, shown back to them in My\nAccount so they can change or clear it, included in WordPress' own\npersonal-data export, removed by its erasure request, and <strong>deleted when the\nplugin is uninstalled<\/strong>. The coupons themselves are never deleted: a code you\nhave already emailed is a promise.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>A single-use coupon emailed a week before each customer's birthday<\/li>\n<li>A percentage off, or a fixed amount off the cart<\/li>\n<li>An expiry in days, counted in your store's own timezone and written into the\nemail<\/li>\n<li>Codes with a random tail nobody can guess from their own<\/li>\n<li>The date asked for in My Account, on the classic checkout, or both<\/li>\n<li>Ordinary WooCommerce coupons, so they work at the classic checkout, the\nblock checkout and the Store API with nothing to configure<\/li>\n<li><strong>No tracking, no external requests, ever<\/strong> \u2014 this plugin never phones home<\/li>\n<\/ul>\n\n<h4>Careful about the details<\/h4>\n\n<ul>\n<li>Every coupon is email-restricted, limited to one use in total and one per\ncustomer, and marked individual-use.<\/li>\n<li>A run that misses a day does not send a week of late birthday greetings when\nit comes back. Those days have passed.<\/li>\n<li>Birthdays are found with a meta query, so a store with fifty thousand\ncustomers and two hundred birthdays reads two hundred rows.<\/li>\n<li>A coupon that could not be minted gives its claim back, so the customer is\nnot silently skipped for the year.<\/li>\n<li>The date is only ever stored on a customer account \u2014 a guest checkout has\nnowhere to keep one.<\/li>\n<\/ul>\n\n<h4>The full edition<\/h4>\n\n<p>The full edition \u2014 <strong>Gatemi Birthday Coupons for WooCommerce<\/strong>, a separate\nplugin sold on gatemi.com \u2014 adds a coupon on the anniversary of the day each customer joined\n(which needs nothing from them at all), a head start of up to 60 days before\nthe birthday, your own subject and message for each email, your\nown code prefix, a minimum the coupon may be spent against, a required date of\nbirth at the checkout, and a Birthday column on the Users list. Your settings\nand every date carry over, and a customer who has already had this year's\ncoupon here is never sent a second one.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20somebody%20share%20the%20code%3F\"><h3>Can somebody share the code?<\/h3><\/dt>\n<dd><p>They can send it to a friend, but the friend cannot use it. Every coupon is\nrestricted to the email address of the customer it was minted for.<\/p><\/dd>\n<dt id=\"what%20if%20the%20daily%20job%20runs%20twice%3F\"><h3>What if the daily job runs twice?<\/h3><\/dt>\n<dd><p>Nothing happens the second time. The year is claimed with a single database\ninsert before the coupon is created, so only one run can win it.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20checkout%20block%3F\"><h3>Does it work with the Checkout block?<\/h3><\/dt>\n<dd><p>The coupons do, at any checkout. The date field appears on the classic checkout\nonly, so on a shop using the Checkout block customers give their date in My\nAccount.<\/p><\/dd>\n<dt id=\"do%20guests%20get%20one%3F\"><h3>Do guests get one?<\/h3><\/dt>\n<dd><p>No. A date of birth is stored on a customer account, and a guest checkout has\nnowhere to keep one.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20the%20dates%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to the dates if I delete the plugin?<\/h3><\/dt>\n<dd><p>They are deleted. A birthday is a fact about a person held for exactly one\npurpose, and a store that has removed this plugin has no purpose left to hold\nit for. The coupons already sent are kept.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20send%20any%20data%20anywhere%3F\"><h3>Does this plugin send any data anywhere?<\/h3><\/dt>\n<dd><p>No. It makes no external requests of any kind.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release: a single-use coupon emailed a week before each customer's birthday \u2014 claimed atomically for the year so two overlapping runs cannot send it twice, dated in the store's own calendar with 29 February observed on the 28th in a common year, and never sent late \u2014 the date asked for at the checkout and in My Account where the customer can change or clear it, exported and erased through WordPress' own privacy tools, and deleted at uninstall while the coupons already emailed are kept.<\/li>\n<\/ul>","raw_excerpt":"Birthday coupons for WooCommerce: email each customer a single-use coupon for their birthday. One code a year, tied to them.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/401880","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=401880"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gatemi"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=401880"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=401880"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=401880"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=401880"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=401880"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=401880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}