Skip to content

Date Trigger

Overview

The Date Trigger automatically runs workflows based on dates stored in your CRM. This is perfect for birthday emails, renewal reminders, anniversary messages, subscription expirations, and any date-based automation.

The date can live in one of three places, and the workflow runs once for each record whose date comes around:

Date Field The workflow runs once per Example
A client date field client a renewal date on the client
A contact date field contact each contact's birthday
A date column of a custom table table row the expiry date of each policy in a Policies table

When to use this trigger:

  • Send birthday wishes automatically
  • Remind customers of upcoming renewals
  • Send anniversary/milestone emails
  • Alert before contract expirations
  • Follow up X days after a purchase
  • Trigger actions on custom date fields

This trigger is a scheduled sweep, not a reaction to an event. Nothing has to happen to a contact for it to fire — the date on their record simply comes around:

flowchart LR
    A[Scheduled evaluation] --> B{Contact's date field due?}
    B -->|Yes| C[Workflow runs for that contact]
    B -->|No| D[Nothing happens today]

Quick Start

Builder fields

The Field column is the label as it appears in the task builder; Key is the name the value is stored under and referenced by.

Field Key Type Default Notes
Date Field custom_field select –
Interval frequency_interval number 1
Unit frequency_unit select days Options: Days · Weeks · Months · Years
Time of Day (UTC) time select 00
  1. Ensure you have a date custom field in your CRM
  2. Create a new workflow
  3. Add a Date Trigger as the first task
  4. Select the date field to monitor
  5. Set how often it repeats from that date (Interval and Unit)
  6. Set the Time of Day (UTC)
  7. Save and enable the workflow

The Date Trigger task opened to its settings: the trigger banner, the Date Field, Interval 1, Unit Years and the Time of Day in UTC

Date Field Configuration

Setting Up Date Custom Fields

Before using Date Triggers, you need date custom fields in your CRM (see Manage custom fields):

  1. Go to Clients → open a client → Custom Fields
  2. Create a new custom field
  3. Set type to "Date"
  4. Name it clearly (e.g., renewal_date, birthday, contract_end)

Common Date Fields:

  • birthday - Contact's birth date
  • renewal_date - Subscription/contract renewal date
  • anniversary_date - Customer anniversary
  • contract_end_date - When contract expires
  • last_purchase_date - Last transaction date
  • trial_end_date - When trial period ends

When it fires

Once a day, at Time of Day (UTC), the trigger starts the workflow for every client whose date field matches today:

Unit Fires for a client on Example (Interval 1)
Days the date, then every Interval days after it a date of 1 March fires 1, 2, 3 March… (Interval 7: weekly from 1 March)
Weeks the date, then the same weekday every Interval weeks fortnightly check-ins from a start date
Months the date, then the same day of the month every Interval months monthly on the 10th
Years the date, then the same day every Interval years a birthday or anniversary

It never fires before the date. To remind someone ahead of a date — 30 days before a renewal — store the reminder date itself in a date field (have a workflow set "renewal reminder" to the renewal date less 30 days) and trigger on that field.

Records with no date in the field are skipped. A run that was missed (the server was down at that hour) is caught up on the next check.

Contact date fields

Contact date fields are set up on the contact form — see Contact custom fields.

The workflow runs once per contact, however many clients the contact is linked to. client_id is the first client the contact was linked to; a contact linked to no client still starts the workflow, with an empty client_id.

Table date columns

Date columns are added with the table — see Set up tables and columns.

The workflow runs once per table row. A client with three rows due today starts it three times — once for each row — so a Policies table sends one reminder per policy. Rows belonging to a deleted client are skipped.

The Custom Fields section of a client panel, with a count of 15, the pencil, Hide Empty, a search box and Add Field. The first fields are Property Type: Single-family home, Service Area: North Shore, Lead Source: Website Form, Maintenance Plan: None, Water Heater Age (yrs): 11 and Next Service Due: 2026-11-03

Custom fields are defined per tenant on the client record itself — the pencil edits the set, Add Field creates one. The name you give a field here is the name you reference from a task.

Outputs

Field Type Example Notes
client_id number 10482 The client whose date matched — for a contact date field, the contact's first client (empty when it has none); for a table column, the client the row belongs to. The only client data this trigger emits — follow it with Match to Client using this ID to get names, status or custom fields.
contact_id number 55210 Contact date fields only. The contact whose date matched.
table_id number 68 Table date columns only. The table.
row_id number 4001 Table date columns only. The row whose date matched — use it in a Table task to read or edit that row.
row_link string Table date columns only. A link straight to the row in the CRM.
date_created string 2026-09-07 06:00:12 When the trigger fired, UTC, YYYY-MM-DD HH:MM:SS. Not the client's date.
schedule string Monthly at 06:00 UTC A readable description of the configured schedule.
run boolean true Always true.
run_text string Date trigger executed successfully.

This trigger does not give you the client's details

It emits the client's ID and nothing else about them. To use a name, email or custom field in the workflow, add a Match to Client task with client_id: {{task_<ID>_client_id}}.

Real-World Examples

Example 1: Birthday Email Campaign

Trigger: birthday, Interval 1, Unit Years, at 06:00 UTC

Workflow:

  1. Date Trigger - On birthday
  2. Email - Send personalized birthday email with discount code

Email Template:

Happy Birthday, {{task_49123_first_name}}! 🎉

To celebrate, here's a special 15% discount code: BDAY2024

Valid for 7 days. Enjoy your special day!

Example 2: Subscription Renewal Reminder

Trigger: renewal_reminder_date, Interval 1, Unit Years, at 08:00 UTC — a date field a workflow sets to 30 days before each renewal.

Workflow:

  1. Date Trigger - on renewal_reminder_date
  2. Email - Send renewal reminder
  3. Delay - Wait 14 days
  4. If Task - Check if renewed (a status or custom field)
  5. Not renewed: Send second reminder

Example 3: Monthly check-in from the start date

Trigger: start_date, Interval 1, Unit Months, at 07:00 UTC — fires on the same day each month.

  1. Date Trigger
  2. Workflow Note - remind the account manager to check in

Example 4: Customer Anniversary

Trigger: customer_since, Interval 1, Unit Years — the date itself, then every year on it.

  1. Date Trigger - On anniversary
  2. Email - Send a thank-you on the anniversary

Several reminders for one date

The trigger fires on its field's date, never before it. For reminders at 60, 30 and 7 days before a renewal, keep a date field for each (or one "next reminder" field a workflow moves on after each reminder) and trigger on it.

Handling Missing Dates

Clients with no value in the field are simply not matched, so nothing runs for them.

Time of Day is UTC

Time of Day (UTC) is UTC: 06 runs at 06:00 UTC, which is 08:00 in South Africa. Every matched client starts the workflow at that hour. For customers in other timezones, choose an hour that suits them, or delay the message.

Best Practices

✅ Do's

  • Use clear date field names: Name fields descriptively (e.g., subscription_renewal_date not date1)
  • Handle missing dates: Add If tasks to check date fields exist
  • Mind the clock: Time of Day is UTC
  • Test with real dates: Create test contacts with upcoming dates
  • Add multiple touchpoints: a date field per reminder
  • Update dates after actions: If customer renews, update renewal_date
  • Track which emails sent: set a custom field such as "Birthday email sent" to the year

❌ Don'ts

  • Don't forget to update dates: Keep date fields current
  • Don't send too many reminders: Space them reasonably
  • Don't ignore timezones: Consider your global audience
  • Don't hardcode years: Use current year dynamically
  • Don't assume dates are always set: Always validate

Troubleshooting

Workflow Not Triggering

Possible Causes:

  • Date field is empty for contacts
  • Workflow is disabled
  • Date field configuration incorrect
  • Date has already passed

Solutions:

  1. Check contacts have values in the date field
  2. Verify workflow toggle is ON
  3. Confirm date field selection is correct
  4. For testing, set date field to future dates

Triggering for All Contacts at Once

Cause: Many contacts have the same date

This is normal for:

  • Imported contacts with placeholder dates
  • Mass contract renewals

Solution: Stagger dates or add conditions to limit volume

Emails Sent at Wrong Time

Cause: Timezone misconfiguration

Solution: Check timezone setting in trigger configuration matches your desired timezone

Trigger Ran Yesterday/Tomorrow Instead of Today

Possible Causes:

  • Date format issue (US vs. international format)
  • Timezone offset

Solutions:

  1. Verify date format in custom field (YYYY-MM-DD recommended)
  2. Check timezone setting
  3. Test with a known date

Advanced Patterns

Dynamic Date Calculation

Calculate dates based on other dates:

// If you have purchase_date and want to trigger 30 days later
const purchaseDate = new Date(input.task_49123_custom_purchase_date);
const followUpDate = new Date(purchaseDate);
followUpDate.setDate(followUpDate.getDate() + 30);

return {
  follow_up_date: followUpDate.toISOString().split('T')[0],
};

Recurring Annual Triggers

For dates like birthdays, set Unit to Years (Interval 1): it fires on the same day every year, whatever year the field holds.

Conditional Date-Based Actions

Different actions based on how far in the future the date is:

  1. Date Trigger - on a renewal reminder date
  2. Code Task - Calculate contract value
  3. If Task - Check contract value
  4. High value (>$10,000): Assign to senior account manager
  5. Medium value ($1,000-$10,000): Standard renewal email
  6. Low value (<$1,000): Automated renewal offer

Multi-Date Coordination

If you need to check multiple dates:

  1. Date Trigger - on renewal_date
  2. Code Task - Check other date fields
  3. If Task - Determine which action based on multiple dates
const renewalDate = new Date(input.task_49123_custom_renewal_date);
const contractDate = new Date(input.task_49123_custom_contract_start_date);
const daysSinceStart = Math.floor((renewalDate - contractDate) / (1000 * 60 * 60 * 24));

return {
  contract_length_days: daysSinceStart,
  is_first_renewal: daysSinceStart <= 370, // ~1 year
};

Frequently Asked Questions

Can I trigger on multiple date fields in one workflow?

No, each Date Trigger monitors one date field — on a client, a contact or a table. Create separate workflows for different date fields.

What happens if I update a contact's date after the trigger already ran?

The workflow won't run again for that date. Date Triggers run once per contact per matching date.

Can I trigger multiple times for the same date (e.g., 30 days before AND 7 days before)?

Not from one date field — the trigger fires on the field's own date. Keep a date field per reminder and give each its own trigger.

What date format should I use?

Use YYYY-MM-DD format (e.g., 2024-02-08) for consistency and reliability.

How do I test without waiting for the actual date?

Set a contact's date field to tomorrow or a few days in the future, then check execution history when that date arrives.

Can I trigger on relative dates (e.g., "30 days after contact was created")?

Not directly. Instead:

  1. When creating contact, calculate the date and store in custom field
  2. Use Date Trigger on that field

Or use a CRM Trigger (contact created) with delays.

What happens for leap years and February 29 birthdays?

A yearly trigger matches the month and day exactly, so a 29 February date fires only in leap years. If that matters, store such birthdays as 28 February or 1 March.

Can I trigger only for specific contacts (e.g., only paying customers)?

Yes, add an If task at the workflow start:

Condition: {{task_49123_custom_status}} equals "Paying Customer"

How do I prevent duplicate triggers if I run multiple tests?

Date Triggers run once per date per contact. If you need to test multiple times, change the date field value between tests.


Next Steps: