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 |
- Ensure you have a date custom field in your CRM
- Create a new workflow
- Add a Date Trigger as the first task
- Select the date field to monitor
- Set how often it repeats from that date (Interval and Unit)
- Set the Time of Day (UTC)
- Save and enable the workflow

Date Field Configuration¶
Setting Up Date Custom Fields¶
Before using Date Triggers, you need date custom fields in your CRM (see Manage custom fields):
- Go to Clients → open a client → Custom Fields
- Create a new custom field
- Set type to "Date"
- Name it clearly (e.g.,
renewal_date,birthday,contract_end)
Common Date Fields:
birthday- Contact's birth daterenewal_date- Subscription/contract renewal dateanniversary_date- Customer anniversarycontract_end_date- When contract expireslast_purchase_date- Last transaction datetrial_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.

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:
- Date Trigger - On birthday
- 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:
- Date Trigger - on
renewal_reminder_date - Email - Send renewal reminder
- Delay - Wait 14 days
- If Task - Check if renewed (a status or custom field)
- 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.
- Date Trigger
- 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.
- Date Trigger - On anniversary
- 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_datenotdate1) - 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:
- Check contacts have values in the date field
- Verify workflow toggle is ON
- Confirm date field selection is correct
- 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:
- Verify date format in custom field (YYYY-MM-DD recommended)
- Check timezone setting
- 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:
- Date Trigger - on a renewal reminder date
- Code Task - Calculate contract value
- If Task - Check contract value
- High value (>$10,000): Assign to senior account manager
- Medium value ($1,000-$10,000): Standard renewal email
- Low value (<$1,000): Automated renewal offer
Multi-Date Coordination¶
If you need to check multiple dates:
- Date Trigger - on renewal_date
- Code Task - Check other date fields
- 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:
- When creating contact, calculate the date and store in custom field
- 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:
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:
- Timer Trigger - Time-based automation
- CRM Trigger - Event-based automation
- Edit Client Task - Update contact data