Skip to main content
Kit’s automation node plugins let you extend Kit’s visual automation tools with custom nodes that enhance workflow capabilities. This guide walks you through configuring your plugin’s appearance, behavior, and settings—from naming and visual presentation to backend functionality and user controls.
This product purchased example shows an event node that is configured with a select input, followed by a dependent search input, allowing a creator to filter which products the event node fires for:example for adding an event node
This bare bones example shows how a creator selects an action node plugin.example for adding an event node

Name

The plugin name is the user-facing name for your node. In the automation node insertion menu example above, “Product purchased” is a name. It will appear in the editor’s node menu, and also in the breadcrumbs at the top of the configuration form when your node is selected. Your name should be short, ideally one or two words.

Description

The description is a short phrase describing your node.

Sort order

If you offer multiple nodes, the sort order determines their placement.

Icon

The icon is an image for the node, displayed in a box above the plugin’s name. As the box is color-coded automatically, based on the node type, a monochrome SVG is highly recommended. PNG, GIF, JPEG extensions are also supported. The aspect ratio should be 1:1. event node

Request URL

The Request URL is the URL of an endpoint on your server that we will poll to trigger the automation node effects. The returned data will be unique based on the type of automation node created.
For events, the request url returns a paginated array of events containing subscriber information. This endpoint’s job is to return subscribers who have experienced the configured event since the provided timestamp so Kit can progress them through the automation.You’ll return these events based on the settings you’ve defined for your node (outlined in the plugin settings page). We’ll make a POST request to your Request URL approximately every 5 minutes. The request will contain a settings object with the user’s selected values for each of your settings and a timestamp to return events that occurred after.We also include some pagination params—before and after cursors as well as per_page to control the page size and how many events can be returned. We will reject responses larger than our requested page size.
{
  "settings": {
    // The exact data in this section depends on how you've configured your
    // plugin's JSON settings (see next section).
    "title": "My title",
    "description": "My description",
    // The `since` timestamp will always be in ISO8601 format
    "since": "2025-05-16T15:26:41Z"
  },
  "after": null,
  "before": null,
  "per_page": 100
}
Your endpoint should return a cursor-paginated array of events containing subscriber information:
{
  "data": [
    {
      "subscriber_id": 3313198664
    },
    {
      "subscriber_id": 3236514736
    }
  ]
  "pagination": {
    "has_previous_page": false,
    "has_next_page": false, // required
    "start_cursor": "WzE0NV0=",
    "end_cursor": "WzE0NF0=",
    "per_page": 100 // required
  }
}
If you’ve encountered an error, return an object containing an errors array of strings. You may add as many errors to this array as you’d like:
{
  "code": 404,
  "errors": ["Plan not found"]
}
For actions, the request url returns an object with successes and failures that are each an array of actions containing subscriber information. This endpoint’s job is to return subscribers that the app has acted upon so Kit can progress them through the automation.You’ll return these actions based on the settings you’ve defined for your node (outlined in the plugin settings page). We’ll make a POST request to your Request URL when subscribers move through a creator’s automation (at most every 5 minutes). The request will contain a settings object with the user’s selected values for each of your settings and an array of subscribers for the app to act on.We do not include pagination params since we are providing the app server with subscribers. The response should never contain more subscribers than what was provided in the request.
{
  "settings": {
    // The exact data in this section depends on how you've configured your
    // plugin's JSON settings (see next section).
    "title": "My title",
    "description": "My description",
    // The `since` timestamp will always be in ISO8601 format
    "since": "2025-05-16T15:26:41Z"
  },
  "subscribers": [
    { "id": 11 },
    { "id": 22 }
  ]
}
Your endpoint should return an object with 2 arrays of actions containing subscriber information. One for successes and one for failures:
{
  "data": {
    "successes": [
      {
        "subscriber_id": 3313198664
      },
      {
        "subscriber_id": 3236514736
      }
    ],
    "failures": [
      {
        "subscriber_id": 3203473421
      }
    ]
  }
}
If you’ve encountered an error, return an object containing an errors array of strings. You may add as many errors to this array as you’d like:
{
  "code": 404,
  "errors": ["Plan not found"]
}

Settings JSON

This field allows you to configure the creator-facing settings for your node. It should be an array of objects; one object for each setting. For example, this would be the JSON configuration for a plugin with two settings: “Type” and a dynamic “Selection” field, dependent on “Type”.
[
  {
    "name": "type",
    "label": "Type",
    "required": true,
    "help": "",
    "type": "select",
    "options": [
      {
        "label": "A product",
        "value": "product"
      },
      {
        "label": "A product from a collection",
        "value": "collection"
      }
    ],
    "placeholder": ""
  },
  {
    "name": "resources",
    "label": "Selection",
    "required": true,
    "help": "Select your product(s) or collection(s)",
    "type": "search",
    "multiselect": true,
    "placeholder": "",
    "request_url": "https://app.example.com/resources/search",
    "dependencies": ["type"]
  }
]
Each setting’s type determines the UI rendered (such as a text input or a select dropdown); all available options are listed under the plugin settings page. The name for each setting is used as the key in your events request: settings example mapping When you save your plugin, we’ll validate your JSON settings - which can be pre-emptively validated using the JSON schema validator linked here.
I