It’s always bugged me that Notion’s API (and, by extension, its Zapier integration) didn’t support applying a template to a page in a database. You go to all the work of creating detailed templates for your databases, but then can’t use them in automations.
It’s still not supported yet in the Zapier integration, but templates are now exposed in Notion’s API. I learned about it here.
In the meantime, I’ve created a simple Custom Action to apply a template to an existing page - the code is below if you want to copy. It just takes two inputs - the page_id
of the page you want to apply the template to, and the template_id
that you want to apply.
You can find all the template_ids
for a given data source using the GET https://api.notion.com/data_sources/{data_source_id}/templates
endpoint. See documentation here. I ran this once and then saved the template_ids
I wanted to use as global variables so I could reuse them across different Zaps.

export async function applyTemplateToPage(params: { pageId: string, templateId: string }): Promise<{ result: string, url: string }> {
// Destructure the input parameters
const { pageId, templateId } = params;
// Construct the URL for the Notion API endpoint
const url = `https://api.notion.com/v1/pages/${pageId}`;
// Define the request body to apply the template
const requestBody = {
template: {
type: 'template_id',
template_id: templateId,
}
};
// Make the API request using fetchWithZapier
const response = await fetchWithZapier(url, {
method: 'PATCH', // Assuming PATCH is used to update the page with a template
headers: {
'Content-Type': 'application/json',
'Notion-Version': '2025-09-03' // Use the updated Notion-Version
},
body: JSON.stringify(requestBody)
});
// Throw an error if the response is not ok
await response.throwErrorIfNotOk();
// Parse the response JSON
const responseData = await response.json();
// Return a confirmation message and the URL of the updated page
return {
result: "Template applied successfully",
url: responseData.url
};
}