When to use it, when not to
Use it
- Use it when no-shows cost time and the meeting start time is stored on the contact record.
- Use it for contacts with a US mobile number who opted in to your SMS subscription type.
Skip it
- Do not use it for contacts outside the US. Native Marketing SMS only reaches US numbers that start with +1 and contain 11 digits. For other countries, use the app action described in messaging-018.
- Do not use it for meetings booked less than 24 hours ahead. The reminder would land right after the booking confirmation. The first branch filters those out.
Prerequisites
- Marketing Hub Professional or Enterprise with the Marketing SMS Long Code Add-On or the Marketing SMS Short Code Add-On.
- The business is registered to send SMS in the SMS settings.
- An SMS subscription type in Settings > Communication preferences (see marketing-ops-006). Consent is captured upstream, see messaging-003.
- A published SMS message named "Appointment reminder 24h". The body
must include opt-out text. Text used here, 111 characters:
[Brand]: reminder, your appointment is tomorrow. Details are in your confirmation email. Reply STOP to opt out. - A published automated email "Appointment reminder 24h (email)" for contacts who cannot receive the SMS.
- Property:
Next meeting start(internal namemsg_next_meeting_start), object contact, field type date and time picker. Why: the Delay until date step counts back from it. (check in your portal: whether a default contact property holds the start time of the next booked meeting, or whether the scheduling tool or an integration must writemsg_next_meeting_start) - Property:
Last SMS sent at(internal namemsg_last_sms_sent_at), object contact, field type date and time picker. Why: one stamp shared by every SMS fiche, read by the frequency cap in messaging-020. - Property:
Last reminder channel(internal namemsg_last_reminder_channel), object contact, field type dropdown select, optionssms/email/none. Why: lets you report no-show rate per reminder channel.
Enrollment
| Trigger type | filter-based, contact-based workflow. |
|---|---|
| Criteria | Next meeting start is known AND
Next meeting start is after today. |
| Re-enrollment | on, when Next meeting start is known. A
new booking starts a new reminder. |
| Suppression | a static list "Messaging - do not contact" if you keep one. Consent itself is checked in step 3, right before the send, not at enrollment. |
Steps
- Delay until date: date property
Next meeting start, 1 day before, same time of day. - If/then branch:
Next meeting startis still known AND is less than 26 hours from now.- If false: the meeting was cancelled, moved or booked too late. Set
property value
Last reminder channel=none. End.
- If false: the meeting was cancelled, moved or booked too late. Set
property value
- If true, If/then branch: SMS subscription type is opted in AND
Marketing contact statusis Marketing contact ANDMobile Phone Numberstarts with+1.- If true:
- Send SMS message: published message "Appointment reminder 24h", recipient = enrolled contact.
- Set property value:
Last SMS sent at= date of step. - Set property value:
Last reminder channel=sms.
- If false:
- Send email: "Appointment reminder 24h (email)".
- Set property value:
Last reminder channel=email.
- If true:
Known pitfalls
- Quiet hours are on by default for every SMS, workflows included. A meeting at 08:00 puts the reminder at 08:00 the day before, which can fall inside the quiet window. Check the window in the SMS settings and test with a meeting near its edge.
- A contact must be opted in to the SMS subscription type AND be a marketing contact. Missing either one means no SMS. The branch in step 3 sends those contacts to email.
- The action uses
Mobile Phone Numberand falls back toPhone Numberwhen it is empty. A landline inPhone Numbergets the send attempt. Run messaging-009 first so only clean mobile numbers pass. - A reschedule changes
Next meeting startwhile the contact waits in step 1. (check in your portal: whether a Delay until date step recalculates when the date property changes while the contact is waiting in the delay) Step 2 exists so a moved meeting never gets a wrong reminder. - No reply handling exists natively. A contact who answers "I can't make it" gets no automated response and no trigger fires. Say so in the confirmation email, or use an app for two-way SMS.
- The SMS body in this fiche has no personalization token on purpose. The meeting time lives in the confirmation email.
Test plan
- Create a test contact with a US mobile number in
+1XXXXXXXXXXformat, opted in to the SMS subscription type, set as a marketing contact. - Set
Next meeting startto tomorrow plus one hour. Confirm enrollment in the workflow history. - When the delay ends, confirm the SMS arrives,
Last SMS sent atis stamped andLast reminder channel=sms. - Repeat with a contact who is not opted in. Confirm the email goes
out and the channel reads
email. - Repeat with an opted-in contact, then clear
Next meeting startduring the delay. Confirm nothing is sent and the channel readsnone.
The UAT script of this spec holds 5 cases: a negative case, one case per branch, the expected result of each and a sign-off sheet. It comes as Markdown and as a CSV for your spreadsheet.
Variants
- Wait until: replace the fixed 24-hour offset with "Delay until event happens" on a confirmation form submission, with an expiration 24 hours before the meeting, and send the SMS only to contacts who did not confirm.
- Second reminder 2 hours before the meeting for high-value meeting types. Check the frequency cap in messaging-020 first.
- Outside the US: same structure with the app action from messaging-018 in place of Send SMS message.
Build spec
trigger:
type: filter-based
object: contact
criteria:
- msg_next_meeting_start: is_known
- msg_next_meeting_start: is_after today
reenrollment: true
reenrollment_property: msg_next_meeting_start
actions:
- type: delay_until_date
date_property: msg_next_meeting_start
offset: -1_day
- type: if_then_branch
condition: msg_next_meeting_start_is_known and msg_next_meeting_start_less_than_26_hours_from_now
if_false:
- type: set_property_value
property: msg_last_reminder_channel
value: none
if_true:
- type: if_then_branch
condition: sms_subscription_opted_in and marketing_contact_status_is_marketing and mobilephone_starts_with_plus_1
if_true:
- type: send_sms_message
message: "Appointment reminder 24h"
recipient: enrolled_contact
installable: false
manual_step: "Open the Send SMS message action and select the published SMS message 'Appointment reminder 24h'."
- type: set_property_value
property: msg_last_sms_sent_at
value: current_datetime
- type: set_property_value
property: msg_last_reminder_channel
value: sms
if_false:
- type: send_email
email: "Appointment reminder 24h (email)"
- type: set_property_value
property: msg_last_reminder_channel
value: emailFiles and install
| File | What it holds |
|---|---|
| PDF and Markdown | The spec as you read it here, with the YAML build spec at the end. |
| Properties JSON | Creates the fields in one API call. |
| Workflow JSON | Documents the build: the workflow in Automation API v4 format, switched off. |
| UAT script | The test cases, the expected results and a sign-off sheet, as Markdown and CSV. |
Take the PDF and build it by hand. One-click install comes with a category pack or the full library.
Install messaging-001
One email, and we tell you where this stands. When free installs open, that address is how you hear it first.
No card, no password, unsubscribe in one click.
Nothing deleted, enabled or enrolled.
messaging-001Spec version 2026-10