All articles

Contacts

Birthday & Anniversary Auto-Send

Automatically email birthday and anniversary greetings on the customer's day. Turn it on in Settings → Organization → Automated emails and choose whether JewelTrak sends them or Mailchimp does.

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

TokenRenders 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 = 1
  • StillActive = 1
  • EmailAddress IS NOT NULL
  • AND today’s MM-DD matches 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 GreetingsRun 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