{"id":332542,"date":"2026-06-29T06:54:40","date_gmt":"2026-06-29T06:54:40","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/vereins-geburtstage\/"},"modified":"2026-07-14T13:27:26","modified_gmt":"2026-07-14T13:27:26","slug":"vereins-geburtstage","status":"publish","type":"plugin","link":"https:\/\/twd.wordpress.org\/plugins\/vereins-geburtstage\/","author":12466358,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.1","stable_tag":"1.9.1","tested":"7.0.2","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Vereins-Geburtstage","header_author":"Hagen K\u00f6ckritz","header_description":"Manages member birthdays via CSV import and sends birthday greetings using randomly chosen templates. Daily summary email at 9:00 a.m. when birthdays are due; sending manually by button or fully automatic.","assets_banners_color":"","last_updated":"2026-07-14 13:27:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/innovative-k.de","rating":0,"author_block_rating":0,"active_installs":0,"downloads":181,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5":{"tag":"1.5","author":"HagenKoeckritz","date":"2026-06-29 06:54:02"},"1.7.1":{"tag":"1.7.1","author":"HagenKoeckritz","date":"2026-07-10 08:22:19"},"1.8.1":{"tag":"1.8.1","author":"HagenKoeckritz","date":"2026-07-13 10:17:58"},"1.9.1":{"tag":"1.9.1","author":"HagenKoeckritz","date":"2026-07-14 13:27:26"}},"upgrade_notice":{"1.9.1":"<p>Adds a configurable advance warning for milestone birthdays.<\/p>","1.9.0":"<p>Adds per-template test emails, a sending log, and CSV export of the people list.<\/p>","1.8.3":"<p>Fixes HTML entities showing up in email subjects and text.<\/p>","1.8.2":"<p>Fixes the daily 9:00 job not running, and adds a status panel plus a manual trigger.<\/p>","1.8.1":"<p>Important fix: contacts without an email address are now all stored (previously only one).<\/p>","1.8.0":"<p>Template import\/export and a configurable email signature.<\/p>","1.7.1":"<p>Recovers templates and settings from earlier versions automatically.<\/p>","1.7.0":"<p>Special-birthday templates: define your own greetings for milestone ages such as 50, 60 or 75.<\/p>","1.6.0":"<p>Contacts without an email address are now supported, with a dedicated tab and info-only listing in the summary.<\/p>","1.5.0":"<p>Compliance improvements for the WordPress.org Plugin Directory. No feature changes.<\/p>","1.4.0":"<p>Quality and security hardening for the WordPress.org Plugin Directory. No feature changes.<\/p>","1.3.0":"<p>Sent marking, 7-day preview and a sortable people list.<\/p>","1.2.0":"<p>People can now be added manually; the whole list can be deleted with confirmation.<\/p>","1.1.0":"<p>Fully automatic sending and built-in help.<\/p>","1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3589534,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3589534,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3589534,"resolution":false,"location":"assets","locale":false}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5","1.7.1","1.8.1","1.9.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3589534,"resolution":"1","location":"assets","locale":"","width":1061,"height":402},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3589534,"resolution":"2","location":"assets","locale":"","width":1207,"height":683},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3589534,"resolution":"3","location":"assets","locale":"","width":1695,"height":865},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3589534,"resolution":"4","location":"assets","locale":"","width":972,"height":884},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3589534,"resolution":"5","location":"assets","locale":"","width":1049,"height":877}},"screenshots":{"1":"Overview of today's birthdays and the send button.","2":"CSV import.","3":"Template management with placeholders.","4":"Settings including fully automatic sending."}},"plugin_section":[],"plugin_tags":[1435,14241,567,267,1919],"plugin_category":[41],"plugin_contributors":[268061],"plugin_business_model":[],"class_list":["post-332542","plugin","type-plugin","status-publish","hentry","plugin_tags-birthday","plugin_tags-club","plugin_tags-csv","plugin_tags-email","plugin_tags-members","plugin_category-communication","plugin_contributors-hagenkoeckritz","plugin_committers-hagenkoeckritz"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/vereins-geburtstage\/assets\/icon.svg?rev=3589534","icon":"https:\/\/ps.w.org\/vereins-geburtstage\/assets\/icon.svg?rev=3589534","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vereins-geburtstage\/assets\/screenshot-1.png?rev=3589534","caption":"Overview of today's birthdays and the send button."},{"src":"https:\/\/ps.w.org\/vereins-geburtstage\/assets\/screenshot-2.png?rev=3589534","caption":"CSV import."},{"src":"https:\/\/ps.w.org\/vereins-geburtstage\/assets\/screenshot-3.png?rev=3589534","caption":"Template management with placeholders."},{"src":"https:\/\/ps.w.org\/vereins-geburtstage\/assets\/screenshot-4.png?rev=3589534","caption":"Settings including fully automatic sending."},{"src":"https:\/\/ps.w.org\/vereins-geburtstage\/assets\/screenshot-5.png?rev=3589534","caption":""}],"raw_content":"<!--section=description-->\n<p>Vereins-Geburtstage manages your members' birthdays and sends personal birthday greetings by email, automatically or at the push of a button. It is designed for clubs and associations and is fully bilingual (English and German).<\/p>\n\n<p>Members are imported from a CSV file or added manually. On re-import, an existing entry with the same email address is updated, so no duplicates are created. Every morning at 9:00 a.m. the plugin checks whether anyone has a birthday and, only then, sends a summary email to the configured address with the names and a link to the admin area. There you can see today's birthdays, a preview of the upcoming birthdays in the next seven days, and send the greetings with one click. Optionally, the plugin sends them fully automatically.<\/p>\n\n<p>For the texts you can define any number of templates with the placeholders <code>{vorname}<\/code> (first name), <code>{nachname}<\/code> (last name), <code>{absender}<\/code> (sender) and <code>{alter}<\/code> (age). One template is chosen at random per person so the greetings stay varied. You can also define separate templates for special birthdays: enter an age (for example 50, 60 or 75) and, when a person reaches exactly that age, a matching template is used instead. Special birthdays are marked with a star in the overview, the preview and the morning summary \u2013 even for people without an email address.<\/p>\n\n<p>Both the overview and the people list show for whom a greeting has already been sent in the current year. The people list can be sorted by first name, last name, birthday or email by clicking the column headers.<\/p>\n\n<p>Before relying on a template, you can send yourself a test email with sample data at the push of a button. Every send \u2013 manual, automatic or test \u2013 is recorded in a sending log, and the people list can be exported back to CSV at any time.<\/p>\n\n<p>The plugin is privacy-friendly: only the imported data is stored in your own database, and no external services are used.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>CSV import (first name, last name, birthday, email) with automatic delimiter and date detection<\/li>\n<li>Manual adding of individual people<\/li>\n<li>Daily summary at 9:00 a.m. \u2013 only when at least one birthday is due<\/li>\n<li>Sending manually by button or fully automatic<\/li>\n<li>Any number of templates with placeholders, chosen at random per person<\/li>\n<li>Special-birthday templates for milestone ages (e.g. 50, 60, 75), marked with a star<\/li>\n<li>Configurable closing\/signature appended automatically to every email<\/li>\n<li>Import and export of all templates as a JSON file<\/li>\n<li>Test-email button per template, sent to a chosen address with sample data<\/li>\n<li>Sending log (last 500 entries) with timestamp, recipient, template and result<\/li>\n<li>CSV export of the people list, re-importable in the same format<\/li>\n<li>Configurable advance warning (in days) for milestone birthdays, shown in the overview and as a one-time note in the daily summary<\/li>\n<li>Marking of greetings already sent<\/li>\n<li>Preview of birthdays in the next 7 days<\/li>\n<li>Sortable people list<\/li>\n<li>Whole list deletable (with confirmation)<\/li>\n<li>Built-in help, bilingual EN\/DE<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP under \"Plugins -&gt; Add New -&gt; Upload Plugin\" and activate it.<\/li>\n<li>In the \"Geburtstage\" (Birthdays) menu, import a CSV file.<\/li>\n<li>Add your own texts under \"Templates\".<\/li>\n<li>Configure the sender and, if desired, fully automatic sending under \"Settings\".<\/li>\n<li>The built-in guide is available at any time on the \"Help\" tab.<\/li>\n<\/ol>\n\n<p>Note: For precise triggering at 9:00 a.m., a real server cron job calling wp-cron.php is recommended. For reliable email delivery, an SMTP plugin (e.g. WP Mail SMTP) is recommended.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20format%20does%20the%20csv%20need%3F\"><h3>What format does the CSV need?<\/h3><\/dt>\n<dd><p>Four columns: first name, last name, birthday, email. Separator semicolon or comma. Date as DD.MM.YYYY or YYYY-MM-DD. The email column is optional and may be left empty or omitted.<\/p><\/dd>\n<dt id=\"can%20i%20import%20contacts%20without%20an%20email%20address%3F\"><h3>Can I import contacts without an email address?<\/h3><\/dt>\n<dd><p>Yes. Contacts without an email are stored and listed on the \"Without email\" tab. They receive no birthday email but appear in the morning summary for information.<\/p><\/dd>\n<dt id=\"are%20existing%20members%20duplicated%20on%20import%3F\"><h3>Are existing members duplicated on import?<\/h3><\/dt>\n<dd><p>No. An existing entry is matched by email address, or by first name, last name and birth date if no email is present. Adding an email later merges the existing entry.<\/p><\/dd>\n<dt id=\"are%20emails%20really%20only%20sent%20when%20there%20is%20a%20birthday%3F\"><h3>Are emails really only sent when there is a birthday?<\/h3><\/dt>\n<dd><p>Yes. The summary is sent only when at least one person has a birthday.<\/p><\/dd>\n<dt id=\"can%20sending%20be%20automated%3F\"><h3>Can sending be automated?<\/h3><\/dt>\n<dd><p>Yes, fully automatic sending at 9:00 a.m. can be enabled in the settings.<\/p><\/dd>\n<dt id=\"can%20i%20send%20a%20test%20email%20before%20saving%20a%20template%3F\"><h3>Can I send a test email before saving a template?<\/h3><\/dt>\n<dd><p>Yes. Each template (normal and special) has a \"Send test email\" button on the Templates tab. It sends the currently entered subject and text, filled with sample data, to an address you choose (defaults to the admin address). It never marks a real contact as \"sent\".<\/p><\/dd>\n<dt id=\"where%20can%20i%20see%20which%20emails%20were%20actually%20sent%3F\"><h3>Where can I see which emails were actually sent?<\/h3><\/dt>\n<dd><p>On the \"Log\" tab, showing the last 500 entries (newest first) with timestamp, recipient, template, whether it was a manual, automatic, or test send, and the result.<\/p><\/dd>\n<dt id=\"can%20i%20export%20the%20people%20list%3F\"><h3>Can I export the people list?<\/h3><\/dt>\n<dd><p>Yes. The \"People\" and \"Without email\" tabs have an export button that produces a CSV file in the same format as the import, so it can be re-imported directly (e.g. after editing it).<\/p><\/dd>\n<dt id=\"can%20i%20get%20advance%20notice%20before%20a%20milestone%20birthday%3F\"><h3>Can I get advance notice before a milestone birthday?<\/h3><\/dt>\n<dd><p>Yes. Set an \"advance warning\" in days in the settings (default 14). Once a milestone birthday (one with a matching special template) is that many days away, it shows up in the overview ahead of the regular 7-day preview, and you get a one-time note about it in the daily summary email on that exact day \u2013 even if nobody else has a birthday that day \u2013 so there is enough time to plan something special.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.1<\/h4>\n\n<ul>\n<li>New: configurable advance warning (in days, default 14) for milestone birthdays. Once within the warning window, they appear in the overview ahead of the regular 7-day preview, and trigger a one-time note in the daily summary email on the day the warning period begins \u2013 even on days with no other birthdays.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>New: \"Send test email\" button per template (normal and special) \u2014 sends the rendered email with sample data and the configured closing\/signature to a chosen address, without affecting the \"already sent\" status.<\/li>\n<li>New: sending log on a new \"Log\" tab, recording every manual, automatic and test send with timestamp, recipient, template, type and result; the log can be cleared.<\/li>\n<li>New: CSV export of the people list (with and without email) in the same format as the import, so it can be re-imported directly.<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Fixed: HTML entities (e.g. &quot;) appeared in the email subject and body when the site name or sender name contained quotes or ampersands. All text is now decoded properly for plain-text emails.<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Fixed: the daily 9:00 a.m. job could stop being scheduled after a plugin update; it is now re-scheduled automatically if missing.<\/li>\n<li>Scheduling now uses the WordPress time zone correctly (previously it could be off on servers not running in UTC).<\/li>\n<li>New status panel on the overview tab showing the next scheduled run, the last run, whether WP-Cron is disabled, and the site time zone.<\/li>\n<li>New button to run the daily job manually (useful for testing or if the cron did not fire).<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Fixed: only a single contact without an email address could be stored. A UNIQUE index on the email column left over from earlier versions rejected every further row with an empty email. The index is now reliably detected and removed on update.<\/li>\n<li>Failed database writes during import are no longer counted as successful.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Import and export of all templates (standard and special) as a JSON file \u2013 for backups or to load new templates as a block.<\/li>\n<li>New configurable closing\/signature in the settings that is automatically appended to every birthday email.<\/li>\n<li>{alter} (age) placeholder can be used in templates and in the signature.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Automatic migration of templates and settings stored under earlier option names, so data is no longer lost after updating from older versions.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Templates for special birthdays: define your own subject and text for specific ages (e.g. 50, 60, 75).<\/li>\n<li>When a person reaches a defined age on their birthday, a template for that age is chosen at random; otherwise a standard template is used. People without a known birth year always receive a standard template.<\/li>\n<li>Special birthdays are marked with a \u2605 in the overview, the 7-day preview and the morning summary \u2013 including for people without an email address.<\/li>\n<li>New placeholder {alter} (age) available in templates.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Contacts without an email address can now be imported and added manually (email is no longer required).<\/li>\n<li>People without an email are listed on a separate \"Without email\" tab.<\/li>\n<li>The morning summary now lists people with an email first (who receive a mail), followed by people without an email (for information only, including age).<\/li>\n<li>Automatic and manual sending still only send to people with an email address.<\/li>\n<li>Duplicate detection improved: matched by email, otherwise by first name, last name and birth date; adding an email later merges the existing entry.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Loading of translations is now handled automatically (removed the manual textdomain call).<\/li>\n<li>Inline admin script is now registered through the WordPress script API.<\/li>\n<li>readme fully translated to English.<\/li>\n<li>No changes to features or behaviour.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Code quality and security hardening for the WordPress.org Plugin Directory.<\/li>\n<li>All output is now properly escaped; database queries reviewed and secured.<\/li>\n<li>CSV import now uses the WordPress filesystem API instead of direct file functions.<\/li>\n<li>Date handling switched to timezone-safe functions.<\/li>\n<li>Added translator comments for all strings with placeholders.<\/li>\n<li>No changes to features or behaviour.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Marking in the overview and people list of whether a greeting was already sent this year.<\/li>\n<li>Preview of upcoming birthdays in the next 7 days.<\/li>\n<li>People list sortable by first name, last name, birthday or email (click the column header); default sort is by birthday.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>People can be added manually in the people list.<\/li>\n<li>\"Delete entire list\" button with confirmation.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Optional fully automatic sending at 9:00 a.m.<\/li>\n<li>Built-in help in the admin area.<\/li>\n<li>Bilingual: German and English.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Birthday greetings by email for clubs and associations: CSV import, random templates, a daily 9:00 a.m. summary, and sending by button or fully automa &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/332542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=332542"}],"author":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hagenkoeckritz"}],"wp:attachment":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=332542"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=332542"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=332542"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=332542"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=332542"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=332542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}