Por que a notificação push do Google Calendar chega sem os detalhes do agendamento?
A notificação push do Google Calendar chega sem os detalhes do agendamento porque ela sinaliza apenas que o recurso monitorado mudou. O Google envia uma solicitação HTTPS com cabeçalhos X-Goog, mas sem corpo e sem os campos do evento alterado. A integração precisa fazer outra chamada à API para obter a mudança completa.
Esse aviso também não é uma fila permanente. O canal expira, os números de mensagem crescem sem serem sequenciais e o Google alerta que uma pequena parcela das notificações pode ser descartada. O método events.watch usa 604800 segundos como TTL padrão. A aplicação precisa renovar o canal e manter uma rotina de sincronização recuperável.
O que a notificação push realmente informa?
A documentação do Google diz que as mensagens para o URL receptor não incluem corpo. Elas também não informam qual evento foi criado, alterado ou excluído. O POST é um sinal para consultar o recurso monitorado por outro caminho autorizado.
Os cabeçalhos sempre presentes incluem identificador do canal, número da mensagem, identificador e URI do recurso, além do estado do recurso. O estado pode indicar início da sincronização, existência de mudança ou ausência do recurso. Mesmo assim, ele não substitui a leitura do evento.
Trate a notificação como um disparador pequeno. Valide o canal, registre o recebimento técnico e coloque uma tarefa de sincronização na fila. A tarefa consulta o calendário com a credencial e o escopo corretos, aplica as mudanças e registra a conclusão.
Esse desenho é diferente de publicar disponibilidade entre sistemas. O artigo sobre o link da Doctoralia no Google e a agenda do Feegow explica por que um link de agendamento não cria sincronização com o Google Calendar. Aqui, o problema é o envelope de notificação e o ciclo do canal, não a origem da disponibilidade.
Por que os detalhes do agendamento não devem ser inferidos?
Um estado exists informa que houve mudança na coleção monitorada. Segundo o Google, a mudança pode envolver criação, modificação ou exclusão. Sem buscar o recurso, a aplicação não sabe qual dessas ações ocorreu nem qual evento foi afetado.
Não use o último evento visto, o horário atual ou o número da mensagem para preencher essa lacuna. Essas pistas não identificam o registro alterado. Uma inferência errada pode remover um bloqueio válido, duplicar um evento ou associar uma mudança ao agendamento incorreto.
Inferência operacional: mantenha a atualização em estado pendente até que a consulta autorizada confirme o conteúdo. Se a agenda participa da publicação de horários, não interprete uma notificação sem leitura concluída como prova de que o horário ficou livre.
A origem de marketing também não vem no webhook. Mesmo quando um evento corresponde a uma consulta, preserve separadamente a origem do agendamento e a origem de marketing. Um aviso técnico do Google Calendar não deve substituir nenhuma delas.
Quais cabeçalhos precisam ser preservados?
O receptor precisa correlacionar X-Goog-Channel-ID com um canal criado pela própria aplicação. X-Goog-Resource-ID identifica de forma opaca o recurso monitorado, enquanto X-Goog-Resource-URI representa seu endereço específico da versão da API. Preserve essa relação no registro interno do canal.
O X-Goog-Channel-Token aparece quando a aplicação definiu um token na criação. O Google recomenda usá-lo para verificar que a mensagem pertence a um canal criado pelo sistema e orienta a não colocar dados sensíveis nesse valor. Use um identificador opaco, sem nome, contato, motivo de consulta ou conteúdo clínico.
O cabeçalho de expiração aparece quando o canal tem prazo definido. Ele serve para programar a substituição antes do fim, não para descobrir a expiração depois que as mensagens pararam. Guarde também o horário em milissegundos devolvido pela resposta de watch.
Registros gerais devem conter somente metadados técnicos: canal, recurso, estado, número da mensagem, horário de recebimento e resultado da sincronização. Não copie descrição, convidados ou anotações do evento para provar que o webhook chegou.
Os números de mensagem revelam notificações perdidas?
Não como uma sequência contínua. O Google informa que mensagens sync usam o número 1. As mensagens seguintes têm números maiores, porém não sequenciais. Um salto não prova quantos avisos faltaram e não deve produzir eventos artificiais.
O valor ainda ajuda a rejeitar regressões óbvias dentro do mesmo canal e a correlacionar recebimentos. Ele não substitui uma sincronização baseada no estado atual da API. Também não deve ser comparado entre canais diferentes, pois cada renovação usa um identificador próprio.
O guia do Google avisa que notificações push não são totalmente confiáveis e que uma pequena parcela pode ser descartada em condições normais. A integração precisa continuar sincronizada mesmo sem receber cada aviso. Crie uma verificação periódica ou outra rotina de reconciliação aprovada.
Se a busca posterior falhar, mantenha a atualização pendente e siga o procedimento de recuperação da API. Não trate uma resposta incompleta ou um erro de sincronização como uma agenda vazia.
Como funciona a expiração e renovação do canal?
O método events.watch aceita params.ttl e documenta 604800 segundos como padrão. A resposta inclui o prazo de expiração quando definido. O Google também pode aplicar limites internos, usando o valor mais restritivo entre a solicitação e seus próprios limites.
Não existe renovação automática. Quando o canal se aproxima da expiração, a aplicação deve criar outro com uma propriedade id exclusiva. O Google observa que pode haver um período de sobreposição em que os dois canais do mesmo recurso permanecem ativos.
Inferência operacional: crie o canal novo, confirme sua resposta e só depois encerre o antigo segundo a estratégia aprovada. O receptor precisa aceitar temporariamente ambos sem aplicar a mesma mudança duas vezes. Expirar o canal anterior antes de provar o novo cria uma janela silenciosa.
Cadastre a relação entre usuário autorizado, agenda, canal, recurso, criação e expiração. Se a credencial ou permissão mudar, trate isso como um evento separado. Uma renovação bem-sucedida não prova que a aplicação ainda consegue listar os eventos.
Qual fluxo transforma o aviso em estado confiável?
O caminho seguro separa recebimento de interpretação. Primeiro, o endpoint valida o canal e o token. Em seguida, registra um sinal técnico durável e responde. Um worker consulta as mudanças pela API, aplica o resultado de forma idempotente e avança o estado de sincronização somente após concluir todas as páginas necessárias.
- Correlacione o identificador do canal com um registro ativo.
- Valide o token do canal quando ele estiver configurado.
- Registre estado, recurso, número e horário sem conteúdo de paciente.
- Acione a consulta autorizada dos eventos alterados.
- Aplique criação, mudança ou exclusão conforme a resposta real.
- Marque a sincronização como concluída apenas após todas as etapas.
Faça o processamento tolerar avisos repetidos e sobreposição de canais. A mesma mudança pode provocar trabalho duplicado no receptor sem significar dois agendamentos. Preserve a identidade do evento e o estado atual antes de executar efeitos externos.
Uma remarcação também não deve apagar a origem original. O guia sobre preservar a origem após uma remarcação ajuda a manter atribuição e estado operacional em campos diferentes.
Como testar sem usar dados de pacientes?
Crie uma agenda controlada com eventos sintéticos e títulos neutros. Não inclua nome, telefone, email, motivo de consulta, diagnóstico ou observação clínica. O teste precisa provar o protocolo do canal, não reproduzir uma consulta real.
Crie um canal e registre a resposta de watch. Confirme a mensagem inicial sync, inclusive o caso documentado em que ela pode chegar antes da resposta de criação por causa do tempo de rede. Depois, altere um evento sintético e verifique que o POST chega sem corpo.
Teste uma notificação repetida, um salto no número da mensagem e uma falha temporária na busca posterior. O estado publicado pela aplicação deve permanecer pendente até a leitura completa. Em seguida, simule a sobreposição entre canal antigo e novo para provar idempotência.
Por fim, deixe um canal de teste atingir seu fluxo de expiração controlado. Confirme que o substituto foi criado com novo identificador e que a aplicação continua encontrando mudanças. A taxonomia de resultados de agendamento ajuda a impedir que esses eventos técnicos sejam contados como novas conversões.
Perguntas frequentes
A notificação push do Google Calendar contém o evento alterado?
Não. O Google afirma que as mensagens não incluem corpo nem informações específicas sobre o recurso atualizado. Use os cabeçalhos para identificar o canal e faça outra chamada autorizada à API para obter a mudança.
Um salto no X-Goog-Message-Number prova perda de mensagens?
Não. Os números aumentam, mas o Google diz que não são sequenciais. Um salto não informa quantas notificações faltaram. Confirme o estado pela API e mantenha uma rotina de reconciliação.
O canal events.watch é renovado automaticamente?
Não. O Google orienta criar um novo canal com identificador exclusivo antes da expiração. O TTL padrão documentado para events.watch é 604800 segundos.
Posso colocar o identificador do paciente no token do canal?
Não é necessário e aumenta o risco. O Google recomenda não colocar dados sensíveis no token. Use um valor opaco que permita correlacionar o canal sem expor paciente, consulta ou credencial.
Referências
- Google for Developers, “Notificações push,” revisado em 16 de agosto de 2026, https://developers.google.com/workspace/calendar/api/guides/push?hl=pt-BR.
- Google for Developers, “Events: watch,” revisado em 16 de agosto de 2026, https://developers.google.com/workspace/calendar/api/v3/reference/events/watch?hl=pt-BR.
Leia também
Por que não consigo inativar um procedimento do Feegow publicado na Doctoralia?
Um procedimento do Feegow integrado à Doctoralia não pode ser inativado ou excluído enquanto essa integração permanecer ativa. A…
Por que um agendamento recorrente remarcado no Google Calendar mantém o originalStartTime antigo?
Um agendamento recorrente remarcado mantém o originalStartTime antigo porque esse campo identifica a ocorrência dentro da série, mesmo…
Por que a restrição de retorno do Feegow não bloqueia agendamentos online da Doctoralia?
A restrição de período para retorno configurada no Feegow não bloqueia o agendamento online feito pela Doctoralia porque a própria…