Slack and Google Calendar workflow recipes
Four tested workflows that alert Slack about big orders, message an assignee, create Google Calendar events with Meet links and keep them in step.
Last updated
Each recipe is a complete workflow you can rebuild and change. They use Slack and Google Calendar from a workflow's Integration step, and they build on How workflows work and How integrations work. Read those first if triggers, steps or connections are new to you.
| Recipe | Trigger | Steps |
|---|---|---|
| Alert Slack about a high-value order | A record is created, with a filter | Integration |
| Message the person a ticket is assigned to | A field changes | Integration |
| Create a calendar event for every booking | A record is created | Integration, Update Data |
| Keep calendar events in step with bookings | A field changes | Integration |
Note: The examples use entity and field names such as orders and bookings. Swap in your own. Every recipe needs the provider connected first: Slack for the first two, Google Calendar for the last two. See Connect Slack to send messages from workflows and Connect Google Calendar to create events from workflows.
Alert Slack about a high-value order
Goal: post to a Slack channel only when an order is worth a look, not on every order.
Before you start: an orders entity with customer_email (text) and total (decimal) fields, and a #high-value-orders channel in your Slack workspace.
| Key | Step | Why |
|---|---|---|
notify_slack |
Integration | Runs Slack's Send Message operation |
The trigger does the filtering. A filter on the trigger means no job is created for ordinary orders. See Triggers and scheduling for every filter operator.
In the Anythink dashboard
- Open Workflows and select New Workflow. Enter the Name
high-value-order-alert. - Leave Trigger Type as Event, set Event Type to Entity Created and Entity to
orders. - Under Fire only when…, select Add filter. Set the field to
total, the operator to≥and the value to500. Select Create Workflow. - Select Add Step and open the Integrations tab. Choose Slack.
- Enter the Name
Notify Slackand the Keynotify_slack, and tick Enable Step. Set Operation to Send Message and Credential Source to System (shared connection). - Choose the
#high-value-orderschannel, and set the message:
Order over £500: {{ $anythink.trigger.data.customer_email }} — £{{ $anythink.trigger.data.total }}
- Save the step, make it the start step, save the workflow, then select Enable Workflow.
With the CLI
anythink workflows create high-value-order-alert \
--trigger Event --event EntityCreated --entity orders \
--filter '{"and":[{"field":"total","op":"gte","value":500}]}' --enabled
anythink workflows integration-add <workflow_id> notify_slack \
--name "Notify Slack" --provider slack --operation send-message \
--credential-source system --start --enabled \
--inputs '{"channel":"#high-value-orders","text":"Order over £500: {{ $anythink.trigger.data.customer_email }} — £{{ $anythink.trigger.data.total }}"}'
workflows create prints the workflow's ID. Use it in integration-add.
With an AI assistant (MCP)
Create a workflow called high-value-order-alert that runs when a record is created in orders, but only when total is at least 500. Enable it. Then show me the workflow.
The assistant runs workflows create with --filter through the cli tool, then workflows get. Add the Integration step in the dashboard or with the CLI, as above. Its message holds {{ }} expressions that Anythink fills in for each record.
Check it worked
- Create two orders, one with a
totalof120and one with749.5. - Open the workflow and select View Job History. There is one job, for the larger order. The
notify_slackstep's output hasok: true, thechannelID and the message'sts. - The message appears in
#high-value-orders.
How it works:
credential_source: "system"posts as your project's Slack connection, not as a particular user.- The filter is evaluated when the record is created, so the
120order never starts a job. - If Slack isn't connected, the job fails with
No credentials found for slack. Link the step's failure handle to a Send an Email step if you want to hear about it.
What to change: swap the total filter for whatever matters (a status field, a region, a flag), and the channel for wherever the right people are.
Message the person a ticket is assigned to
Goal: when a ticket gets an assignee, send that person a Slack direct message.
Before you start: a tickets entity with subject (text) and assignee_slack_id (text) fields. The ID is the person's Slack member ID, which looks like U024BE7LH.
| Key | Step | Why |
|---|---|---|
dm_assignee |
Integration | Runs Slack's Send Direct Message operation |
In the Anythink dashboard
- Create a workflow named
ticket-assigned-dmwith an Event trigger on Entity Updated fortickets. - Under Fire only when…, select Add filter, then Condition. Set the first condition to
assignee_slack_idchanged, and the second toassignee_slack_idis not null. Leave the group on All of these. Select Create Workflow. - Add an Integration step. Choose Slack, enter the Key
dm_assignee, set Operation to Send Direct Message and Credential Source to System (shared connection). - Set User ID to
{{ $anythink.trigger.data.assignee_slack_id }}and the message to:
You've been assigned: {{ $anythink.trigger.data.subject }}
- Save the step, make it the start step, save the workflow, then select Enable Workflow.
With the CLI
anythink workflows create ticket-assigned-dm \
--trigger Event --event EntityUpdated --entity tickets \
--filter '{"and":[{"field":"assignee_slack_id","op":"changed"},{"field":"assignee_slack_id","op":"is_not_null"}]}' \
--enabled
anythink workflows integration-add <workflow_id> dm_assignee \
--name "DM the assignee" --provider slack --operation send-direct-message \
--credential-source system --start --enabled \
--inputs '{"user":"{{ $anythink.trigger.data.assignee_slack_id }}","text":"You have been assigned: {{ $anythink.trigger.data.subject }}"}'
With an AI assistant (MCP)
Create a workflow called ticket-assigned-dm that runs when a record in tickets is updated, but only when assignee_slack_id changes and is not null. Enable it. Then show me the workflow.
The assistant runs workflows create with --filter through the cli tool. Add the Integration step in the dashboard or with the CLI, as above.
Check it worked
Set assignee_slack_id on a ticket. The job appears in View Job History, and the person gets a message from your Slack app. Changing the ticket's subject doesn't start another job, because assignee_slack_id didn't change.
How it works:
changedcompares the new value with the old one, andis not nullstops a job when the assignee is cleared.send-direct-messageopens a conversation with the user, then posts the message. The step's output hasokandts.- The bot needs the
im:writescope, which Anythink requests when you connect Slack.
What to change: store the Slack ID on your users or contacts instead, and read it in an earlier step. To send to a channel as well, add a second Integration step with Send Message.
Create a calendar event for every booking
Goal: when a booking is created, put it on a shared calendar with a Google Meet link, save the event's ID on the booking, and flag the booking if Google rejects the call.
Before you start: Google Calendar connected as a project connection, and a bookings entity:
anythink entities create bookings
anythink fields add bookings customer_name --type varchar
anythink fields add bookings starts_at --type timestamp
anythink fields add bookings ends_at --type timestamp
anythink fields add bookings calendar_event_id --type varchar
anythink fields add bookings status --type varchar
anythink fields add bookings needs_attention --type boolean --default false
| Key | Step | Why |
|---|---|---|
create_event |
Integration | Creates the Google Calendar event |
store_event_id |
Update Data | Saves the event's ID on the booking, so it can be found later |
flag_attention |
Update Data | Marks the booking when the event couldn't be created |
In the Anythink dashboard
- Create a workflow named
booking-calendar-eventwith an Event trigger on Entity Created forbookings. - Add an Integration step. Choose Google Calendar, enter the Key
create_event, set Operation to Create Event and Credential Source to System (shared connection). - Set Event Title to
Booking: {{ $anythink.trigger.data.customer_name }}, Start Time to{{ $anythink.trigger.data.starts_at }}and End Time to{{ $anythink.trigger.data.ends_at }}, and switch on Add Google Meet. Leave Time Zone asUTC. - Add an Update Data step with the Key
store_event_id. Set Entity tobookings, Record ids to{{ $anythink.trigger.id }}and the Payload to:
{ "calendar_event_id": "{{ $anythink.steps.create_event.id }}" }
- Add a second Update Data step with the Key
flag_attention. Set Entity tobookings, Record ids to{{ $anythink.trigger.id }}and the Payload to{ "needs_attention": true }. - Make
create_eventthe start step. Drag from its green handle tostore_event_idand from its red handle toflag_attention. Save the workflow, then select Enable Workflow.
With the CLI
anythink workflows create booking-calendar-event \
--trigger Event --event EntityCreated --entity bookings --enabled
anythink workflows integration-add <workflow_id> create_event \
--name "Create calendar event" --provider google-calendar --operation create-event \
--credential-source system --start --enabled \
--inputs '{"summary":"Booking: {{ $anythink.trigger.data.customer_name }}","startDateTime":"{{ $anythink.trigger.data.starts_at }}","endDateTime":"{{ $anythink.trigger.data.ends_at }}","addGoogleMeet":true}'
anythink workflows step-add <workflow_id> store_event_id \
--name "Store event ID" --action UpdateData --enabled \
--params '{"entity_name":"bookings","ids":"{{ $anythink.trigger.id }}","payload":"{ \"calendar_event_id\": \"{{ $anythink.steps.create_event.id }}\" }"}'
anythink workflows step-add <workflow_id> flag_attention \
--name "Flag for follow-up" --action UpdateData --enabled \
--params '{"entity_name":"bookings","ids":"{{ $anythink.trigger.id }}","payload":"{ \"needs_attention\": true }"}'
anythink workflows step-link <workflow_id> <create_event_step_id> \
--on-success <store_event_id_step_id> --on-failure <flag_attention_step_id>
Each step-add and integration-add prints the new step's ID. payload is a string that holds JSON, so its inner quotes are escaped.
With an AI assistant (MCP)
Create a bookings entity with customer_name, starts_at, ends_at, calendar_event_id, status and needs_attention fields. Then create a workflow called booking-calendar-event that runs when a record is created in bookings, and enable it.
The assistant runs entities create, fields add and workflows create through the cli tool. Add the steps in the dashboard or with the CLI, as above, because their inputs hold {{ }} expressions.
Check it worked
- Create a booking with a
starts_atandends_atan hour apart. - Open View Job History. The job succeeds, the
create_eventoutput has the event'sid,htmlLinkandmeetLink, and the booking'scalendar_event_idis filled in. - The event appears on the connected calendar with a Meet link.
How it works:
- An Integration step's output sits at the top level of the step's data, so the event ID is
{{ $anythink.steps.create_event.id }}. starts_atandends_atare UTC timestamps, andtimeZonedefaults toUTC, so the event lands at the right time.- When Google Calendar isn't connected, or Google rejects the call,
create_eventfails and the red link runsflag_attention. The job then finishes as a success, because the failure was handled, so filter onneeds_attentionto find these bookings.
What to change: if each member of staff books on their own calendar, connect Google Calendar per user and set Credential Source to Current User (first connection). See Let each user connect their own account. Add attendees to invite the customer. Google emails the invitation.
Keep calendar events in step with bookings
Goal: when a booking moves or is cancelled, update or delete its calendar event.
Before you start: the booking workflow above, so each booking has a calendar_event_id.
| Workflow | Trigger | Step |
|---|---|---|
booking-moved |
bookings updated, starts_at changed |
Integration: Update Event |
booking-cancelled |
bookings updated, status changed to cancelled |
Integration: Delete Event |
Both filters also require calendar_event_id to be set, so a booking with no event doesn't start a job.
In the Anythink dashboard
- Create a workflow named
booking-movedwith an Event trigger on Entity Updated forbookings. Under Fire only when…, add the conditionsstarts_atchanged andcalendar_event_idis not null. - Add an Integration step with the Key
update_event. Choose Google Calendar, set Operation to Update Event and Credential Source to System (shared connection). Set Event ID to{{ $anythink.trigger.data.calendar_event_id }}, Start Time to{{ $anythink.trigger.data.starts_at }}and End Time to{{ $anythink.trigger.data.ends_at }}. - Save, make it the start step, and select Enable Workflow.
- Create a second workflow named
booking-cancelledon Entity Updated forbookings, with the conditionsstatuschanged tocancelledandcalendar_event_idis not null. - Add an Integration step with the Key
delete_event, set Operation to Delete Event and Event ID to{{ $anythink.trigger.data.calendar_event_id }}. Save, make it the start step, and enable the workflow.
With the CLI
anythink workflows create booking-moved \
--trigger Event --event EntityUpdated --entity bookings \
--filter '{"and":[{"field":"starts_at","op":"changed"},{"field":"calendar_event_id","op":"is_not_null"}]}' \
--enabled
anythink workflows integration-add <moved_workflow_id> update_event \
--name "Move calendar event" --provider google-calendar --operation update-event \
--credential-source system --start --enabled \
--inputs '{"eventId":"{{ $anythink.trigger.data.calendar_event_id }}","startDateTime":"{{ $anythink.trigger.data.starts_at }}","endDateTime":"{{ $anythink.trigger.data.ends_at }}"}'
anythink workflows create booking-cancelled \
--trigger Event --event EntityUpdated --entity bookings \
--filter '{"and":[{"field":"status","op":"changed_to","value":"cancelled"},{"field":"calendar_event_id","op":"is_not_null"}]}' \
--enabled
anythink workflows integration-add <cancelled_workflow_id> delete_event \
--name "Cancel calendar event" --provider google-calendar --operation delete-event \
--credential-source system --start --enabled \
--inputs '{"eventId":"{{ $anythink.trigger.data.calendar_event_id }}"}'
With an AI assistant (MCP)
Create two workflows on bookings. booking-moved runs when a record is updated, only when starts_at changes and calendar_event_id is not null. booking-cancelled runs when a record is updated, only when status changes to cancelled and calendar_event_id is not null. Enable both.
The assistant runs workflows create with --filter through the cli tool. Add each Integration step in the dashboard or with the CLI, as above.
Check it worked
Change a booking's starts_at, then set its status to cancelled. Each change starts one job in the matching workflow, and View Job History shows the update_event and delete_event outputs. The event moves, then disappears from the calendar.
How it works:
changedandchanged tocompare the record before and after the update, so editing other fields doesn't start either workflow.- Update Event changes only the parameters you send. Delete Event returns
successandmessage. - Both workflows write nothing back to
bookings, so they can't trigger each other.
What to change: to also rename the event when customer_name changes, add summary to the Update Event inputs and a customer_name changed condition to a third workflow.