powered by

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

  1. Open Workflows and select New Workflow. Enter the Name high-value-order-alert.
  2. Leave Trigger Type as Event, set Event Type to Entity Created and Entity to orders.
  3. Under Fire only when…, select Add filter. Set the field to total, the operator to ≥ and the value to 500. Select Create Workflow.
  4. Select Add Step and open the Integrations tab. Choose Slack.
  5. Enter the Name Notify Slack and the Key notify_slack, and tick Enable Step. Set Operation to Send Message and Credential Source to System (shared connection).
  6. Choose the #high-value-orders channel, and set the message:
text
Order over £500: {{ $anythink.trigger.data.customer_email }} — £{{ $anythink.trigger.data.total }}
  1. Save the step, make it the start step, save the workflow, then select Enable Workflow.

With the CLI

bash
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)

text
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

  1. Create two orders, one with a total of 120 and one with 749.5.
  2. Open the workflow and select View Job History. There is one job, for the larger order. The notify_slack step's output has ok: true, the channel ID and the message's ts.
  3. 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 120 order 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

  1. Create a workflow named ticket-assigned-dm with an Event trigger on Entity Updated for tickets.
  2. Under Fire only when…, select Add filter, then Condition. Set the first condition to assignee_slack_id changed, and the second to assignee_slack_id is not null. Leave the group on All of these. Select Create Workflow.
  3. Add an Integration step. Choose Slack, enter the Key dm_assignee, set Operation to Send Direct Message and Credential Source to System (shared connection).
  4. Set User ID to {{ $anythink.trigger.data.assignee_slack_id }} and the message to:
text
You've been assigned: {{ $anythink.trigger.data.subject }}
  1. Save the step, make it the start step, save the workflow, then select Enable Workflow.

With the CLI

bash
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)

text
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:

  • changed compares the new value with the old one, and is not null stops a job when the assignee is cleared.
  • send-direct-message opens a conversation with the user, then posts the message. The step's output has ok and ts.
  • The bot needs the im:write scope, 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:

bash
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

  1. Create a workflow named booking-calendar-event with an Event trigger on Entity Created for bookings.
  2. Add an Integration step. Choose Google Calendar, enter the Key create_event, set Operation to Create Event and Credential Source to System (shared connection).
  3. 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 as UTC.
  4. Add an Update Data step with the Key store_event_id. Set Entity to bookings, Record ids to {{ $anythink.trigger.id }} and the Payload to:
json
{ "calendar_event_id": "{{ $anythink.steps.create_event.id }}" }
  1. Add a second Update Data step with the Key flag_attention. Set Entity to bookings, Record ids to {{ $anythink.trigger.id }} and the Payload to { "needs_attention": true }.
  2. Make create_event the start step. Drag from its green handle to store_event_id and from its red handle to flag_attention. Save the workflow, then select Enable Workflow.

With the CLI

bash
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)

text
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

  1. Create a booking with a starts_at and ends_at an hour apart.
  2. Open View Job History. The job succeeds, the create_event output has the event's id, htmlLink and meetLink, and the booking's calendar_event_id is filled in.
  3. 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_at and ends_at are UTC timestamps, and timeZone defaults to UTC, so the event lands at the right time.
  • When Google Calendar isn't connected, or Google rejects the call, create_event fails and the red link runs flag_attention. The job then finishes as a success, because the failure was handled, so filter on needs_attention to 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

  1. Create a workflow named booking-moved with an Event trigger on Entity Updated for bookings. Under Fire only when…, add the conditions starts_at changed and calendar_event_id is not null.
  2. 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 }}.
  3. Save, make it the start step, and select Enable Workflow.
  4. Create a second workflow named booking-cancelled on Entity Updated for bookings, with the conditions status changed to cancelled and calendar_event_id is not null.
  5. 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

bash
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)

text
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:

  • changed and changed to compare 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 success and message.
  • 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.

Next steps