Skip to main content

Relay templates

MessageDesk ships 58 Relay templates, grouped by outcome in the app. Install one and adjust it to your workflow. This page has three parts. The catalog lists every shipped template. How the builds work shows the trigger, conditions, and actions behind each one, so you know what a template does before you turn it on. Industry starting points maps common situations to the right build.
Every template is a starting point. Adjust the wording, labels, assignees, active hours, and conditions to fit your team. For step-by-step instructions, including AND/OR between conditions, chained actions, and delays, see Create and edit a Relay. For every available trigger, condition, and action, see Relay building blocks.
Relay Templates 1
Stacking templates on the same Trigger? You can build more than one Relay on the same trigger. For example, an after-hours reply and a keyword reply both on Message Received. Set the Order on the Relays list so the more specific Relay runs first. All matching Relays run in Order. See Order your Relays.

Templates that ship in the app

Seven outcome groups, 58 templates. Pick one, name it, and adjust the fields. Every template arrives paused, so nothing runs until you toggle it On.
Outcome groups expand and collapse. The board opens with the outcome headings collapsed so you can scan all seven at once, then expand only the group you need. Individual template cards expand and collapse too, so you can read a template’s detail without leaving the board.
Each group below lists every shipped template and what it does. Where this page documents the underlying build, the third column links to it, so you can either install the template or build the same outcome by hand.

Assign & Route Conversations

Route by Contact Property takes both halves. Contact triggers fire against a contact, not a conversation, so they can’t label or assign on their own. Part 1 writes the property value into a comment; Part 2 reads that comment and does the labeling and assignment. Install both, or neither works. Part 2 also needs one copy per possible value. See Bridge a contact property to a label and an owner for the full build.

Organize Conversations & Update Status

Respond to Messages

Add your own opt-out language. Templates that send a message ship with placeholder copy. Keep “Reply STOP to opt out.” in any automated outbound text so you stay aligned with carrier requirements.

Start Conversations from Contacts & Other Tools

Keep Contacts in Sync

Connect to Other Systems

Webhook templates need an endpoint first. Configure your webhook endpoint and signing secret in Settings → Developer Tools before you turn any of these on.

Protect: Compliance & Delivery

MessageDesk already blocks sending to opted-out contacts at the workspace level. The compliance templates are for internal awareness, ownership, and audit trails, not for blocking the outbound message.
The Custom Relay (a blank canvas) is also available. Use it to build from scratch when no template fits.
Labels aren’t created for you. Templates that reference a label (Resolved, No Reply Needed, Reopened, Delivery failed, and so on) don’t create it. Create the label first, or change the name in the template to one you already use. See Labels.
Don’t see the template you need? Click Suggest a Relay Template at the bottom of the Relay Templates page. It routes you to MessageDesk’s feedback board, where you can submit template ideas.


How the builds work

Every template above is one of the builds below. They’re grouped by trigger, because the trigger is the first thing you pick in the app. Each build lists the conditions, the actions, and why it works. Adjust the wording, labels, assignees, and scoping to fit your team.
The Add Action menu varies by trigger. Not every action appears on every trigger. If a build lists an action you don’t see, check the Add Action menu for the trigger you picked. See Relay building blocks for which actions are scoped to which triggers.

Confirmed vs. pending. The Add Action menu can vary by trigger. The templates below cover only the combinations confirmed to appear in the app today. Three additional foundational templates (on Conversation Opened, Comment Created, and Conversation Label Applied) are staged for a follow-up once their action menus land.

Message Received

The busiest trigger. Eight builds cover almost everything teams do with inbound texts.

Scope by phone line

Why it works: Every inbound text on a line lands with an owner and a label you can filter on. This is how a shared line replaces one person’s cell phone. A dispatch line routes to that region’s dispatcher. A service line routes to the advisor on duty. A front-desk line goes to whoever’s covering. Add Conversation label equals to split one line further by region or job type.
There’s no round-robin action. Nothing rotates to the next teammate automatically. Real round-robin takes one Relay per teammate, each scoped by a different line or label so they don’t all fire on the same message. That’s the supported approach.

Match a keyword

Why it works: Keyword matching is the fastest triage you can build. The contact gets an instant acknowledgement, the right team picks up the thread, and the label gives you a filter. Use as many of those actions as the case needs. A safety keyword wants all four. A billing keyword wants an assignee and a label. Build one Relay per keyword to make a texted menu. support, pricing, and sales each get their own reply and owner, all on the same number.
Keep a catch-all, and stop the cascade. Order a keyword-free Relay last so a message that matches nothing still gets a graceful reply. Then add the Stop Processing action to each keyword Relay, so a specific match prevents the catch-all from firing on the same message. Ordering alone won’t do it. See Order your Relays.
Routing a keyword to a specific person multiplies. A Relay matches one keyword and does one thing. It can’t branch, so “route each of these five phrases to whichever of our fourteen people owns the thread” is 5 × 14 = 70 Relays, one per pair. That’s deliberate: Relays stay simple so they stay predictable.Three ways to keep it manageable. Pick one shared keyword like urgent and build one Relay per person, which is 14 instead of 70. Route the keyword to a single triage owner and let them reassign. Or move the branching to Zapier, which handles multi-condition logic in one Zap at the cost of a separate subscription.

Greet a new or anonymous contact

Why it works: Texts from unsaved numbers arrive as anonymous conversations. Asking for a name while the contact is still typing keeps your directory clean and every thread attributable. The label gives sales or intake one filter to work from. See Anonymous, opted out & blocked for how anonymous status is determined.
Once your contact list is complete, anonymous means new. If every existing customer, client, or candidate already exists as a contact, then an anonymous conversation is by definition someone you haven’t met. That makes Is anonymous conversation a reliable stand-in for “new lead” with no keyword to match and nothing for the sender to remember. Add Mark Conversation Unread so the thread stays queued after any auto-reply, and assign it to whoever owns intake.The reverse is also true: while contacts are still missing, this condition fires on regulars too. Finish importing before you rely on it.

Reply outside business hours

Why it works: Inverting the Active hours window fires the Relay only when a text lands outside your hours, so nobody waits until morning for an acknowledgement. Mark Conversation Unread is the part teams miss: without it, the auto-reply moves the thread to Replied and out of the Unread filter, and the customer’s actual question never gets reviewed. See Relays and conversation status. Keep “Reply STOP to opt out.” in the reply text.
One teammate can be out without silencing the line. Add Teammate Assigned set to the person who’s away, then add Is unassigned conversation with OR to also cover brand-new threads. The auto-reply fires only on their conversations. You don’t need a dedicated line per teammate.

Cover several shift windows with one set of Relays

Why it works: Most teams don’t have one open window and one closed window. They have the hours the admin works, the evenings one group covers, the weekend another group covers, and the hours nobody works. One Relay can’t express that, but one Relay per window can. Build a separate Relay for each window, each with its own Active hours and its own assignee. Then order them with the narrowest or highest-priority window first. Every matching Relay runs, and no Relay knows another already fired, so Stop Processing as the last action is what stops the later windows from also assigning. See Order your Relays.
Put the busiest window first. If your admin covers weekday business hours, that Relay goes at the top with Stop Processing, so the evening and weekend Relays below it never fire during her shift. The unstaffed window is the one to build last: give it an auto-reply rather than an assignee, since there’s nobody to route to.

Stream every message to another system

Why it works: Every inbound text flows to your CRM, warehouse, ticketing tool, or retention store. Build a matching Relay on Message Sent to capture both directions, which is what an audit or recordkeeping requirement usually needs. Scope by line to avoid a firehose.

Auto-close threads that don’t need a reply

Why it works: Courtesy replies like “thanks!” reopen threads nobody needs to touch. Label a conversation No Reply Needed when you’re done, and the next inbound message closes it and clears the label. A real follow-up later reopens the thread normally.
Ships as a template: This build is available as the Auto-Close No-Reply-Needed starter from the Relays module. MessageDesk doesn’t create the label for you. Create a label named No Reply Needed before turning the Relay on, or change the name in both the condition and the action to a label you already use. See Labels. The Label name equals condition and Remove Label where name equals action are documented in Relay building blocks.

Route a whole label namespace

Why it works: Conversation label equals is a matcher, not a fixed equality check. One startsWith "Region:" rule catches Region:North, Region:South, and every label you add later. You skip maintaining one Relay per region. See the operator list in Relay building blocks.

Flag unclaimed threads

Why it works: Anything that slips past your routing gets flagged instead of aging in the queue. Pair it with an Inbox filter on Assignee = Unassigned.

Message Sent

Assign to whoever replies first

Why it works: The first teammate to reply owns the follow-up. The conversation is no longer unassigned, so later replies don’t steal it, and new inbound messages route to that teammate by default. Drop the condition if you want the sender to take ownership even on threads someone else already owns.
Assign to sender only appears on the Message Sent trigger.
Ships as a template: This template is available as the Auto Assign to First Responder starter from the Relays module. Install it as-is or use the fields above to build it yourself.

Auto-close after an acknowledgement

Why it works: One-shot confirmations (appointment reminders, delivery pings, “on my way”) don’t need to sit in the Inbox after they go out. Closing keeps the Inbox focused on threads that still need a person. A new inbound message reopens the thread and fires any Conversation Opened Relays you’ve built.

Message Failed

Catch every text that fails to deliver

Why it works: A failed text is invisible, because the sender assumes it went through. This surfaces the failure, reopens and flags the thread, and puts it on someone. Most valuable for time-sensitive dispatch, staffing, and safety messages.

Branch on the reason a message failed

Why it works: Not every failure is worth retrying. Matching the failure text lets you queue the temporary ones and clean up the permanent ones. Build a second Relay on the same trigger that matches a permanent-failure reason and labels it Bad number instead. Use provider-agnostic wording in your matches so the Relay survives a carrier change. See Delivery status and errors.
Verify before enabling. If your workspace doesn’t see the Message failure contains text condition on the Message Failed trigger yet, hold this build until it appears.

Conversation Opened

Re-triage on reopen

Why it works: When a customer replies days later, the original assignee may not be the right owner anymore. Clearing assignees sends the thread back through normal triage, where your Message Received routing picks it up fresh.

Conversation Users Assigned

Hand off with context

Why it works: MessageDesk doesn’t notify anyone when they’re assigned a conversation. Assignment is silent, so a thread can sit with a new owner who has no idea it’s theirs. This Relay is how the handoff actually gets noticed: the comment carries the context, and @mentioning the new owner in it fires the @Mention in a comment notification they do receive. The contact never sees any of it. Assigning more than one teammate works too, which is how a manager lets their team reply on their behalf. Mention each of them in the comment.
Assignment isn’t a notification event. MessageDesk notifies on new messages, @mentions in comments, and finished exports and imports. Being assigned isn’t on that list, and the Only notify me about conversations assigned to me email setting filters new message notifications to your threads rather than alerting you when you’re assigned one. See Notification preferences.

Conversation Closed

Reset and sync when a thread closes

Why it works: Closing a conversation doesn’t unassign anyone on its own, and a new inbound message reopens the thread with those assignees still attached. That’s how a closed thread comes back owned by whoever handled it last, even when they’re not the right owner now. This Relay resets assignment so the next message lands unassigned and your routing handles it fresh. The Resolved label keeps reporting clean, and the webhook pushes the close event to your CRM, warehouse, or ticketing tool. Gating on Teammate Assigned set to Any teammate means the Relay only runs when someone’s actually assigned.
Ships as a template: This template is available as the Unassign on Close starter from the Relays module. Install it in one click, or build it from the fields above.

Conversation Label Removed

Sync the change when a label comes off

Why it works: A label coming off usually signals a state change, so firing on removal keeps your CRM or reporting in sync without anyone remembering to update it. Remove labels isn’t available on this trigger, so this Relay reacts to a removal rather than performing one.

Call Received

Log and route inbound calls

Why it works: Voice activity lives in the same thread as SMS. Firing on the call assigns an owner, drops an internal note, and pings your notifier the moment the phone rings. No waiting for a follow-up text.
Call Received works on MessageDesk-owned numbers only. It doesn’t fire for Twilio-connected, Telegorithm, or hosted (text-enabled) numbers. Reply to message isn’t available on this trigger. See Call Received actions.

Call Received works only for fully ported (voice and text) and text-only numbers. It doesn’t fire for Twilio-connected numbers or hosted (text-enabled) numbers that are already tied to a voice service. Reply to message isn’t available on this trigger. See Call Received actions for the full action list.

Inbound Webhook Received

Text a contact from another tool

Why it works: Your CRM, form, or scheduling tool texts a contact through MessageDesk the moment something happens. Appointment reminders and order updates stop being a copy-paste job. Include “Reply STOP to opt out.” in the message.

Keep a contact property in sync

Why it works: When a value changes in another system, the webhook updates the matching property in MessageDesk. Text properties accept any payload value. Non-text properties map the matching Custom Property from the payload, and the value has to pass type validation.
This is a non-conversation trigger. It runs against the contact in the payload, so conversation-scoped conditions don’t apply. Add labels to the conversation is still available. See Webhooks for the endpoint URL, the X-MD-Signature header, and the payload schema.

Contact Created, Contact Updated, and Comment Created

Three triggers that work as one pattern. The two contact triggers fire against a contact rather than a conversation, so on their own they can’t label or assign anything. Comment Created is what connects them to a conversation.

Bridge a contact property to a label and an owner

That’s a problem when the thing deciding ownership lives in a contact property: a Clinician, Account owner, or Territory field. The way through is a comment. Send Comment creates the conversation and writes the property value into it. Comment Created is a conversation trigger, so it can label and assign. The comment is the bridge. Part 1: write the property into a comment. Build this twice, once on each trigger. Part 2: read the comment, then label and assign. Build one of these per possible value. Why it works: Updating one contact property does the rest. The contact Relay drops a comment carrying the value, and the matching Comment Created Relay turns that value into a label and an owner. Nobody labels or assigns by hand, and the label keeps working as a scope for every other Relay you build.
This needs a saved contact. Contacts and conversations are separate records in MessageDesk, which is what lets an anonymous conversation exist as a bare phone number. The bridge reads a contact property, so a conversation with no contact behind it has nothing to route on. You can still label anonymous conversations by hand, or with a Message Received Relay, but not with this pattern. Get contacts saved and their properties populated first.
Expect a comment every time the property changes. The Part 1 Relay on Contact Updated fires on every update to that contact, so the internal comment reposts each time. That’s what keeps the label correct if someone edits the field later, and the comments accumulate in the thread.If the noise outweighs that, turn off the Contact Updated half and keep only Contact Created. The cost: a label that gets removed later won’t come back on its own, and any Relay scoped to that label quietly stops matching that conversation. Contacts are visible to your team; internal comments are not visible to the contact either way.
A Relay’s comment does fire Comment Created. It won’t re-trigger the Relay that posted it, so this can’t loop, but it does reach other Comment Created Relays. That’s the whole mechanism. See Comment Created.
Part 2 costs one Relay per value. Fourteen clinicians means fourteen Comment Created Relays, each matching one name. They’re near-identical, so build one and duplicate it. Keep the matched values distinct enough that Comment contains text can’t hit two at once: Sam Rivera beats Sam when you also have a Samir.
What the property and label unlock downstream. Build a saved filter per value and each owner can pull up their own client list, select all, and message them at once. And because a custom role can scope someone’s Inbox to specific labels, the label this Relay applies also feeds who can see the thread. Build the role by copying Operator and setting Label inboxes to Editor or Viewer on just that person’s label, with No Access elsewhere. The default Operator role won’t do it on its own: its label permissions govern editing labels, not restricting what shows up in the Inbox. One caveat that matters here, since this Relay assigns as well as labels: assignment overrides label scope, so an assigned teammate can see the thread even with No Access to its label.

Opt Out Created

Follow up on an opt-out

Why it works: The trigger fires on the opt-out event, so it catches opt-outs that never arrive as a STOP text. Labeling keeps the thread visible to compliance. An owner confirms you honored the request. The webhook syncs it downstream, so no other system texts the contact.
MessageDesk already blocks sending to opted-out contacts at the workspace level. This Relay is for awareness, ownership, and audit trails, not for blocking the message. Message-sending actions aren’t available on this trigger, and conversation actions run only on channel-specific opt-outs. See Opt Out Created.

Industry starting points

Every row below is one of the builds above with a different keyword, label, or line attached. Find the situation closest to yours, then go build it.
MessageDesk facilitates 10DLC registration as your CSP and honors opt-outs at the workspace level. That covers the compliance floor for the retention and recordkeeping rows above. It doesn’t replace your own retention policy.

See also