Pular para conteúdo

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:

  1. Documentação automática: Criar documentos a partir de conversas
  2. Base de conhecimento: Consultar e atualizar informações estruturadas
  3. CRM simples: Gerenciar clientes e contatos no Notion
  4. Registro de interações: Documentar atendimentos automaticamente
  5. Wiki colaborativo: Criar e atualizar conteúdo de forma programática

Como funciona internamente?

Quando o NOTION é executado, o sistema:

  1. Autentica usando API Key do Notion
  2. Identifica operação (createPage, queryDatabase, updatePage, appendBlock)
  3. Conecta à API do Notion v1 (versão 2022-06-28)
  4. Executa operação com propriedades e conteúdo
  5. Retorna resultado com IDs e URLs
  6. 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:

  1. CRM de clientes: Criar página para cada novo lead
  2. Base de conhecimento: Consultar FAQs e documentação
  3. Registro de atendimentos: Documentar cada conversa
  4. Wiki interna: Criar e atualizar documentação de processos
  5. Gestão de projetos: Manter database de projetos atualizada
  6. Biblioteca de recursos: Catalogar materiais e arquivos

Quando NÃO usar NOTION:

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