Capacidades
- Lê contatos, empresas, negócios e tickets, os proprietários do portal, e as ligações, os e-mails, as reuniões e as notas registrados.
- Lê as associações entre contato e empresa, negócio e contato, negócio e empresa, ticket e contato, e ticket e empresa.
- Instala 14 tabelas clean prontas: 9 de cadastro e atividade (
hubspot_contacts,hubspot_companies,hubspot_deals,hubspot_tickets,hubspot_owners,hubspot_calls,hubspot_emails,hubspot_meetingsehubspot_notes) e 5 de associação. Em todas as tabelas de cadastro e atividade, as colunas de data sãoTIMESTAMPTZ, em UTC, então você compara datas em SQL sem conversão. - Enriquece o contato com o domínio da empresa, e o negócio com o id, o nome e o domínio da empresa.
- Traz o nome do estágio e do funil de cada negócio e de cada ticket, lidos da lista de funis do HubSpot. Veja Estágios dos funis.
- Alimenta o Memory com os nós
Customer(contatos),Company,Deal(com o nome, a probabilidade e a ordem do estágio),Ticket(com o nome, o estado e a ordem do estágio),Agent(proprietários),Email,Call,MeetingeNote, ligados pelas associações e pelo proprietário de cada registro.Customercasa com nós de outros conectores pelo e-mail e pelo telefone,Companypelo domínio eAgentpelo e-mail. Os nós só entram no grafo depois que a ontologia unificada é aplicada. - Traz fragmentos de Knowledge: a indexação semântica de
dealnameedescriptiondos negócios, e textos de referência sobre as tabelas de tickets e de engajamentos. - Aplica a permissão de cada contato, empresa, negócio e ticket do HubSpot, e o proprietário e o time dele nos engajamentos. Veja Permissões (ACL).
Recursos disponíveis
Todo recurso nasce desligado no Data Catalog. Você escolhe quais carregar depois de conectar. Os recursosdeal_pipelines e ticket_pipelines não têm opção própria no Data Catalog: entram quando você liga deals e hs_tickets, respectivamente, e saem junto com eles.
As 14 tabelas clean do HubSpot são instaladas quando você cria o conector, fora do contexto. Ligue no Data Catalog as que você quer usar. Cada uma passa a ser atualizada depois de cada sincronização. As tabelas de associação têm pares de ids e servem de ligação entre as outras.
Estágios dos funis
O HubSpot guarda no negócio e no ticket só o código do estágio. Nos estágios padrão o código é um texto, comoappointmentscheduled. Nos estágios que você criou, é um número. O nome só existe na lista de funis, que o conector lê nos recursos deal_pipelines e ticket_pipelines. As tabelas hubspot_deals e hubspot_tickets juntam essa lista pelo par de códigos do funil e do estágio e ganham estas colunas, além dos códigos, que continuam como estavam:
- Quando o estágio do negócio ou do ticket não aparece na lista de funis, as quatro colunas ficam NULL. O conector não preenche o nome com o código.
- Funis e estágios arquivados continuam na lista, para que um negócio parado num estágio arquivado mantenha o nome.
- Os dois recursos guardam só nomes de configuração do portal, sem dado de pessoa, e não têm permissão por item. Eles não ampliam quem vê cada negócio ou ticket.
Como ler os dados
- Toda coluna de data das 9 tabelas de cadastro e atividade é
TIMESTAMPTZ, em UTC. Sãocreated_ateupdated_atem todas,close_dateemhubspot_deals,closed_dateemhubspot_tickets,occurred_atemhubspot_calls,sent_atemhubspot_emails,start_time,end_timeescheduled_atemhubspot_meetingsenoted_atemhubspot_notes. O HubSpot entrega datas em texto ISO 8601 ou em milissegundos desde 1970, e a clean aceita as duas formas. Um valor vazio ou ilegível vira NULL. close_dateeclosed_datesão NULL enquanto o negócio ou o ticket está aberto.- Os
created_atde engajamentos e proprietários, e oupdated_atde proprietários, não vêm de uma propriedade de data, e sim dos camposcreatedAteupdatedAtda resposta da API, que só trazem texto ISO 8601. - E-mails e domínios saem em minúsculas, sem espaços nas pontas.
priority,source_type,directionestatussaem em maiúsculas. - Em
hubspot_contacts,company_domainvem da empresa principal do contato, a associação de tipo primário. Emhubspot_deals,company_id,company_nameecompany_domainvêm da empresa associada ao negócio, e um negócio com mais de uma empresa gera uma linha por empresa. owner_idé o proprietário do registro. Ele casa comexternal_idemhubspot_owners, e não com ouser_id.hubspot_calls.duration_msé a duração em milissegundos. O HTML do e-mail não entra emhubspot_emails, só o texto.
Permissões (ACL)
O conector lê a permissão de cada item na fonte e a guarda junto com o dado. Em Comportamento dos dados, você escolhe entre dois modos:
No modo “Espelhar a fonte”, marque Exigir login na fonte como prova de identidade. O HubSpot identifica cada pessoa por um id próprio, não pelo e-mail, então a Strattum só reconhece quem se autenticou no HubSpot.
Como a fonte define acesso
No HubSpot, o acesso a contatos, empresas, negócios e tickets é por registro: a API informa quais usuários do portal podem ver cada um. Ligações, e-mails, reuniões e notas pertencem a um proprietário, e o HubSpot não tem permissão por pessoa para eles.Como a Strattum traduz o acesso
O
userId e o id de proprietário são numeração diferente para a mesma pessoa. O conector grava cada um como veio e não os unifica, porque nenhum registro recebe os dois. Em contatos e negócios, a linha clean reúne também quem vê a empresa associada: quem pode ver qualquer um dos dois vê a linha. As associações não carregam permissão própria.
Além dos usuários, o conector acrescenta o time do proprietário do registro, lido do campo de times dos proprietários. Esse acesso só passa a valer quando o token tem o escopo settings.users.teams.read e algum proprietário pertence a um time. Ele concede o registro ao time inteiro, o que dá mais acesso do que a lista de usuários permitidos de um contato.
Quando a identidade não é encontrada
No modo “Espelhar a fonte”, quem não vinculou a conta do HubSpot não vê contatos, empresas, negócios, tickets nem engajamentos. A lista de proprietários continua visível para quem pode usar o conector. Um registro cuja leitura de usuários permitidos falha, por falta de acesso do token ou porque foi apagado no meio da leitura, é gravado sem ninguém e não aparece para nenhuma pessoa nesse modo. O conector registra um aviso no log da sincronização.Quando a permissão é atualizada
A permissão do registro é lida junto com o registro, a cada vez que ele é lido. Em full refresh, isso é a cada execução. Em incremental, só os registros alterados são lidos de novo, então uma mudança de permissão no HubSpot que não altera o registro só chega num full refresh. A participação em times é atualizada por uma rotina própria, a cada 10 minutos por padrão.Pré-requisitos
- Uma conta HubSpot com acesso para criar uma Service Key: super admin, ou usuário com a permissão de acesso às ferramentas de desenvolvedor.
- Os escopos de leitura da tabela de Autenticação e escopos, adicionados à Service Key.
- Uma Service Key cujos escopos cubram todos os recursos que você quer carregar.
- Para o login na fonte, um app do HubSpot com Client ID e Client Secret, pelo qual as pessoas se autenticam.
- Uma só conexão HubSpot por instalação da Strattum.
Autenticação e escopos
A autenticação é por token de acesso do HubSpot, no formatopat-..., enviado como Bearer. O Console pede uma Service Key, criada no Developer Portal. O conector não renova nem troca o token: ele usa o valor guardado até você trocá-lo.
Os recursos
deal_pipelines e ticket_pipelines não pedem escopo novo: a leitura dos funis usa os escopos de leitura que o conector já pede.
1
Abra as Service Keys
No HubSpot, abra o Developer Portal e vá em Development → Keys → Service Keys.
2
Crie a Service Key
Clique em Create service key, dê um nome como
strattum-sync e adicione os escopos de leitura da tabela acima.3
Copie o token
Copie o token que começa com
pat-.Configuração no Console
1
Abra o assistente
Em Conectores, clique em + Nova Conexão e selecione HubSpot.
2
Preencha a conexão
Nome do Conector (Opcional): como a conexão aparece na lista. O padrão é
HubSpot CRM.Service Key (Access Token) (Obrigatório): o token pat-... gerado no Developer Portal.3
Teste a conexão
Clique em Testar Conexão. Você só avança depois de um teste com sucesso. O teste lê um contato com o token. Ele falha com “Access token inválido ou expirado” quando o token é recusado e com “Token sem permissão para acessar contacts” quando falta o escopo de contatos.
4
Escolha a frequência
Em Sincronização (Obrigatório), escolha a frequência. A recomendada para o HubSpot é a cada 2 horas.
5
Defina o acesso
Em Permissionamento, defina Quem pode usar este conector e o Comportamento dos dados. Com “Espelhar a fonte”, marque Exigir login na fonte como prova de identidade e preencha a URL de autenticação (Obrigatório; no HubSpot é sempre
https://app.hubspot.com/oauth/authorize), o Client ID (Obrigatório) e o Client Secret (Obrigatório) do app do HubSpot. Em Escopos (Opcional), o padrão é oauth.6
Revise e salve
Em Revisão, confira os dados e salve. A Service Key aparece mascarada.
7
Ligue os recursos no Data Catalog
No Data Catalog, ligue os recursos e as tabelas clean que você quer carregar. Nos recursos de CRM e de engajamento, escolha o modo Incremental na aba Carga quando quiser ler só o que mudou: sem essa escolha, o recurso roda em full refresh.
owners e as associações rodam sempre em full refresh.Como a sincronização funciona
A frequência vem do passo Sincronização. A recomendada é a cada 2 horas. Cada execução testa a conexão uma vez, carrega os recursos ligados no Data Catalog um por vez, na ordemcontacts, companies, deals, hs_tickets, owners, calls, emails, meetings, notes e as 5 associações, e só então monta as tabelas clean. Se a leitura de um recurso falha, a execução para nele e as tabelas clean não são montadas.
Registros. O conector lê em páginas de 100 registros, com as propriedades de cada recurso. Em full refresh, a tabela é reescrita por inteiro a cada execução. Em incremental, a primeira execução lê tudo. As seguintes pedem só os registros alterados depois do maior cursor já carregado e gravam por id, então um registro alterado substitui a linha anterior.
Permissão por registro. Para cada contato, empresa, negócio e ticket lido, o conector faz mais uma chamada ao HubSpot para saber quem pode ver o registro. Em full refresh, isso dobra o número de chamadas: uma por página e uma por registro.
Associações. Cada recurso de associação relê todos os contatos, negócios ou tickets de origem, sem a permissão, e pergunta ao HubSpot as associações de cada grupo de 100 deles. Por isso é sempre um full refresh. O par preferido é o de tipo primário, quando o registro tem mais de um.
Proprietários. A lista de proprietários é lida por inteiro a cada execução, sem os arquivados.
Estágios dos funis. deal_pipelines e ticket_pipelines fazem uma única chamada por execução, sem paginação, e gravam uma linha por estágio, em full refresh. Funis e estágios arquivados ficam na tabela.
Remoção. Em full refresh, um registro que deixou de existir no HubSpot some da tabela na execução seguinte. Em incremental, um registro apagado ou arquivado continua na tabela, porque a busca por alteração não devolve remoções. Um full refresh o remove.
Falhas. A tarefa de extração de cada recurso tenta de novo até 3 vezes, depois de 30, 60 e 120 segundos.
API da fonte
Todas as chamadas só leem dados. O host da API é
https://api.hubapi.com. O teste de conexão faz GET /crm/v3/objects/contacts?limit=1.
Rate limits. O HubSpot limita as chamadas de duas formas. Por app, são 100 chamadas a cada 10 segundos nos planos Free e Starter, 190 nos planos Professional e Enterprise e 250 com o complemento de aumento de limite. Por conta, o limite diário é compartilhado entre os private apps: 250.000 chamadas nos planos Free e Starter, 625.000 no Professional e 1.000.000 no Enterprise. O limite diário reinicia à meia-noite no fuso da conta. Passando do limite, a API responde 429.
O conector envia uma chamada por vez, com tempo limite de 30 segundos. Diante de um 429, espera o tempo do header Retry-After quando existe, senão 10 segundos, e tenta de novo, sem limite de tentativas. Quando o limite diário acaba, a espera repete até o reinício, e a tarefa de extração pode ficar presa enquanto isso. Erros 5xx têm até 3 novas tentativas, com espera de 10, 20 e 40 segundos. Como cada contato, empresa, negócio e ticket custa duas chamadas em full refresh, uma carga completa de 100.000 contatos usa cerca de 101.000 chamadas, contra 250.000 por dia nos planos Free e Starter. Nesses planos, o limite de 100 chamadas a cada 10 segundos faz essa carga levar mais de 2 horas. Use o modo incremental nesses recursos.
Referência oficial: HubSpot, API usage details
Limitações conhecidas
- A permissão por registro vale para contatos, empresas, negócios, tickets e engajamentos. As associações e a lista de proprietários não têm permissão própria: os proprietários ficam visíveis para quem pode usar o conector.
- Uma conexão HubSpot por instalação, com um só portal por conexão.
- O HubSpot identifica as pessoas por id, não por e-mail, então no modo “Espelhar a fonte” só quem vinculou a conta do HubSpot é reconhecido.
- A permissão é lida com o registro. Em incremental, uma mudança de permissão que não altera o registro só chega num full refresh.
- O acesso por time do proprietário concede o registro ao time inteiro e não distingue quem, dentro do time, teria permissão individual. Ele só vale com o escopo
settings.users.teams.reade com proprietários em times. - Contatos e negócios mostram o registro para quem vê a empresa associada, mesmo sem acesso ao contato ou ao negócio: vale a união das duas permissões.
- Em incremental, registros apagados ou arquivados no HubSpot não saem da tabela, e um full refresh os remove.
- Cada contato, empresa, negócio e ticket custa uma chamada extra de permissão. Em portais grandes, a carga completa pode gastar boa parte da cota diária.
- O teste de conexão lê só um contato. Ele não confere os escopos de tickets, proprietários e engajamentos.
- Os campos que ligam as tabelas ficam bloqueados no Data Catalog, e uma política de dados pessoais não pode ser aplicada a eles: o proprietário de negócios, tickets e engajamentos (
hubspot_owner_id), os ids das associações e as colunas de associação usadas para a união de permissões. - Ligações, e-mails, reuniões e notas não têm tabela de associação: não há ligação direta entre um engajamento e o contato ou a empresa dele.
- Propriedades personalizadas do HubSpot não são lidas. O conector pede um conjunto fixo de propriedades por recurso.
- O SQL de cada tabela clean é instalado quando você cria o conector, e editar o conector não o reinstala. Uma conexão criada antes de 12/10/2026 mantém o SQL anterior, com as datas das tabelas clean em texto. Uma criada antes da versão que trouxe os estágios dos funis mantém também o SQL antigo de
hubspot_dealsehubspot_tickets, sem as colunas de estágio. A Strattum precisa reinstalar esses dois modelos e rodar uma sincronização antes de as colunas aparecerem. - Itens de linha, produtos, cotações e campanhas ficam de fora.
Troubleshooting
Próximos passos
Data Catalog
Ligue os recursos e as tabelas clean do HubSpot e acompanhe a carga.
Memory
Veja como contatos, empresas, negócios e proprietários viram nós do grafo de conhecimento.
Desenvolvimento local
Desenvolvimento local
A sincronização lê o token só da conexão cadastrada pelo Console, que o guarda no cofre de credenciais. Não há variável de ambiente para a sincronização. A variável Veja o guia de configuração local para subir o Prefect e o worker.
HUBSPOT_ACCESS_TOKEN é lida apenas quando você usa a classe do conector direto, em um script.