Skip to main content

Triggers

Triggers automatically run an agent when something happens — no schedule required. Where a Job runs an agent on a fixed clock, a Trigger runs an agent in reaction to an event, letting your workspace respond the moment something changes.

ToothFairyAI supports two event sources:

  • Native — ToothFairyAI's own platform events (a document is created, an agent completes, a planner is awaiting approval, etc.).
  • External — Trigger events emitted by third-party apps (Google Drive, Slack, GitHub, Salesforce, Stripe, Notion, Jira, and many more). External triggers are acquired by polling the provider with a configured Authorisation.

When a trigger fires, it sends the bound prompt (or forced prompt) to the selected agent exactly as a manual chat run would.

Triggers can be created and managed from the following menu: Settings > Triggers > Create trigger

Create a trigger

Basic Information

  1. Click on the Create trigger button.
  2. Name — Assign a unique name to identify the trigger.
  3. Description (optional) — Describe what this trigger does and when it should fire.

Execution Configuration

  1. Agent — Select the agent that will run when the trigger fires. Voice-mode agents are excluded from the dropdown (triggers target text-capable agents).
  2. Prompt — Choose the prompt sent to the agent. Available prompts are your saved prompts (see Prompting). The dropdown only lists prompts made available to the selected agent. You can provide a Forced Prompt instead — free-text instructions (max 1024 characters) used directly as the agent's input. Either a prompt or a forced prompt is required.
No prompts available

If the selected agent has no prompts assigned to it — and you have not provided a forced prompt — the form shows a placeholder linking you straight to the Generation settings section to create one.

Event Configuration

  1. Event Source — Choose where the triggering event comes from:

Native (ToothFairyAI events)

React to events produced inside your ToothFairyAI workspace.

  • Native Event Type — The platform event to listen for (e.g. document.created, agent_completed, planner_pending_approval). See the Native events table below.

  • Data Filter (optional) — Narrow the trigger to events whose payload matches conditions you define. Each row is a field / operator / value triple:

    OperatorMeaning
    equalsField equals the value
    not equalsField does not equal the value
    includesField contains the value
    greater thanField is numerically greater than the value
    less thanField is numerically less than the value
    existsField is present in the payload

    Add as many rows as you need; an event must satisfy all rows to fire. Empty field rows are ignored on save.

External (3rd-party app)

React to events emitted by an external provider.

  • Provider — The third-party app to listen to (e.g. Google Drive, Slack, GitHub). Providers that are registered but not yet fully implemented are shown with a (soon) badge and cannot be saved until their adapter lands.
  • Provider Event — The specific event from the provider (e.g. drive.file.created, slack.message.mentioned, github.pr.merged).
  • Authorisation — The credential the trigger will use to poll the provider. The dropdown lists every Authorisation you have configured in the workspace; the selected authorisation's type is stored as the trigger's authorisation type on save.
  • Acquisition Mode — How ToothFairyAI acquires the event:
    • Polling (default) — Periodically polls the provider's API for new items.
    • Webhook (soon) — Receive push events from the provider. Not yet available.
  • Poll Interval (Polling only) — How often to poll. Options: 1, 2, 5, 10, or 30 minutes (default 5 minutes).
  • Poll Endpoint (Generic REST provider only) — The full URL to poll, e.g. https://api.example.com/v1/items.
  • JSONPath (Generic REST provider only) — The JSONPath expression used to extract the list of new items from each poll response, e.g. $.items[*].
Authorisation required

External triggers need a provider Authorisation to authenticate the poll. If no Authorisations exist when an external provider is selected, the form shows a hint — create an Authorisation first, then return to the trigger.

Status

  1. Active — Toggle to arm or pause the trigger. When active, the trigger is saved with status ARMED and will fire on matching events. When inactive it is saved as PAUSED and will not fire until re-enabled.

  2. Click on the Create button to save the trigger.

Native events

These are ToothFairyAI's own platform events, organized by category:

Event IDCategoryLabelDescription
document.createddocumentsDocument CreatedA new document has been created in the workspace
document.updateddocumentsDocument UpdatedAn existing document has been modified
document.deleteddocumentsDocument DeletedA document has been deleted from the workspace
agent_completedagentAgent CompletedAn agent has successfully completed processing a chat message
agent_failedagentAgent FailedAn agent encountered an error while processing a chat message
planner_completedplannerPlanner CompletedA planner has successfully completed all plan steps
planner_failedplannerPlanner FailedA planner encountered an error during execution
planner_pending_approvalplannerPlanner Pending ApprovalA generated plan is awaiting user approval
planner_stoppedplannerPlanner StoppedPlan execution was stopped by the user
Webhooks

Native events are the same events ToothFairyAI emits over its webhooks. Pairing a trigger with a native event is the in-app way to react to those same lifecycle events.

Event payload shape

Every event — native or external — reaches the bound agent in a normalized payload envelope. Its fields are listed below:

FieldTypeDescription
event_typestringNormalized event id, e.g. "external.googleDrive.drive.file.created" or "document.updated". External events are always prefixed external.<provider>.<providerEvent>.
event_category`stringnull`
sourcestringWhere the event came from: "api"
nativeEventIdstringProvider-canonical event name (e.g. googleDrive fileCreated, stripe payment_intent.succeeded).
event_idstringUnique event id — used to avoid processing the same event twice per trigger.
timestampstring (ISO-8601)When the event occurred.
dataobjectProvider- or platform-specific payload (fields are detailed per event/provider in the reference below). This is the ONLY part the trigger data-filter rows evaluate against.

Sample — native (document.created):

{
"event_type": "document.created",
"event_category": "documents",
"source": "api",
"nativeEventId": "document.created",
"event_id": "evt_document.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"document_id": 12345,
"external_path": null,
"topics": [],
"status": "draft"
}
}

Sample — external (googleDrive.drive.file.created):

{
"event_type": "external.googleDrive.drive.file.created",
"event_category": null,
"source": "poller",
"nativeEventId": "drive.fileCreated",
"event_id": "evt_googleDrive_drive.file.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"fileId": "1a2b3c",
"name": "Proposal.docx",
"mimeType": "application/vnd.google-apps.document",
"modifiedTime": "2026-07-19T03:00:00.000Z",
"eventType": "drive.fileCreated"
}
}

Documents

ToothFairyAI's lifecycle events. Each event below lists the payload the bound agent receives and example data-filter rows.

document.created

Fires when: A new document is created in the workspace — e.g. a file upload, a raw-text document, or a document generated by the API.

Sample payload the agent receives:

{
"event_type": "document.created",
"event_category": "documents",
"source": "api",
"nativeEventId": "document.created",
"event_id": "evt_document.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"document_id": 12345,
"external_path": null,
"topics": [],
"status": "draft"
}
}

Fields you can filter on (data):

FieldTypeMeaning
document_idnumberInternal id of the document
external_path`stringnull`
topicsstring[]Topic IDs (UUIDs) the document is assigned to — matching a topic means the trigger fires for documents on that topic
statusstringLifecycle status ("draft"

Filter examples:

FieldOperatorValueFires when
statusequalspublishedOnly documents that are already published
topicsincludes5f9c2e4a-7c8d-4b3a-9e2f-1a2b3c4d5e6fOnly documents assigned to a specific topic (match its ID)
Example

To fire only when a document is assigned to a specific topic:

  1. Copy the topic's ID from Settings > Topics (topics are identified by their UUID, e.g. 5f9c2e4a-7c8d-4b3a-9e2f-1a2b3c4d5e6f).
  2. Add a data-filter row — Field topics, Operator includes, Value that topic ID.
  3. The event's data.topics is an array of topic IDs the document carries, so includes matches when any ID in that array equals your value.
  4. Add more rows to narrow further — every row must match. For example a second row status equals published restricts the trigger to published documents on that topic.

document.updated

Fires when: An existing document is modified — content changed, re-indexed or re-published.

Sample payload the agent receives:

{
"event_type": "document.updated",
"event_category": "documents",
"source": "api",
"nativeEventId": "document.updated",
"event_id": "evt_document.updated",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"document_id": 12345,
"external_path": null,
"topics": [],
"status": "published"
}
}

Fields you can filter on (data):

FieldTypeMeaning
document_idnumberInternal id of the document
external_path`stringnull`
topicsstring[]Topic IDs (UUIDs) the document is assigned to — matching a topic means the trigger fires for documents on that topic
statusstringLifecycle status ("draft"

Filter examples:

FieldOperatorValueFires when
statusequalspublishedOnly edits to published documents
topicsincludes5f9c2e4a-7c8d-4b3a-9e2f-1a2b3c4d5e6fOnly edits to documents on a specific topic
document_idequals12345Watch one specific document

document.deleted

Fires when: A document is deleted (archived) from the workspace.

Sample payload the agent receives:

{
"event_type": "document.deleted",
"event_category": "documents",
"source": "api",
"nativeEventId": "document.deleted",
"event_id": "evt_document.deleted",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"document_id": 12345,
"external_path": null,
"topics": [],
"status": "archived"
}
}

Fields you can filter on (data):

FieldTypeMeaning
document_idnumberInternal id of the document
external_path`stringnull`
topicsstring[]Topic IDs (UUIDs) the document is assigned to — matching a topic means the trigger fires for documents on that topic
statusstringLifecycle status ("archived")

Filter examples:

FieldOperatorValueFires when
external_pathexistsOnly documents that were deleted from an external source

Agents

ToothFairyAI's execution outcomes. Each event below lists the payload the bound agent receives and example data-filter rows.

agent_completed

Fires when: An agent successfully finishes processing a chat message. Pair it with a downstream notification, logging or hand-off agent.

Sample payload the agent receives:

{
"event_type": "agent_completed",
"event_category": "agent",
"source": "system",
"nativeEventId": "agent_completed",
"event_id": "evt_agent_completed",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"status": "success",
"agent_id": null,
"is_from_planner": false,
"step_id": null
}
}

Fields you can filter on (data):

FieldTypeMeaning
statusstring"success" for this event
agent_id`stringnull`
is_from_plannerbooleanTrue when the run was a step of a planner plan
step_id`stringnull`

Filter examples:

FieldOperatorValueFires when
is_from_plannerequalsfalseOnly whole agent runs, not planner sub-steps
agent_idexistsOnly runs attributable to an agent

agent_failed

Fires when: An agent encounters an error while processing a chat message — useful to alert, log or re-route the work.

Sample payload the agent receives:

{
"event_type": "agent_failed",
"event_category": "agent",
"source": "system",
"nativeEventId": "agent_failed",
"event_id": "evt_agent_failed",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"status": "error",
"agent_id": null,
"is_from_planner": false,
"error": null
}
}

Fields you can filter on (data):

FieldTypeMeaning
statusstring"error" for this event
agent_id`stringnull`
is_from_plannerbooleanTrue when the run was a step of a planner plan
error`objectnull`

Filter examples:

FieldOperatorValueFires when
errorexistsOnly failures that carry error details

Planners

ToothFairyAI's plan lifecycles. Each event below lists the payload the bound agent receives and example data-filter rows.

planner_completed

Fires when: A planner successfully completes every step of a generated plan.

Sample payload the agent receives:

{
"event_type": "planner_completed",
"event_category": "planner",
"source": "system",
"nativeEventId": "planner_completed",
"event_id": "evt_planner_completed",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"status": "success",
"planner_agent_id": null,
"plan_status": "completed"
}
}

Fields you can filter on (data):

FieldTypeMeaning
statusstring"success" for this event
planner_agent_id`stringnull`
plan_statusstring"completed" for this event

Filter examples:

FieldOperatorValueFires when
plan_statusequalscompletedOnly fully completed plans

planner_failed

Fires when: A planner fails while executing a plan step.

Sample payload the agent receives:

{
"event_type": "planner_failed",
"event_category": "planner",
"source": "system",
"nativeEventId": "planner_failed",
"event_id": "evt_planner_failed",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"status": "error",
"planner_agent_id": null,
"error": null
}
}

Fields you can filter on (data):

FieldTypeMeaning
statusstring"error" for this event
planner_agent_id`stringnull`
error`objectnull`

Filter examples:

FieldOperatorValueFires when
errorexistsOnly failures that carry error details

planner_pending_approval

Fires when: A generated plan is awaiting your approval before execution — a natural place to send a Slack or email alert.

Sample payload the agent receives:

{
"event_type": "planner_pending_approval",
"event_category": "planner",
"source": "system",
"nativeEventId": "planner_pending_approval",
"event_id": "evt_planner_pending_approval",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"status": "pending_approval",
"planner_agent_id": null,
"plan_status": "awaiting_approval"
}
}

Fields you can filter on (data):

FieldTypeMeaning
statusstring"pending_approval" for this event
planner_agent_id`stringnull`
plan_statusstring"awaiting_approval" for this event

Filter examples:

FieldOperatorValueFires when
statusequalspending_approvalOnly plans waiting on the user

planner_stopped

Fires when: Execution of a plan is stopped by the user.

Sample payload the agent receives:

{
"event_type": "planner_stopped",
"event_category": "planner",
"source": "system",
"nativeEventId": "planner_stopped",
"event_id": "evt_planner_stopped",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"status": "stopped",
"planner_agent_id": null,
"plan_status": "stopped_by_user"
}
}

Fields you can filter on (data):

FieldTypeMeaning
statusstring"stopped" for this event
planner_agent_id`stringnull`
plan_statusstring"stopped_by_user" for this event

Filter examples:

FieldOperatorValueFires when
plan_statusequalsstopped_by_userOnly plans stopped by the user (not cancelled)

External providers

The provider catalog is served live from the ToothFairyAI backend and rendered in the form, so new providers appear automatically. The providers below are currently implemented (field-complete polling adapters):

ProviderAuth typeExample events
Google DriveOAuthdrive.file.created, drive.file.updated, drive.file.deleted, drive.folder.created
Microsoft Graph (SharePoint / Azure / OneDrive)OAuthgraph.drive.item.created, graph.list.item.created, graph.calendar.event.created, graph.mail.received
SlackOAuthslack.message.posted, slack.message.mentioned, slack.reaction.added, slack.file.shared
GitHubOAuthgithub.issue.opened, github.pr.merged, github.push, github.release.published, github.star.created
NotionOAuthnotion.page.created, notion.page.updated, notion.database.created
DropboxOAuthdropbox.file.created, dropbox.file.updated, dropbox.file.deleted, dropbox.folder.created
BoxOAuthbox.file.created, box.file.updated, box.file.deleted, box.comment.created
OneDriveOAuthonedrive.file.created, onedrive.file.updated, onedrive.file.deleted
SalesforceOAuthsalesforce.lead.created, salesforce.opportunity.updated, salesforce.case.created, salesforce.custom.object.created
HubSpotOAuthhubspot.contact.created, hubspot.deal.created, hubspot.ticket.created, hubspot.form.submitted
LinearOAuthlinear.issue.created, linear.issue.status.changed, linear.project.created
JiraOAuthjira.issue.created, jira.issue.updated, jira.sprint.started, jira.version.released
AsanaOAuthasana.task.created, asana.task.completed, asana.project.created
TrelloOAuthtrello.card.created, trello.card.moved, trello.card.commented
ZendeskBasiczendesk.ticket.created, zendesk.ticket.assigned, zendesk.user.created
ServiceNowBasicservicenow.incident.created, servicenow.change.request.created, servicenow.problem.created
YouTubeOAuthyoutube.video.uploaded, youtube.comment.created, youtube.subscriber.threshold
GmailOAuthgmail.message.received, gmail.message.received.label, gmail.message.sent
Google CalendarOAuthcalendar.event.created, calendar.event.started, calendar.event.attendee.response, calendar.reminder
Microsoft FormsOAuthforms.response.created, forms.response.updated, forms.form.created
Microsoft TeamsOAuthteams.message.created, teams.message.mentioned, teams.channel.created, teams.member.added
StripeAPI Keystripe.payment.intent.succeeded, stripe.charge.refunded, stripe.customer.created, stripe.subscription.created, stripe.invoice.paid
Generic REST (API Key / OAuth)API Keygeneric.poll — periodically GET a custom REST endpoint and emit items via JSONPath

Each provider exposes its own event list in the Provider Event dropdown; only events valid for the selected provider are shown.

Polling fallback

For a handful of providers (Slack, GitHub, Box, Linear, Zendesk, Stripe) the native acquisition mode is webhook-based; ToothFairyAI implements a polling adapter for these as a functional fallback, with webhook ingestion arriving in a later release.

External event reference

For each implemented provider, the table below lists every event in the Provider Event dropdown, a sample of the payload the bound agent receives, and the data fields your filter rows can target.

Google Drive

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
drive.file.createdFile Createddrive.fileCreatedbothyes
drive.file.updatedFile Updateddrive.fileUpdatedbothyes
drive.file.deletedFile Deleteddrive.fileDeletedbothyes
drive.file.sharedFile Shareddrive.fileSharedn8nno
drive.folder.createdFolder Createddrive.folderCreatedbothyes
drive.file.downloadedFile Downloadeddrive.fileDownloadedactivepiecesno

Sample payload (drive.file.created):

{
"event_type": "external.googleDrive.drive.file.created",
"event_category": null,
"source": "poller",
"nativeEventId": "drive.fileCreated",
"event_id": "evt_googleDrive_drive.file.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"fileId": "1a2b3c",
"name": "Proposal.docx",
"mimeType": "application/vnd.google-apps.document",
"modifiedTime": "2026-07-19T03:00:00.000Z",
"eventType": "drive.fileCreated"
}
}

data fields your filter rows can target:

FieldTypeDescription
fileIdstringProvider-native file id.
namestringFile name.
mimeTypestringFile MIME type.
modifiedTimestring (ISO-8601)Last modification time.

Microsoft Graph (SharePoint / Azure / OneDrive)

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
graph.drive.item.createdDrive Item Createdgraph.driveItemCreatedbothyes
graph.drive.item.updatedDrive Item Updatedgraph.driveItemUpdatedbothyes
graph.drive.item.deletedDrive Item Deletedgraph.driveItemDeletedbothyes
graph.list.item.createdSharePoint List Item Createdgraph.listItemCreatedbothyes
graph.list.item.updatedSharePoint List Item Updatedgraph.listItemUpdatedn8nyes
graph.team.message.createdTeams Message Createdgraph.teamMessageCreatedbothno
graph.team.message.reactionTeams Message Reactiongraph.teamMessageReactionactivepiecesno
graph.calendar.event.createdOutlook Event Createdgraph.calendarEventCreatedbothyes
graph.calendar.event.updatedOutlook Event Updatedgraph.calendarEventUpdatedn8nyes
graph.mail.receivedOutlook Mail Receivedgraph.mailReceivedbothno
graph.contact.createdOutlook Contact Createdgraph.contactCreatedactivepiecesyes

Sample payload (graph.drive.item.created):

{
"event_type": "external.microsoftGraph.graph.drive.item.created",
"event_category": null,
"source": "poller",
"nativeEventId": "graph.driveItemCreated",
"event_id": "evt_microsoftGraph_graph.drive.item.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "01ABCDEFGHIJ",
"name": "Report.xlsx",
"lastModifiedDateTime": "2026-07-19T03:00:00Z",
"eventType": "graph.driveItemCreated"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringProvider-native entity id (driveItem/listItem/...).
namestringEntity display name.
lastModifiedDateTimestring (ISO-8601)Last modification time.

Slack

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
slack.message.postedMessage Postedmessagebothno
slack.message.mentionedApp Mentionedapp_mentionbothno
slack.reaction.addedReaction Addedreaction_addedbothno
slack.reaction.removedReaction Removedreaction_removedn8nno
slack.file.sharedFile Sharedfile_sharebothno
slack.channel.createdChannel Createdchannel_createdactivepiecesyes
slack.user.joinedUser Joined Channelteam_joinactivepiecesyes
slack.star.addedStar Addedstar_addedn8nno
slack.pin.addedPin Addedpin_addedn8nno

Sample payload (slack.message.posted):

{
"event_type": "external.slack.slack.message.posted",
"event_category": null,
"source": "poller",
"nativeEventId": "message",
"event_id": "evt_slack_slack.message.posted",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"ts": "1690000000.001200",
"user": "U02ABCDEF",
"text": "Hello team",
"channel": "C0123ABCDEF",
"ts_iso": "2026-07-19T03:00:00Z",
"eventType": "message"
}
}

data fields your filter rows can target:

FieldTypeDescription
tsstringSlack message timestamp, used as a stable event id.
userstringUser id of the author.
textstringMessage text.
channelstringChannel id the message was posted in.
ts_isostring (ISO-8601)Timestamp in ISO format.
Polling fallback

Partner-native acquisition is webhook/Events API. n8n + Activepieces both use webhooks; this poll adapter is a fallback.

GitHub

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
github.issue.openedIssue Openedissues:openedbothno
github.issue.reopenedIssue Reopenedissues:reopenedbothno
github.issue.closedIssue Closedissues:closedbothno
github.issue.assignedIssue Assignedissues:assignedn8nno
github.issue.commentedIssue Commentedissue_comment:createdbothno
github.pr.openedPull Request Openedpull_request:openedbothno
github.pr.updatedPull Request Updatedpull_request:editedbothno
github.pr.mergedPull Request Mergedpull_request:closedbothno
github.pr.closedPull Request Closedpull_request:closedbothno
github.pr.reviewedPull Request Reviewedpull_request_review:submittedactivepiecesno
github.pushPushpushbothno
github.star.createdStar Createdstar:createdbothno
github.fork.createdFork Createdforkbothno
github.release.publishedRelease Publishedrelease:publishedbothno
github.branch.createdBranch Createdcreateactivepiecesno
github.branch.deletedBranch Deleteddeleteactivepiecesno
github.label.createdLabel Createdlabel:createdn8nno

Sample payload (github.issue.opened):

{
"event_type": "external.github.github.issue.opened",
"event_category": null,
"source": "poller",
"nativeEventId": "issues:opened",
"event_id": "evt_github_github.issue.opened",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": 1234,
"number": 42,
"title": "Fix login flow",
"state": "open",
"user": "octocat",
"updated_at": "2026-07-19T03:00:00Z",
"eventType": "issues:opened"
}
}

data fields your filter rows can target:

FieldTypeDescription
idnumberGitHub-native id (issue/PR).
numbernumberIssue/PR number.
titlestringIssue/PR title.
statestringCurrent state (open/closed).
userstringLogin of the actor.
updated_atstring (ISO-8601)Last update time.
Polling fallback

Partner-native acquisition is webhook (repo hooks). n8n + Activepieces both use webhooks; this poll adapter is a fallback.

Notion

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
notion.page.createdPage Createdpage:page.createdbothyes
notion.page.updatedPage Updatedpage:page.updatedbothyes
notion.page.deletedPage Deletedpage:page.archivedn8nyes
notion.database.createdDatabase Createddatabase:database.createdbothyes
notion.database.updatedDatabase Updateddatabase:database.updatedactivepiecesyes
notion.block.updatedBlock Updatedblock:block.updatedn8nyes

Sample payload (notion.page.created):

{
"event_type": "external.notion.notion.page.created",
"event_category": null,
"source": "poller",
"nativeEventId": "page:page.created",
"event_id": "evt_notion_notion.page.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "d23872cd-c106-4afa-b33d-d3fd66064ccb",
"url": "https://www.notion.so/Page-d23872cdc1064afab33dd3fd66064ccb",
"created_time": "2026-07-19T03:00:00.000Z",
"last_edited_time": "2026-07-19T03:00:00.000Z",
"eventType": "page:page.created"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringNotion page/database uuid.
urlstringPublic Notion URL.
created_timestring (ISO-8601)Creation time.
last_edited_timestring (ISO-8601)Last edit time — the poll watermark.
archivedbooleanWhether the page/database is archived.

Dropbox

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
dropbox.file.createdFile Createdfile:addedbothyes
dropbox.file.updatedFile Updatedfile:modifiedbothyes
dropbox.file.deletedFile Deletedfile:deletedbothyes
dropbox.folder.createdFolder Createdfolder:addedactivepiecesyes
dropbox.file.sharedFile Sharedfile:sharedn8nno

Sample payload (dropbox.file.created):

{
"event_type": "external.dropbox.dropbox.file.created",
"event_category": null,
"source": "poller",
"nativeEventId": "file:added",
"event_id": "evt_dropbox_dropbox.file.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "id:abc",
"name": "notes.txt",
"path": "/notes.txt",
"tag": "file",
"eventType": "file:added"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringDropbox file id.
namestringFile name.
pathstringPath within Dropbox.
tagstringObject type (file/folder).

Box

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
box.file.createdFile CreatedITEM_CREATE/ITEM_UPLOADbothyes
box.file.updatedFile UpdatedITEM_MODIFYbothyes
box.file.deletedFile DeletedITEM_TRASHbothyes
box.file.downloadedFile DownloadedITEM_DOWNLOADbothno
box.folder.createdFolder CreatedFOLDER_CREATEactivepiecesyes
box.file.sharedFile SharedCOLLAB_ADDn8nno
box.comment.createdComment CreatedCOMMENT_CREATEn8nno

Sample payload (box.file.created):

{
"event_type": "external.box.box.file.created",
"event_category": null,
"source": "poller",
"nativeEventId": "ITEM_CREATE/ITEM_UPLOAD",
"event_id": "evt_box_box.file.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "12345678",
"name": "contract.pdf",
"type": "file",
"eventType": "ITEM_CREATE/ITEM_UPLOAD"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringBox item id.
namestringItem name.
typestringItem type (file/folder).
eventTypestringBox event type (ITEM_CREATE/ITEM_MODIFY/...).
Polling fallback

Partner-native acquisition is webhook (Box events stream). n8n + Activepieces both use webhooks; this poll adapter is a fallback.

OneDrive

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
onedrive.file.createdFile Createdgraph.driveItemCreatedbothyes
onedrive.file.updatedFile Updatedgraph.driveItemUpdatedbothyes
onedrive.file.deletedFile Deletedgraph.driveItemDeletedbothyes
onedrive.folder.createdFolder Createdgraph.folderCreatedactivepiecesyes
onedrive.file.sharedFile Sharedgraph.driveItemSharedn8nno

Sample payload (onedrive.file.created):

{
"event_type": "external.onedrive.onedrive.file.created",
"event_category": null,
"source": "poller",
"nativeEventId": "graph.driveItemCreated",
"event_id": "evt_onedrive_onedrive.file.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "01ABCDEF",
"name": "slides.pptx",
"lastModifiedDateTime": "2026-07-19T03:00:00Z",
"eventType": "graph.driveItemCreated"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringOneDrive/Graph item id.
namestringItem name.
lastModifiedDateTimestring (ISO-8601)Last modification time.

Salesforce

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
salesforce.lead.createdLead CreatedLead:createbothyes
salesforce.lead.updatedLead UpdatedLead:updatebothyes
salesforce.lead.convertedLead ConvertedLead:convertbothyes
salesforce.contact.createdContact CreatedContact:createbothyes
salesforce.contact.updatedContact UpdatedContact:updateactivepiecesyes
salesforce.opportunity.createdOpportunity CreatedOpportunity:createbothyes
salesforce.opportunity.updatedOpportunity UpdatedOpportunity:updatebothyes
salesforce.account.createdAccount CreatedAccount:createbothyes
salesforce.account.updatedAccount UpdatedAccount:updateactivepiecesyes
salesforce.case.createdCase CreatedCase:createn8nyes
salesforce.case.updatedCase UpdatedCase:updaten8nyes
salesforce.custom.object.createdCustom Object CreatedCustomObject:createactivepiecesyes
salesforce.custom.object.updatedCustom Object UpdatedCustomObject:updateactivepiecesyes

Sample payload (salesforce.lead.created):

{
"event_type": "external.salesforce.salesforce.lead.created",
"event_category": null,
"source": "poller",
"nativeEventId": "Lead:create",
"event_id": "evt_salesforce_salesforce.lead.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "003...",
"name": "Jane Doe",
"systemModstamp": "2026-07-19T03:00:00Z",
"createdDate": "2026-07-19T03:00:00Z",
"eventType": "Lead:create"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringRecord id (with prefix).
namestringRecord display name.
systemModstampstring (ISO-8601)System modification time — the poll watermark.
createdDatestring (ISO-8601)Creation time.

HubSpot

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
hubspot.contact.createdContact Createdcontact.creationbothyes
hubspot.contact.updatedContact Updatedcontact.propertyChangebothyes
hubspot.contact.deletedContact Deletedcontact.deletionbothyes
hubspot.company.createdCompany Createdcompany.creationbothyes
hubspot.company.updatedCompany Updatedcompany.propertyChangebothyes
hubspot.deal.createdDeal Createddeal.creationbothyes
hubspot.deal.updatedDeal Updateddeal.propertyChangebothyes
hubspot.deal.deletedDeal Deleteddeal.deletionactivepiecesyes
hubspot.ticket.createdTicket Createdticket.creationbothyes
hubspot.ticket.updatedTicket Updatedticket.propertyChangebothyes
hubspot.form.submittedForm Submittedform_submissionbothyes
hubspot.lead.createdLead Createdlead.creationactivepiecesyes
hubspot.list.addedContact Added to Listcontact_added_to_listn8nyes
hubspot.email.openedEmail Openedemail_openedn8nno

Sample payload (hubspot.contact.created):

{
"event_type": "external.hubspot.hubspot.contact.created",
"event_category": null,
"source": "poller",
"nativeEventId": "contact.creation",
"event_id": "evt_hubspot_hubspot.contact.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "101",
"properties": {
"firstname": "Jane",
"lastname": "Doe",
"email": "jane@example.com"
},
"createdAt": "2026-07-19T03:00:00Z",
"eventType": "contact.creation"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringObject id.
properties.firstnamestringFirst name (when present).
properties.lastnamestringLast name (when present).
properties.emailstringEmail (when present).
createdAtstring (ISO-8601)Object creation time.

Linear

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
linear.issue.createdIssue CreatedIssue.createbothyes
linear.issue.updatedIssue UpdatedIssue.updatebothyes
linear.issue.deletedIssue DeletedIssue.removeactivepiecesyes
linear.issue.comment.createdIssue Comment CreatedComment.createbothyes
linear.issue.status.changedIssue Status ChangedIssue.updateactivepiecesyes
linear.project.createdProject CreatedProject.createbothyes
linear.project.updatedProject UpdatedProject.updatebothyes
linear.cycle.createdCycle CreatedCycle.createactivepiecesyes
linear.label.createdLabel CreatedIssueLabel.createn8nyes

Sample payload (linear.issue.created):

{
"event_type": "external.linear.linear.issue.created",
"event_category": null,
"source": "poller",
"nativeEventId": "Issue.create",
"event_id": "evt_linear_linear.issue.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "ISSUE-001",
"identifier": "ENG-42",
"title": "Add feature flag",
"state": "In Progress",
"eventType": "Issue.create"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringIssue/project id.
identifierstringHuman identifier (e.g. ENG-42).
titlestringTitle.
statestringCurrent workflow state.
Polling fallback

Partner-native acquisition is webhook. n8n + Activepieces both use webhooks; this poll adapter is a fallback.

Jira

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
jira.issue.createdIssue Createdjira:issue_createdbothyes
jira.issue.updatedIssue Updatedjira:issue_updatedbothyes
jira.issue.deletedIssue Deletedjira:issue_deletedbothyes
jira.issue.assignedIssue Assignedjira:issue_assignedbothyes
jira.issue.commentedIssue Commentedcomment_createdbothyes
jira.issue.transitionedIssue Transitionedjira:issue_transitionedactivepiecesyes
jira.issue.linkedIssue Linkedissue_linkn8nyes
jira.project.createdProject Createdproject_createdbothyes
jira.project.updatedProject Updatedproject_updatedactivepiecesyes
jira.sprint.startedSprint Startedsprint_startedn8nyes
jira.sprint.closedSprint Closedsprint_closedn8nyes
jira.version.releasedVersion Releasedjira:version_releasedn8nyes
jira.worklog.createdWorklog Createdworklog_createdactivepiecesyes

Sample payload (jira.issue.created):

{
"event_type": "external.jira.jira.issue.created",
"event_category": null,
"source": "poller",
"nativeEventId": "jira:issue_created",
"event_id": "evt_jira_jira.issue.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"key": "PROJ-123",
"id": "10001",
"summary": "Investigate bug",
"status": "In Progress",
"assignee": "5f...",
"eventType": "jira:issue_created"
}
}

data fields your filter rows can target:

FieldTypeDescription
keystringIssue key (e.g. PROJ-123).
idstringNumeric issue id.
summarystringIssue summary.
statusstringCurrent status.
assigneestringAssignee user key.

Asana

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
asana.task.createdTask Createdtask_addedbothyes
asana.task.updatedTask Updatedtask_changedbothyes
asana.task.deletedTask Deletedtask_deletedbothyes
asana.task.completedTask Completedtask_completedbothyes
asana.task.assignedTask Assignedtask_assignedactivepiecesyes
asana.task.commentedTask Commentedstory_addedbothyes
asana.project.createdProject Createdproject_addedbothyes
asana.project.updatedProject Updatedproject_changedactivepiecesyes
asana.section.createdSection Createdsection_addedn8nyes
asana.tag.addedTag Addedtag_addedn8nyes

Sample payload (asana.task.created):

{
"event_type": "external.asana.asana.task.created",
"event_category": null,
"source": "poller",
"nativeEventId": "task_added",
"event_id": "evt_asana_asana.task.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "1201",
"gid": "1201",
"name": "Design review",
"completed": false,
"assignee": "12345",
"eventType": "task_added"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringTask/project gid.
gidstringAlias for the global id.
namestringTask/project name.
completedbooleanWhether the task is completed.
assigneestringAssignee user id.

Trello

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
trello.card.createdCard CreatedcreateCardbothyes
trello.card.updatedCard UpdatedupdateCardbothyes
trello.card.movedCard MovedupdateCard:idListbothyes
trello.card.archivedCard ArchivedupdateCard:closedbothyes
trello.card.deletedCard DeleteddeleteCardactivepiecesyes
trello.card.commentedCard CommentedcommentCardbothyes
trello.card.assignedCard Member AddedaddMemberToCardbothyes
trello.checklist.completedChecklist Item CompletedupdateCheckItemStateactivepiecesyes
trello.list.createdList CreatedcreateListbothyes
trello.board.createdBoard CreatedcreateBoardn8nyes
trello.attachment.addedAttachment AddedaddAttachmentToCardn8nyes

Sample payload (trello.card.created):

{
"event_type": "external.trello.trello.card.created",
"event_category": null,
"source": "poller",
"nativeEventId": "createCard",
"event_id": "evt_trello_trello.card.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "5f...",
"name": "Write spec",
"listId": "list-1",
"closed": false,
"dateLastActivity": "2026-07-19T03:00:00Z",
"eventType": "createCard"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringCard/list/board id.
namestringEntity name.
listIdstringId of the parent list (cards).
closedbooleanArchived flag.
dateLastActivitystring (ISO-8601)Last activity time.

Zendesk

Auth type: basic · Status: implemented

Event IDLabelPartner eventSourcesPollable
zendesk.ticket.createdTicket CreatedTicket Createdbothyes
zendesk.ticket.updatedTicket UpdatedTicket Updatedbothyes
zendesk.ticket.assignedTicket AssignedTicket Assignedbothyes
zendesk.ticket.commentedTicket CommentedComment Createdbothyes
zendesk.ticket.status.changedTicket Status ChangedTicket Status Changedactivepiecesyes
zendesk.ticket.escalatedTicket EscalatedTicket Escalatedn8nyes
zendesk.user.createdUser CreatedUser Createdbothyes
zendesk.organization.createdOrganization CreatedOrganization Createdbothyes
zendesk.article.createdHelp Center Article CreatedArticle Createdactivepiecesyes
zendesk.satisfaction.createdSatisfaction Rating CreatedSatisfaction Rating Createdn8nyes

Sample payload (zendesk.ticket.created):

{
"event_type": "external.zendesk.zendesk.ticket.created",
"event_category": null,
"source": "poller",
"nativeEventId": "Ticket Created",
"event_id": "evt_zendesk_zendesk.ticket.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": 35436,
"subject": "Login issue",
"status": "open",
"assigneeId": 123,
"updatedAt": "2026-07-19T03:00:00Z",
"eventType": "Ticket Created"
}
}

data fields your filter rows can target:

FieldTypeDescription
idnumberTicket id.
subjectstringTicket subject.
statusstringTicket status (open/pending/...).
assigneeIdnumberAssignee user id.
updatedAtstring (ISO-8601)Last update time.
Polling fallback

Partner-native acquisition is webhook (Zendesk notifications). n8n + Activepieces both use webhooks; this poll adapter is a fallback.

ServiceNow

Auth type: basic · Status: implemented

Event IDLabelPartner eventSourcesPollable
servicenow.incident.createdIncident Createdsys_created_on:incidentbothyes
servicenow.incident.updatedIncident Updatedsys_updated_on:incidentbothyes
servicenow.incident.assignedIncident Assignedassigned_to:incidentbothyes
servicenow.incident.resolvedIncident Resolvedstate:7:incidentactivepiecesyes
servicenow.incident.closedIncident Closedstate:8:incidentactivepiecesyes
servicenow.change.request.createdChange Request Createdchange_request:createbothyes
servicenow.change.request.updatedChange Request Updatedchange_request:updatebothyes
servicenow.change.request.approvedChange Request Approvedchange_request:approvedactivepiecesyes
servicenow.problem.createdProblem Createdproblem:createn8nyes
servicenow.problem.updatedProblem Updatedproblem:updaten8nyes
servicenow.request.createdService Request Createdsc_request:createactivepiecesyes
servicenow.catalog.task.createdCatalog Task Createdsc_task:createn8nyes

Sample payload (servicenow.incident.created):

{
"event_type": "external.servicenow.servicenow.incident.created",
"event_category": null,
"source": "poller",
"nativeEventId": "sys_created_on:incident",
"event_id": "evt_servicenow_servicenow.incident.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"sysId": "sys-abc",
"number": "INC0010001",
"state": "2",
"assignedTo": "user-1",
"updatedAt": "2026-07-19 03:00:00",
"eventType": "sys_created_on:incident"
}
}

data fields your filter rows can target:

FieldTypeDescription
sysIdstringRecord sys_id.
numberstringRecord number (e.g. INC0010001).
statestringState value as stored by ServiceNow.
assignedTostringAssignee user id.
updatedAtstringLast update time.

YouTube

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
youtube.video.uploadedVideo Uploadedactivities:uploadbothyes
youtube.video.updatedVideo Updatedactivities:channelItembothyes
youtube.video.publishedVideo Publishedvideos:publicactivepiecesyes
youtube.comment.createdComment CreatedcommentThreads:insertbothyes
youtube.comment.repliedComment Reply Createdcomments:insertactivepiecesyes
youtube.subscriber.thresholdSubscriber Threshold Reachedchannels:subscriberCountbothyes
youtube.liked.videoNew Liked Videoactivities:likeItemactivepiecesyes
youtube.playlist.createdPlaylist Createdplaylists:insertn8nyes
youtube.live.broadcast.startedLive Broadcast StartedliveBroadcast:startn8nyes

Sample payload (youtube.video.uploaded):

{
"event_type": "external.youtube.youtube.video.uploaded",
"event_category": null,
"source": "poller",
"nativeEventId": "activities:upload",
"event_id": "evt_youtube_youtube.video.uploaded",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "abc",
"title": "New release",
"channelId": "UC...",
"publishedAt": "2026-07-19T03:00:00Z",
"eventType": "activities:upload"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringVideo/comment/activity id.
titlestringContent title.
channelIdstringOwning channel id.
publishedAtstring (ISO-8601)Publish time.

Gmail

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
gmail.message.receivedMessage Receivedhistory:messageAddedbothyes
gmail.message.received.labelMessage Received (Label)history:messageAdded:labelbothyes
gmail.message.sentMessage Senthistory:messageAdded:sentbothyes
gmail.thread.repliedThread Repliedhistory:messageAdded:replyactivepiecesyes
gmail.attachment.receivedAttachment Receivedhistory:messageAdded:attachmentactivepiecesyes
gmail.label.addedLabel Addedhistory:addLabeln8nyes
gmail.starredMessage Starredhistory:starn8nyes
gmail.draft.createdDraft Createdhistory:draftCreatedn8nyes

Sample payload (gmail.message.received):

{
"event_type": "external.gmail.gmail.message.received",
"event_category": null,
"source": "poller",
"nativeEventId": "history:messageAdded",
"event_id": "evt_gmail_gmail.message.received",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "18c...",
"threadId": "18c...",
"labelIds": [
"INBOX"
],
"eventType": "history:messageAdded"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringMessage id.
threadIdstringThread id.
labelIdsstring[]Labels applied to the message.

Google Calendar

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
calendar.event.startedEvent Startedcalendar.events:startbothyes
calendar.event.endsEvent Ends Sooncalendar.events:endbothyes
calendar.event.createdEvent Createdcalendar.events:createdbothyes
calendar.event.updatedEvent Updatedcalendar.events:updatedbothyes
calendar.event.deletedEvent Deletedcalendar.events:deletedbothyes
calendar.event.cancelledEvent Cancelledcalendar.events:cancelledactivepiecesyes
calendar.event.attendee.responseAttendee Responsecalendar.events:attendeeResponsebothyes
calendar.reminderEvent Remindercalendar.events:reminderactivepiecesyes

Sample payload (calendar.event.started):

{
"event_type": "external.calendar.calendar.event.started",
"event_category": null,
"source": "poller",
"nativeEventId": "calendar.events:start",
"event_id": "evt_calendar_calendar.event.started",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "evt-1",
"summary": "Standup",
"status": "confirmed",
"start": {
"dateTime": "2026-07-19T09:00:00Z"
},
"eventType": "calendar.events:start"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringCalendar event id.
summarystringEvent title.
statusstringEvent status (confirmed/tentative/cancelled).
start.dateTimestring (ISO-8601)Start time in the event's timezone.

Microsoft Forms

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
forms.response.createdResponse Createdforms:responseCreatedbothyes
forms.response.updatedResponse Updatedforms:responseUpdatedbothyes
forms.form.createdForm Createdforms:formCreatedbothyes
forms.form.updatedForm Updatedforms:formUpdatedactivepiecesyes
forms.response.submittedResponse Submittedforms:responseSubmittedn8nyes

Sample payload (forms.response.created):

{
"event_type": "external.forms.forms.response.created",
"event_category": null,
"source": "poller",
"nativeEventId": "forms:responseCreated",
"event_id": "evt_forms_forms.response.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "resp-1",
"responder": {
"id": "user-1"
},
"submittedDateTime": "2026-07-19T03:00:00Z",
"eventType": "forms:responseCreated"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringResponse id.
responder.idstringUser id of the respondent.
submittedDateTimestring (ISO-8601)Submission time.

Microsoft Teams

Auth type: oauth · Status: implemented

Event IDLabelPartner eventSourcesPollable
teams.message.createdChannel Message Createdmessage:channelMessagebothno
teams.message.repliedChannel Message Replymessage:replybothno
teams.message.mentionedApp Mentionedmessage:mentionbothno
teams.chat.message.createdChat Message Createdmessage:chatactivepiecesno
teams.member.joinedMember Joined Teamteams:memberJoinedactivepiecesyes
teams.member.addedMember Added to Channelteams:memberAddedbothyes
teams.channel.createdChannel Createdteams:channelCreatedbothyes
teams.team.createdTeam Createdteams:teamCreatedn8nyes
teams.card.actionCard Action Submittedteams:cardActionactivepiecesno

Sample payload (teams.message.created):

{
"event_type": "external.teams.teams.message.created",
"event_category": null,
"source": "poller",
"nativeEventId": "message:channelMessage",
"event_id": "evt_teams_teams.message.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "1690000000000",
"from": "user-1",
"lastModifiedDateTime": "2026-07-19T03:00:00Z",
"eventType": "message:channelMessage"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringActivity/message activity id.
fromstringSending user id.
lastModifiedDateTimestring (ISO-8601)Activity time.

Stripe

Auth type: apikey · Status: implemented

Event IDLabelPartner eventSourcesPollable
stripe.payment.intent.createdPayment Intent Createdpayment_intent.createdbothyes
stripe.payment.intent.succeededPayment Succeededpayment_intent.succeededbothyes
stripe.payment.intent.failedPayment Failedpayment_intent.payment_failedbothyes
stripe.charge.createdCharge Createdcharge.createdbothyes
stripe.charge.refundedCharge Refundedcharge.refundedbothyes
stripe.charge.dispute.createdDispute Createdcharge.dispute.createdbothyes
stripe.customer.createdCustomer Createdcustomer.createdbothyes
stripe.customer.updatedCustomer Updatedcustomer.updatedbothyes
stripe.customer.deletedCustomer Deletedcustomer.deletedbothyes
stripe.subscription.createdSubscription Createdcustomer.subscription.createdbothyes
stripe.subscription.updatedSubscription Updatedcustomer.subscription.updatedbothyes
stripe.subscription.deletedSubscription Canceledcustomer.subscription.deletedbothyes
stripe.invoice.createdInvoice Createdinvoice.createdbothyes
stripe.invoice.paidInvoice Paidinvoice.paidbothyes
stripe.invoice.payment_failedInvoice Payment Failedinvoice.payment_failedactivepiecesyes
stripe.refund.createdRefund Createdrefund.createdactivepiecesyes
stripe.checkout.session.completedCheckout Session Completedcheckout.session.completedn8nyes
stripe.payout.paidPayout Paidpayout.paidn8nyes

Sample payload (stripe.payment.intent.created):

{
"event_type": "external.stripe.stripe.payment.intent.created",
"event_category": null,
"source": "poller",
"nativeEventId": "payment_intent.created",
"event_id": "evt_stripe_stripe.payment.intent.created",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"id": "evt_1",
"type": "event",
"created": 1690000000,
"livemode": false,
"dataObjectId": "pi_3...",
"eventType": "payment_intent.created"
}
}

data fields your filter rows can target:

FieldTypeDescription
idstringStripe event id (evt_...).
typestringStripe event type (e.g. payment_intent.succeeded).
creatednumberUnix timestamp of the event.
livemodebooleanWhether the event is from a live account.
dataObjectIdstringId of the affected object.
Polling fallback

Partner-native acquisition is webhook (Stripe strongly discourages /v1/events polling). n8n + Activepieces both use webhooks; this poll adapter is a fallback.

Generic REST (API Key / OAuth)

Auth type: apikey · Status: implemented

Event IDLabelPartner eventSourcesPollable
generic.pollCustom Polling Endpointgeneric.pollbothyes

Sample payload (generic.poll):

{
"event_type": "external.generic.generic.poll",
"event_category": null,
"source": "poller",
"nativeEventId": "generic.poll",
"event_id": "evt_generic_generic.poll",
"timestamp": "2026-07-19T03:00:00.000Z",
"data": {
"value": "custom-item",
"eventType": "generic.poll"
}
}

data fields your filter rows can target:

FieldTypeDescription
valueanyArbitrary item returned by the custom endpoint (or the JSONPath-selected object).

Managing triggers

Once created, triggers appear in the triggers list with their name, bound agent, event source, and status.

StatusMeaning
ARMEDTrigger is active and will fire on matching events
PAUSEDTrigger is inactive and will not fire
PENDINGTrigger creation is in progress (transient)
RUNNINGA fire is currently executing
FIRINGA matching event was accepted and the agent run has been submitted
COMPLETEDThe last fire finished successfully
FAILEDThe last fire failed (agent error, validation error, or all retries exhausted)
DISABLEDThe trigger was permanently disabled

A trigger briefly shows FIRING while its bound agent runs, then settles on COMPLETED or FAILED.

Edit a trigger

  1. Click on an existing trigger from the list.
  2. The edit modal displays the trigger ID and all configuration options.
  3. Modify any settings as needed.
  4. Click Save to update the trigger.

Delete a trigger

  1. Open the trigger you want to delete.
  2. Click the Delete button at the bottom of the edit modal.
  3. Confirm the deletion when prompted.

Triggers vs Jobs

TriggersJobs
Runs onAn event occurringA fixed schedule
Best forReal-time reaction to changesRepetitive, clock-driven tasks
Event scopeNative platform events or 30+ external providersYour workspace only
AcquisitionPolling (webhook soon)Internal scheduler

For proactive, time-boxed automation use a Job; for reactive, event-driven automation use a Trigger. Combine both — e.g. a Slack-triggered agent that runs on every new mention, plus a daily routine job that summarizes the day's activity.

Use cases

Native

  • Document lifecycle — Re-index or summarize a document the moment it's created or updated.
  • Agent completion — Trigger a downstream agent (notification, logging) whenever another agent finishes.
  • Planner approval — Send a Slack or email alert when a generated plan is awaiting approval.

External

  • Support triagezendesk.ticket.created → an agent drafts a first-pass response and suggests a category.
  • Sales follow-uphubspot.deal.created / salesforce.opportunity.updated → an agent drafts a tailored follow-up email.
  • Code review assistgithub.pr.opened → an agent reads the diff and posts a review checklist.
  • Inbound email triagegmail.message.received (label) → an agent categorizes and routes the email.
  • Payment alertsstripe.charge.dispute.created → an agent summarizes the dispute and drafts a customer response.
  • Calendar reminderscalendar.event.starts → an agent prepares an agenda from related materials.
  • Custom APIgeneric.poll against your own REST endpoint → an agent acts on every new item.

Best practices

  1. Pick the lightest source — Prefer a Native event over an external poll when the workflow only needs to react to something inside ToothFairyAI.
  2. Use data filters — Narrow Native triggers with data-filter rows so the agent only fires on events it actually needs to act on.
  3. Right-size the poll interval — Use the smallest interval that still avoids hitting a provider's rate limits. 30 minutes is plenty for slow-moving data; 1–2 minutes only when latency matters.
  4. Scope prompts to the agent — Assign the bound prompt to the trigger's agent (via availableToAgents) so the dropdown shows only relevant prompts.
  5. Reuse Authorisations — One provider Authorisation can back several triggers; configure it once in Authorisations and reuse it.
  6. Naming — Use descriptive names that state provider + event + intent, e.g. "Slack mention → triage agent".
  7. Start armed, observe first — Arm the trigger and watch a few fires' outputs in External chats before relying on it in production.
  8. Pause, don't delete — Temporarily pausing a trigger keeps its configuration intact while you investigate or re-tune.
Execution limits

Triggers are subject to the same execution limits as manual agent runs — token limits, execution timeouts, and rate limits based on your subscription tier. Averted triggers still consume a poll against the provider's API on each interval.

Agent availability

Only agents that have been previously created and saved in your workspace appear in the agent dropdown. Voice-mode agents are excluded. Ensure the necessary agent is configured before creating a trigger.

What happens when a trigger fires

Triggers are processed asynchronously by ToothFairyAI's infrastructure and never block the operation that produced the event. The flow is:

  1. Event — A native platform event (document.created, agent_completed, planner_pending_approval, ...) or an external provider event acquired by polling is normalized into a single flat envelope.
  2. Match — For the event's workspace, every active trigger is evaluated. A native trigger fires only when its event type, event category, and all data-filter rows match the event payload; an external trigger fires only when the received external.<provider>.<event> matches its configured provider event.
  3. Fire — The matching trigger's agent is submitted as an execution job with the triggering event (and the forced prompt or saved prompt) attached. The trigger flips to FIRING.
  4. Run & settle — The agent executes exactly as a manual run would. The trigger settles to COMPLETED on a successful agent completion or FAILED if the run errors or exhausts its retries. The trigger's triggerCount and lastEventID are updated for traceability, and each event is processed at most once per trigger.

Each trigger fire is deduplicated per event (lastEventID), so redeliveries never double-fire an agent.

Troubleshooting

SymptomCause & fix
Trigger stays ARMED, never moves to FIRING/COMPLETED/FAILEDThe event never reached the match step or didn't match. Verify the event actually fires (e.g. the document lifecycle events fire on /doc/create, uploads and deletes), and check the payload — data.topics is an array of topic IDs, and every data-filter row must match.
Trigger fires but settles FAILED with Invalid agent id for this workspaceThe trigger's agent is global (not owned by the workspace). Re-select an agent from your workspace's agent list and save.
Keyword equals / not equals / greater than / less than don't match in an integrationFilter operators accept both the friendly spellings shown in the form (equals, not equals, greater than, less than) and short forms (eq, neq, gt, lt); includes / exists are identical in both vocabularies.
External trigger "fires" but no agent run appearsExternal triggers need a workspace Authorisation with valid credentials — check the authorisation's token hasn't expired or been revoked.
Trigger stuck in FIRING for a long timeAgent runs with retrieval + LLM generation can take several minutes; if it remains in FIRING past the execution timeout, the run failed to settle — re-check the agent's health and the trigger's execution limits.