Platform · Automations

Fire a message when something real happens.

Triggers, steps and variables. The engine that turns an inbound event (a new HubSpot contact, a Shopify order, a lead form, an inbound message) into a timely reply, with dedup built in.

  • 37+ triggers across first-party and partner events
  • 8 step types: action, condition, delay, goal and more
  • Entity ledger prevents double enrolment on retries

What's inside

The headlines before you dive in.

  • aiActionInvocation: fires when the AI assistant invokes a defined action during a conversation.

  • appointmentBooked: fires when a new appointment is booked.

  • appointmentCanceled: fires when an existing appointment is cancelled.

  • appointmentCompleted: fires when an appointment is marked completed.

  • appointmentNoShow: fires when an appointment is marked as no-show.

  • appointmentRescheduled: fires when an existing appointment is moved to a new time.

Documentation Platform fundamentals Automations reference

Platform integration

Automations reference

  • CategoryPlatform

Overview

The MessageMind automation engine is a trigger / step / variable system that enrolls a contact (or entity like a reservation, appointment, or lead form submission) when a real event fires, then walks that enrollment through a graph of steps (initial-step, conditions, actions, delays, notifications, goals) while resolving campaign tokens from variable families against the live record. Triggers come from first-party events (contact created, label added, appointment booked), channel events (conversation created, Facebook / Instagram comment), and partner integrations (HubSpot, Jobber, Dengro, ScoreApp, Perspective Funnels, Playtomic, Hospitable, Meta Lead Ads, GHL, custom webhooks). Every enrollment is deduped through the entity ledger so a retried webhook never produces a second run.

What MessageMind can do with it

  • aiActionInvocation: fires when the AI assistant invokes a defined action during a conversation.
  • appointmentBooked: fires when a new appointment is booked.
  • appointmentCanceled: fires when an existing appointment is cancelled.
  • appointmentCompleted: fires when an appointment is marked completed.
  • appointmentNoShow: fires when an appointment is marked as no-show.
  • appointmentRescheduled: fires when an existing appointment is moved to a new time.
  • contactAddedToStage: fires when a contact enters a pipeline stage.
  • contactBirthday: fires on a contact birthday (date-driven).
  • contactCreated: fires when a new contact is created in MessageMind.
  • contactInteracted: fires when a contact interacts (inbound message / engagement).
  • contactMovedToStage: fires when a contact is moved from one pipeline stage to another.
  • contactRemovedFromStage: fires when a contact is removed from a pipeline stage.
  • conversationCreated: fires when a new conversation is opened on a channel.
  • customWebhook: fires on an inbound HTTP call to a MessageMind-minted webhook URL.
  • dengroNewEnquiry: fires on a new Dengro enquiry.
  • dengroNewLead: fires on a new Dengro lead.
  • eventBooked: fires when a calendar event is booked.
  • eventCancelled: fires when a calendar event is cancelled.
  • eventNoShow: fires when a calendar event is marked no-show.
  • eventRescheduled: fires when a calendar event is rescheduled.
  • facebookCommentsOnPost: fires when a comment is left on a connected Facebook post.
  • ghlWebhook: fires on an inbound GoHighLevel webhook.
  • googleSheetConnection: fires on a connected Google Sheet row event.
  • guestReviewLeft: fires when a guest leaves a review.
  • hospitableReservationCreated: fires when a new Hospitable reservation is created.
  • hospitableReservationFinancialsChanged: fires when a Hospitable reservation financials change.
  • hospitableReservationStatusChanged: fires when a Hospitable reservation status changes.
  • hubspotContactCreated: fires once a new HubSpot contact has been synced into MessageMind.
  • instagramCommentsOnPost: fires when a comment is left on a connected Instagram post.
  • jobber: fires on a Jobber event (job / client lifecycle).
  • labelAdded: fires when a label is added to a contact.
  • labelRemoved: fires when a label is removed from a contact.
  • metaLeadFormReceived: fires when a Meta (Facebook / Instagram) Lead Ads form submission is received.
  • perspectiveFunnelCompleted: fires when a visitor completes a Perspective funnel.
  • perspectiveFunnelStarted: fires when a visitor starts a Perspective funnel.
  • playtomicOpenMatchCancelled: fires when a Playtomic open match is cancelled.
  • playtomicOpenMatchCreated: fires when a Playtomic open match is created.

AI agent use cases

  • New lead to welcome: metaLeadFormReceived or dengroNewLead enrolls the contact, a condition branches on source, and a send-message action delivers the first-touch WhatsApp / SMS.
  • Cart abandoned to reminder: a customWebhook from the storefront enrolls the contact, a delay waits one hour, then a send-message action nudges with the cart recovery link.
  • Post-booking to thank you: appointmentBooked or hospitableReservationCreated enrolls, a delay waits until after the stay / visit, then a send-message action asks for a review.
  • Review request after stay: guestReviewLeft or appointmentCompleted enrolls, a condition filters on channel, then a notification pings the team on low ratings.
  • Pipeline nurture: contactAddedToStage enrolls, conditions check tenure, delays space the touches, and goal steps exit the contact once the stage changes.
  • Comment to DM: facebookCommentsOnPost / instagramCommentsOnPost enrolls, a condition matches the keyword, and a send-message action opens a DM thread.

Configuration

  • initial-step: the entry point generated from the trigger, carrying the enrolled entity (contact / reservation / appointment / lead form submission).
  • action: send-message, send-ai-reply, assign-team-member, add / remove label, move pipeline stage, google-sheet add-row, google-sheet update-row, and the other side-effect steps resolved through automation.action.helper.mjs.
  • condition: branch on contact fields, labels, pipeline stage, custom field types, Google Sheet lookups, WooCommerce order meta / products, first-match routing, and the field-value resolvers.
  • delay: pause the enrollment for a fixed or computed duration before advancing.
  • collect-data: ask the contact for a field value and store it on the record.
  • notification: alert a team member or channel (internal signal, no outbound message to the contact).
  • retry-call: retry a failed outbound call step.
  • goal: exit condition that short-circuits the remaining steps once met.

Example workflows

How a trigger fires through to a message

  1. An external event lands (webhook, channel event, scheduler) and the matching registry/triggers/*.trigger.mjs descriptor is resolved by key.
  2. The generic enroller runs the entity ledger dedup (runOnContact / re-entry queue) so a retried delivery is a no-op instead of a second enrollment.
  3. The initial-step is created with the enrolled entity and its trigger-specific metadata attached.
  4. The engine walks to the next step; condition steps evaluate against the live record, delay steps schedule a resume, action steps perform the side effect.
  5. Campaign tokens inside messages and action payloads are resolved by the matching variable families (contact.family, dengro.family, scoreApp.family, perspective.family, playtomic.family, hospitable.family, reservation.family, metaLeads.family, ghl.family, pipeline.family, and the per-PMS extensions).
  6. Terminal steps (goal reached, graph exhausted, or failure captured by automation.action.failureReason) close the enrollment and the result is written back for the automation dashboard and errors view.

Limitations

  • Enrollments are deduped through the entity ledger: a retried webhook or re-delivered event for the same contact / entity will not create a second run, which is why most triggers are not repeatable by default.
  • Variable tokens only resolve against the family the trigger declares (for example a hubspotContactCreated run resolves {contact.*} but not {playtomic_*}); tokens from an unrelated family render empty.
  • Trigger tiers (triggerTiers.enrollable and friends) decide whether a trigger can start a new enrollment or only advance an existing one; non-enrollable triggers never create new runs on their own.
  • Action steps surface a failureReason on failure (automation.action.failureReason.mjs); the engine does not silently swallow a failed send, it records the reason and stops that branch.
  • Google Sheet, label, pipeline stage, assign-team-member, and send-ai-reply actions each have their own validation gate: a misconfigured step is rejected before the run, not partway through.
  • Run A Test uses buildTestMetadata on the trigger, so triggers whose test metadata is empty (like hubspotContactCreated) can only be test-run with the contact itself as input.