Birthday & Anniversary Auto-Send
JewelTrak can email a birthday or anniversary greeting to every customer whose date matches today — sent on the day, so you don’t have to remember.
Turning it on
Go to Settings → Organization → Automated emails. Pick one of three options for birthday & anniversary greetings:
- Off — nothing is sent (the default).
- Send a simple email from JewelTrak — JewelTrak emails the greeting itself, using the templates you set below. It goes out from your own shop’s email address, with a one-click unsubscribe link (required for marketing email).
- Handle in Mailchimp — JewelTrak sends nothing; you run your own birthday/anniversary automation in Mailchimp instead. This option is available only once Mailchimp is connected.
Because it’s a single choice, a customer can never be double-emailed — only one system ever sends.
Templates (simple-email mode)
When you choose Send a simple email from JewelTrak, you can edit the Birthday and Anniversary subject + message. Leave any field blank to use the built-in default greeting (e.g. “Happy birthday from {shop_name}!”). Insert tokens like {first_name} to personalize.
If you use Mailchimp
Choosing Handle in Mailchimp is explicit — JewelTrak stands down and shows you a reminder to build the automation in Mailchimp using the BIRTHDAY and ANNIVERSARY merge fields (already synced from JewelTrak — see Mailchimp Integration). Connecting Mailchimp no longer silently turns JewelTrak’s greetings off; you decide.
Template tokens
| Token | Renders to |
|---|---|
{first_name} | Contact’s FirstName |
{last_name} | Contact’s LastName |
{full_name} | First + Last (or email if both blank) |
{company} | Contact’s CompanyName |
{shop_name} | Your store name |
Tokens are case-insensitive. Unknown tokens render as empty strings (won’t error).
Who gets emailed
The cron runs against each tenant with the flag enabled. For each tenant, it selects contacts where:
IsCustomer = 1StillActive = 1EmailAddress IS NOT NULL- AND today’s
MM-DDmatches either Birthday or Anniversary
A contact with both fields matching today’s date gets both emails (birthday + anniversary). Rare but it happens.
Beyond the date match, the customer must also be subscribed to birthday/anniversary email and not have unsubscribed from marketing — this is controlled per customer on the contact’s Communication tab, and customers can change it themselves from their preference page. A customer who unsubscribes (in JewelTrak or Mailchimp) stops getting greetings from either side.
Idempotency
The birthday_send_log table records every send keyed by (ContactID, Kind, year-of-SentAt) with a unique index. Re-running the cron the same day is a no-op — you can manually trigger the workflow without worrying about double-sends.
How to manually trigger
GitHub Actions → Birthday & Anniversary Greetings → Run workflow.
(Currently set up as manual-only until the global GH Actions schedule freeze lifts post-2026-06-01. The daily schedule trigger is in the workflow yml, just commented out.)
When emails fail to send
If Resend rejects a send (bad email, rate limit, etc.), the failure is captured in birthday_send_log with Status = 'failed' + ErrorMessage. The next day’s run won’t retry the same contact / kind / year — failures stay failed unless you delete the log row manually.
Cross-reference with wishlists
If a customer has a wishlist and their birthday is approaching, you have a natural up-sell trigger — and a ready answer for whoever asks you what to buy them. The default templates don’t reference it explicitly; a future template could pull “we still have the X you liked” but that’s not in v1.
See also
- Birthdays Report — view all upcoming birthdays / anniversaries in a window
- Mailchimp — broader marketing-email integration
- Customer Wishlists — pairs naturally with greeting-driven follow-ups