Step 6: Add Executor
This step adds event-driven automation to your application using the Executor service. You'll create an executor that automatically sends Slack notifications whenever a new task is created in your database.
What This Step Does
In this step, you:
- Enable record event publishing on the Task type to emit events when tasks are created
- Create an Executor named
new-task-slack-notification - Configure a trigger for Task creation events
- Add a webhook operation to send messages to Slack
- Define the notification payload using Task data
This demonstrates how to integrate external systems and react to database events in real time.
Configuration Files
To follow along, review the configuration files for this step here.
tailordb.tf (Updated)
The Task type configuration is updated to enable event publishing:
<span><span style="color: var(--shiki-token-function)">resource</span><span style="color: var(--shiki-color-text)"> "tailor_tailordb_type" "task" {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> var.workspace_id</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> tailor_tailordb.prj_mgmt_db.namespace</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Task"</span></span>
<span><span style="color: var(--shiki-color-text)"> description </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Task Description"</span></span>
<span><span style="color: var(--shiki-color-text)"> settings </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> publish_record_events </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> fields </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-comment)"># ... field definitions remain the same</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> relationships </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-comment)"># ... relationship definitions remain the same</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
executor_new_task_slack_notification.tf (New)
This file defines the executor that sends Slack notifications:
<span><span style="color: var(--shiki-token-function)">resource</span><span style="color: var(--shiki-color-text)"> "tailor_executor" "new_task_slack_notification" {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> var.workspace_id</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"new-task-slack-notification"</span></span>
<span><span style="color: var(--shiki-color-text)"> description </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"notify slack when a new task is created"</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> trigger </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> event </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> type </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"tailordb.type_record.created"</span></span>
<span><span style="color: var(--shiki-color-text)"> condition </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)"><<EOF</span></span>
<span><span style="color: var(--shiki-token-string)"> args.namespaceName == "project-management-db" && args.typeName == "Task"</span></span>
<span><span style="color: var(--shiki-token-keyword)"> EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> operation </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> webhook </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> url </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)"><<EOF</span></span>
<span><span style="color: var(--shiki-token-string)"> "https://hooks.slack.com/services/<your-service-name>"</span></span>
<span><span style="color: var(--shiki-token-keyword)"> EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> headers </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> key </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Content-Type"</span></span>
<span><span style="color: var(--shiki-color-text)"> raw_value </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"application/json"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)"> body </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)"><<EOF</span></span>
<span><span style="color: var(--shiki-token-string)"> ({</span></span>
<span><span style="color: var(--shiki-token-string)"> "text": "New Task created :tada: " + args.newRecord.name</span></span>
<span><span style="color: var(--shiki-token-string)"> })</span></span>
<span><span style="color: var(--shiki-token-keyword)"> EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
Key Features
Event Publishing
The Task type now includes event publishing settings:
<span><span style="color: var(--shiki-color-text)">settings </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> publish_record_events </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
When enabled, TailorDB emits events whenever records of this type are created, updated, or deleted. These events can be consumed by executors to trigger automated actions.
Event publishing has a small performance overhead, so it's best to enable it only on types where you need event-driven automation.
Executor Resource
The tailor_executor resource defines an event-driven automation. This executor listens for tailordb.type_record.created events on the Task type and posts a JSON payload to a Slack webhook. For a full overview of executor triggers and operations, see the Executor guide.
Slack Webhook Integration
To use this executor, you need to:
- Create a Slack incoming webhook in your Slack workspace
- Copy the webhook URL
- Replace
<your-service-name>in the configuration with your actual webhook path
Expected Outcome
After running terraform apply, you should have:
1.The Task type updated with event publishing enabled
2.An active executor named new-task-slack-notification listening for Task creation events
Verification
-
In the Tailor Console, confirm that the executor is visible and shows a status of Active.
-
Create a new task using your GraphQL API:
<span><span style="color: var(--shiki-token-keyword)">mutation</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> createTask(input: {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">name</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-string-expression)">"Test Task"</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">description</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-string-expression)">"Testing Slack notifications"</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">status</span><span style="color: var(--shiki-color-text)">: TODO</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">dueDate</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-string-expression)">"2024-12-31T23:59:59Z"</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">projectId</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-string-expression)">"your-project-id"</span></span>
<span><span style="color: var(--shiki-color-text)"> }) {</span></span>
<span><span style="color: var(--shiki-color-text)"> id</span></span>
<span><span style="color: var(--shiki-color-text)"> name</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
When you create a task:
- TailorDB emits a tailordb.type_record.created event
- The executor trigger fires automatically
- A Slack message appears in your channel: "New Task created 🎉 Test Task"
Troubleshooting
If notifications aren't appearing:
- Verify the Slack webhook URL is correct
- Check the executor logs in the Tailor Console for errors
- Ensure
publish_record_events = trueis set on the Task type - Confirm the trigger condition matches your namespace and type names exactly
Wrap-up
Congratulations! You've completed all six steps of building a project management application using the Tailor Platform. Return to the overview to review what you've built.