NOTION - Gerenciamento de Conhecimento
O que é este Node?
O NOTION é o node responsável por integrar com o Notion permitindo criar páginas, consultar databases, atualizar propriedades e adicionar blocos de conteúdo diretamente dos seus flows.
Por que este Node existe?
Centralizar conhecimento é fundamental. O NOTION existe para:
- Documentação automática: Criar documentos a partir de conversas
- Base de conhecimento: Consultar e atualizar informações estruturadas
- CRM simples: Gerenciar clientes e contatos no Notion
- Registro de interações: Documentar atendimentos automaticamente
- Wiki colaborativo: Criar e atualizar conteúdo de forma programática
Como funciona internamente?
Quando o NOTION é executado, o sistema:
- Autentica usando API Key do Notion
- Identifica operação (createPage, queryDatabase, updatePage, appendBlock)
- Conecta à API do Notion v1 (versão 2022-06-28)
- Executa operação com propriedades e conteúdo
- Retorna resultado com IDs e URLs
- Se erro: Loga e lança exceção
Código interno (productivity-executors.service.ts:361-442):
async executeNotion(data: any, variables: Record<string, any>): Promise<any> {
try {
this.logger.log('📝 [NOTION] Executing operation');
const notionApiUrl = 'https://api.notion.com/v1';
const headers = {
Authorization: `Bearer ${data.apiKey}`,
'Content-Type': 'application/json',
'Notion-Version': '2022-06-28',
};
switch (data.operation) {
case 'createPage':
const createPageResponse = await firstValueFrom(
this.httpService.post(`${notionApiUrl}/pages`,
{
parent: { database_id: data.databaseId },
properties: data.properties,
children: data.content || [],
},
{ headers }
)
);
return {
success: true,
pageId: createPageResponse.data.id,
url: createPageResponse.data.url,
};
case 'queryDatabase':
const queryResponse = await firstValueFrom(
this.httpService.post(`${notionApiUrl}/databases/${data.databaseId}/query`,
{
filter: data.filter || undefined,
sorts: data.sorts || undefined,
page_size: data.pageSize || 100,
},
{ headers }
)
);
return {
success: true,
results: queryResponse.data.results,
hasMore: queryResponse.data.has_more,
};
case 'updatePage':
const updatePageResponse = await firstValueFrom(
this.httpService.patch(`${notionApiUrl}/pages/${data.pageId}`,
{
properties: data.properties,
},
{ headers }
)
);
return {
success: true,
pageId: updatePageResponse.data.id,
};
case 'appendBlock':
const appendBlockResponse = await firstValueFrom(
this.httpService.patch(`${notionApiUrl}/blocks/${data.blockId}/children`,
{
children: data.blocks,
},
{ headers }
)
);
return {
success: true,
results: appendBlockResponse.data.results,
};
default:
throw new Error(`Unknown Notion operation: ${data.operation}`);
}
} catch (error) {
this.logger.error('Notion execution error:', error);
throw error;
}
}
Quando você DEVE usar este Node?
Use NOTION quando precisar gerenciar conhecimento estruturado:
Casos de uso:
- CRM de clientes: Criar página para cada novo lead
- Base de conhecimento: Consultar FAQs e documentação
- Registro de atendimentos: Documentar cada conversa
- Wiki interna: Criar e atualizar documentação de processos
- Gestão de projetos: Manter database de projetos atualizada
- Biblioteca de recursos: Catalogar materiais e arquivos
Quando NÃO usar NOTION:
- Planilhas simples: Use GOOGLE SHEETS para tabelas
- Kanban/Tarefas: Use TRELLO para gestão ágil
- Arquivos grandes: Use GOOGLE DRIVE para storage
Parâmetros Detalhados
operation (string, obrigatório)
O que é: Define qual operação será executada no Notion.
Valores possíveis:
- createPage: Criar nova página em database
- queryDatabase: Buscar páginas em database
- updatePage: Atualizar propriedades de página
- appendBlock: Adicionar blocos de conteúdo
apiKey (string, obrigatório)
O que é: Integration Token do Notion.
Como obter: 1. Acesse https://www.notion.so/my-integrations 2. Crie nova integração 3. Copie o Internal Integration Token 4. Compartilhe a database/página com a integração
databaseId (string, obrigatório para createPage/queryDatabase)
O que é: ID do database do Notion.
Como obter: Na URL do database: https://notion.so/[DATABASE_ID]?v=...
Flow completo para testar:
{
"name": "Teste NOTION - Criar Página",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Nome do Cliente",
"parameters": {
"message": "Nome do cliente:",
"variable": "cliente_nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Email",
"parameters": {
"message": "Email do cliente:",
"variable": "cliente_email"
}
}
},
{
"id": "notion_1",
"type": "notion",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Criar Página Cliente",
"parameters": {
"operation": "createPage",
"databaseId": "a1b2c3d4e5f6",
"properties": {
"Name": {
"title": [
{
"text": {
"content": "{{cliente_nome}}"
}
}
]
},
"Email": {
"email": "{{cliente_email}}"
},
"Status": {
"select": {
"name": "Novo Lead"
}
}
},
"apiKey": "{{notion_api_key}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Cliente cadastrado!\n\n📄 {{notion_1.url}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "notion_1" },
{ "source": "notion_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
properties (object, obrigatório para createPage/updatePage)
O que é: Objeto com as propriedades da página conforme schema do database.
Formato: Varia conforme tipo de propriedade (title, rich_text, number, select, multi_select, date, email, etc.)
Exemplos:
{
"Name": {
"title": [{"text": {"content": "Título da Página"}}]
},
"Email": {
"email": "exemplo@email.com"
},
"Status": {
"select": {"name": "Em Progresso"}
},
"Tags": {
"multi_select": [{"name": "Urgente"}, {"name": "Cliente"}]
},
"Data": {
"date": {"start": "2025-01-15"}
}
}
content (array, opcional para createPage)
O que é: Array de blocos de conteúdo para a página.
Formato: Blocos no formato da API do Notion
Exemplo:
[
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{"type": "text", "text": {"content": "Conteúdo do parágrafo"}}]
}
},
{
"object": "block",
"type": "heading_2",
"heading_2": {
"rich_text": [{"type": "text", "text": {"content": "Subtítulo"}}]
}
}
]
filter (object, opcional para queryDatabase)
O que é: Filtro para buscar páginas específicas no database.
Exemplo:
{
"property": "Status",
"select": {
"equals": "Ativo"
}
}
sorts (array, opcional para queryDatabase)
O que é: Ordem de classificação dos resultados.
Exemplo:
[
{
"property": "Data",
"direction": "descending"
}
]
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | createPage, queryDatabase, updatePage, appendBlock |
| apiKey | string | Sim | Integration Token do Notion |
| databaseId | string | Sim* | ID do database (para createPage, queryDatabase) |
| pageId | string | Sim* | ID da página (para updatePage, appendBlock) |
| properties | object | Sim* | Propriedades da página (para createPage, updatePage) |
| content | array | Não | Blocos de conteúdo (para createPage) |
| filter | object | Não | Filtro de busca (para queryDatabase) |
| sorts | array | Não | Ordenação dos resultados (para queryDatabase) |
| pageSize | number | Não | Limite de resultados (padrão: 100) |
| blocks | array | Sim* | Blocos a adicionar (para appendBlock) |
| blockId | string | Sim* | ID do bloco pai (para appendBlock) |
*Obrigatório dependendo da operação
Exemplo 1: CRM de Clientes no Notion
Objetivo: Criar página automática para cada novo cliente que entra em contato.
JSON para Importar
{
"name": "CRM Clientes - Notion",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "👋 Olá! Vamos cadastrar você."
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Nome",
"parameters": {
"message": "Qual seu nome completo?",
"variable": "nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Email",
"parameters": {
"message": "Qual seu email?",
"variable": "email"
}
}
},
{
"id": "input_2",
"type": "input",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Empresa",
"parameters": {
"message": "Qual sua empresa?",
"variable": "empresa"
}
}
},
{
"id": "notion_1",
"type": "notion",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Criar no CRM",
"parameters": {
"operation": "createPage",
"databaseId": "a1b2c3d4e5f6",
"properties": {
"Nome": {
"title": [{"text": {"content": "{{nome}}"}}]
},
"Email": {
"email": "{{email}}"
},
"Empresa": {
"rich_text": [{"text": {"content": "{{empresa}}"}}]
},
"WhatsApp": {
"phone_number": "{{contact_phone}}"
},
"Status": {
"select": {"name": "Novo Lead"}
},
"Origem": {
"select": {"name": "WhatsApp"}
},
"Data Contato": {
"date": {"start": "{{timestamp}}"}
}
},
"content": [
{
"object": "block",
"type": "heading_2",
"heading_2": {
"rich_text": [{"type": "text", "text": {"content": "Primeiro Contato"}}]
}
},
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{"type": "text", "text": {"content": "Cliente entrou em contato via WhatsApp em {{timestamp}}"}}]
}
}
],
"apiKey": "{{notion_api_key}}"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "✅ Cadastro completo!\n\nBem-vindo, {{nome}}! 🎉\n\nEm breve nossa equipe entrará em contato."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "input_2" },
{ "source": "input_2", "target": "notion_1" },
{ "source": "notion_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: 👋 Olá! Vamos cadastrar você.
Sistema: Qual seu nome completo?
Usuário: João Silva
Sistema: Qual seu email?
Usuário: joao@empresa.com
Sistema: Qual sua empresa?
Usuário: Tech Solutions
Sistema: ✅ Cadastro completo!
Bem-vindo, João Silva! 🎉
Em breve nossa equipe entrará em contato.
Exemplo 2: Consultar Base de Conhecimento
Objetivo: Buscar respostas em database do Notion baseado em palavras-chave.
JSON para Importar
{
"name": "FAQ Automático - Notion",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Pergunta",
"parameters": {
"message": "❓ Qual sua dúvida?",
"variable": "pergunta"
}
}
},
{
"id": "notion_1",
"type": "notion",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar FAQ",
"parameters": {
"operation": "queryDatabase",
"databaseId": "faq_database_id",
"filter": {
"property": "Categoria",
"select": {
"equals": "Geral"
}
},
"sorts": [
{
"property": "Prioridade",
"direction": "descending"
}
],
"pageSize": 5,
"apiKey": "{{notion_api_key}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Responder",
"parameters": {
"message": "📚 Encontrei {{notion_1.results.length}} artigos relacionados.\n\nVerifique se algum responde sua dúvida!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "notion_1" },
{ "source": "notion_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: ❓ Qual sua dúvida?
Usuário: Como faço para redefinir minha senha?
Sistema: 📚 Encontrei 5 artigos relacionados.
Verifique se algum responde sua dúvida!
Resposta do Node
Operação CREATE_PAGE:
{
"success": true,
"pageId": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"url": "https://www.notion.so/Page-Title-a1b2c3d4e5f64a5b8c9d0e1f2a3b4c5d"
}
Operação QUERY_DATABASE:
{
"success": true,
"results": [
{
"id": "page-id-1",
"properties": { /* propriedades da página */ }
},
{
"id": "page-id-2",
"properties": { /* propriedades da página */ }
}
],
"hasMore": false
}
Operação UPDATE_PAGE:
{
"success": true,
"pageId": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
}
Boas Práticas
✅ SIM: - Estruture databases com propriedades bem definidas - Use templates de conteúdo para consistência - Adicione tags e categorias para organização - Implemente busca com filtros específicos - Documente o schema das propriedades
❌ NÃO: - Não crie páginas duplicadas (valide antes) - Não exponha API Key em logs - Não abuse de queries sem filtro (performance) - Não esqueça de compartilhar database com a integração
Dicas
💡 Integração completa: Compartilhe o database com a integração antes de usar
💡 Propriedades: Consulte a API do Notion para tipos de propriedades disponíveis
💡 Blocos ricos: Use diferentes tipos de blocos (heading, paragraph, list, code, etc.)
💡 Relations: Conecte páginas usando propriedades de relation
💡 Automação: Combine com TRELLO e GOOGLE SHEETS para workflows completos
Próximo Node
→ GOOGLE SHEETS - Planilhas para dados tabulares → TRELLO - Gestão ágil de projetos → GOOGLE DRIVE - Armazenamento de arquivos