Extending Zapier with Custom Actions

Extending Zapier with Custom Actions

Zapier’s Custom Actions open up powerful new possibilities for automation. They let you go beyond standard integrations by connecting directly to an app’s API, without writing any code. In this post, we explore how Custom Actions can solve real-world problems connecting Slack and Notion.

Nov 6, 2025
 
Video preview

Zapier Custom Actions

Custom Actions are one of Zapier’s most powerful recent additions. They allow you to extend the functionality of apps that already have a Zapier integration, for situations where the exact action you want to build into a Zap isn’t available in that standard integration.
Using Zapier’s built-in AI co-pilot, Custom Actions allow you to describe what you want to do in plain language, and generate an action that calls the right API endpoints — no coding required.
In this walkthrough, we’ll look at how to use Custom Actions to solve a common problem: creating a page in a Notion database from a Slack request and tagging a teammate, even when you only know their email address.
 

Creating IT helpdesk tickets in Notion from Slack

One simple example comes from Notion - there are many situations where you might want an event in another app to trigger the creation of a page in a Notion database, and where you might want to tag one of your teammates in a person property in the Notion page. Think of the use case in the above video, where an IT team receives requests in a Slack channel, and wants to quickly convert those into tickets in their Helpdesk database in Notion.
To tag someone in a Person property, you need to already know their Notion User ID
To tag someone in a Person property, you need to already know their Notion User ID
The problem is that Notion’s Zapier app needs the person’s Notion user ID, but all the Slack trigger knows about the requestor is their email address. And if you scan through the list of available actions, you’ll find that you can retrieve a user’s details if you already have their ID, but there’s no way to retrieve their ID based on their email address.
 

How Custom Actions close the gap

Except now, there is, thanks to Custom Actions. With a natural-language prompt, you can explain what you need to Zapier’s AI co-pilot, and it will build that action for you:
Chatting with Custom Actions’ AI co-pilot to build the action
Chatting with Custom Actions’ AI co-pilot to build the action
On the back end, Custom Actions is using its knowledge of each app’s API to build the step. You don’t have to go digging through the API documentation, because Custom Actions has already been trained on it, and you don’t need to write a single line of code.
Custom Actions can not only make the API calls, but can also add some filtering logic and data manipulation. In this example, Notion’s API doesn’t actually have an endpoint for retrieving a single user based on their email address, but it does allow you to retrieve a list of all users in the workspace. So this action uses that endpoint, and then filters the list to find the ID of the one user you’re interested in:
// This function retrieves a list of all users from the Notion API and filters the list to find a user with the provided email address. // It returns the user ID of the matching email. If no user is found, it throws an error. export async function findUserIdByEmail(params: { email: string }): Promise<{ result: string }> { // Extract the email from the input object const { email } = params; // Define the URL for the Notion API endpoint to list all users const url = 'https://api.notion.com/v1/users'; // Use fetchWithZapier to make the API request const response = await fetchWithZapier(url, { method: 'GET', headers: { 'Notion-Version': '2022-02-22', // Specify the Notion API version }, }); // Throw an error if the response is not OK await response.throwErrorIfNotOk(); // Parse the JSON response const data = await response.json(); // Extract the list of users from the response const users = data.results; // Find the user with the matching email address const user = users.find((user: any) => user.person?.email === email); // If a user is found, return the user ID if (user) { return { result: user.id }; } // If no user is found, throw an error throw new Error(`User with email ${email} not found.`); }
 
Once your Custom Action is built, you can pull it into your Zaps just like any other step, and now you can close the loop to tag the person who submitted the request in Slack to the corresponding helpdesk ticket in Notion:
notion image
notion image
 

Putting Custom Actions to work

Custom Actions extend Zapier beyond its default integrations. They let you automate more complex workflows, handle missing endpoints, and keep your stack connected without touching code. For startup teams, this means fewer manual steps and faster internal processes, whether it’s managing IT tickets, onboarding new hires, or syncing data across tools.
If you’d like help designing or maintaining automations like this, get in touch!