Comunidade

Integração do Klaviyo no Shopify com Flutter: O que Você Deve Saber Antes

A integração do Klaviyo em um aplicativo Flutter para e-commerce baseado no Shopify não é tão simples quanto instalar o SDK. Além da configuração inicial rápida, a implementação produtiva exige resolver questões de arquitetura, como uma camada abstrata de analytics, coexistência com push notifications existentes e respeito às escolhas do usuário em relação ao consentimento.

Compartilhar
Klaviyo Shopify Integration in Flutter: What to Know First - DEV Community

Para CTOs, líderes de tecnologia e desenvolvedores sêniores que estão avaliando uma integração do Klaviyo para um aplicativo móvel de comércio eletrônico — ou prestes a escopo um. Se você está procurando por um guia passo a passo sobre como instalar o SDK, os documentos do Klaviyo cobrem isso bem. Este post é sobre o que acontece depois da instalação — a arquitetura, integração e decisões de escopo que determinam se o projeto leva duas semanas ou dois meses.

Série Klaviyo × Flutter (parte 1 de 4): planejamento & escopo · camada analítica unificada · armadilhas das notificações push · perfis e newsletter.

Diga-lhe o que é essencial: O klaviyo_flutter_sdk instala em minutos. A integração de produção para uma marca DTC baseada no Shopify levou cinco semanas e seis PRs. O maior investimento único foi a camada abstrativa unificada de análise que tornou o Klaviyo um adaptador limpo plug-in — e a única lacuna que nenhum código do lado do aplicativo pode preencher é o rastreamento de compras, porque o checkout abre no navegador.


Por que "instalar o SDK" é o modelo mental errado

Quando um cliente pergunta sobre uma integração do Klaviyo no Shopify para seu aplicativo Flutter, a conversa geralmente começa com o SDK. "Quanto tempo leva para instalá-lo?" A resposta — uma hora, talvez duas — é tecnicamente correta e completamente enganosa.

O klaviyo_flutter_sdk envolve os SDKs nativos do Klaviyo iOS e Android. Ele cobre a identificação de perfil, o rastreamento de eventos e o registro de tokens push. Você adiciona a dependência, chama Klaviyo.initialize(apiKey), e o SDK está em execução. Mas o SDK é um cabo — ele não decide o que passa por ele.

Uma integração de produção significa responder: Como os eventos analíticos chegam ao Klaviyo sem duplicar a lógica de disparo que você já tem para o Firebase? Como as notificações push coexistem com sua configuração existente do firebase_messaging? Como o aplicativo identifica um perfil sem criar duplicatas contra a sincronização própria do Shopify no Klaviyo? E como tudo isso respeita as escolhas de consentimento do usuário?

Essas quatro perguntas são quatro fluxos de trabalho. Cada uma tem pelo menos um problema não óbvio. Eis como eles pareciam na prática, trabalhando em um aplicativo Flutter da marca DTC de joias baseado no Shopify.

Antes de começar: o que o cliente deve fornecer

Antes que uma integração do Klaviyo possa começar, três coisas precisam vir de fora da equipe de desenvolvimento:

1. Chave pública API do Klaviyo (ID do site) — o identificador que o SDK usa para associar eventos e perfis com sua conta do Klaviyo. Encontrado nas configurações da conta do Klaviyo sob chaves de API.

2. Uma entrada Usercentrics de processador de dados para o Klaviyo — se seu aplicativo usa um CMP (e na UE, ele faz), o Klaviyo precisa ter sua própria entrada. Isso é uma configuração legal/da conformidade, não uma tarefa do SDK. Sem isso, a barreira de consentimento tem nada para verificar.

3. O ID da lista newsletter — o Klaviyo organiza assinantes em listas. O aplicativo precisa do ID específico da lista para que os perfis sejam inscritos. Sua equipe de marketing cria a lista; o desenvolvedor obtém o ID.

Workstream 1: Construindo uma camada de análise Flutter para o Klaviyo

Antes de tocar no Klaviyo, a análise do aplicativo precisava de uma camada abstrativa. A configuração existente tinha cerca de 10 chamadas espalhadas pelo código base, cada uma chamando Firebase Analytics e um serviço de atribuição diretamente. Sem interface, sem compartilhar o despacho — cada tela que rastreava um evento importava o serviço do Firebase, construía a carga do evento e disparava.

Adicionar Klaviyo nesse modelo significaria visitar todas as chamadas de site, adicionando uma terceira chamada direta e triplicando a superfície de manutenção. O próximo provedor depois disso — Meta, por exemplo — faria o mesmo.

A solução foi um padrão Adapter + Mediator: um único AnalyticsDispatcher que recebe eventos através de uma API e os distribui para adaptadores por provedor. Cada adaptador (Firebase, atribuição, Klaviyo e um stub do Meta) implementa a mesma interface. O despachante itera sobre os adaptadores ativos, verifica o consentimento para cada um e encaminha o evento.

Detalhes: Um método trackEvent(), Quatro SDKs — a arquitetura completa →

Workstream 2: Notificações push do Klaviyo no Flutter

O Klaviyo envia notificações push através do FCM no Android e APNs no iOS. O klaviyo_flutter_sdk lida com o registro de tokens de push — você passa o token para o Klaviyo, e o Klaviyo associa-o ao perfil identificado. Isoladamente é simples.

O problema: o aplicativo já tinha uma configuração de trabalho de notificações push com firebase_messaging. No Android, três serviços competiam pelo filtro de intenções com.google.firebase.MESSAGING_EVENT — o próprio serviço FirebaseMessagingService, o serviço do Klaviyo e o serviço padrão FCM. A resolução de serviços no Android redireciona para exatamente um. Neste caso, o serviço do Klaviyo estava vencendo, o que significava que as notificações push não relacionadas ao Klaviyo eram silenciosamente descartadas. A solução foi rotear todas as mensagens de entrada através de um único serviço e despachá-las com base em marcadores no payload.

No iOS, a Extensão do Serviço de Notificação era necessária para o push rico do Klaviyo (imagens, botões de ação). A extensão intercepta a notificação antes da exibição, baixa o conteúdo e anexa-o. Configurar isso significa um alvo separado no Xcode, um grupo compartilhado de aplicativos e uma configuração cuidadosa do sinalizador mutable-content. O manipulador de toque também precisava ser controlado: as notificações push do Klaviyo carregam um marcador _k no payload, e o aplicativo precisa distinguir esses da suas próprias notificações de link profundo para rotear corretamente.

A colisão entre o existente firebase_messaging e a SDK do Klaviyo foi a sessão mais demorada de depuração do projeto. Notificações push que desaparecem silenciosamente não produzem logs de erro — a mensagem chega, é despachada para o serviço errado e some. Se você está lidando com complexidade de notificações push além do Klaviyo, também escrevi sobre sistemas de notificação push contextualmente inteligentes.

Detalhes: Notificações Push do Klaviyo no Flutter — três armadilhas →

Workstream 3: Identidade do perfil e newsletter no Klaviyo com Flutter

O Klaviyo identifica perfis por email. O backend Shopify também sincroniza dados de clientes para o Klaviyo através da integração nativa Shopify-Klaviyo. Isso cria um problema de coordenação: o aplicativo e o backend escrevem no mesmo perfil do Klaviyo, e precisam concordar sobre a identidade.

A abordagem inicial - passar external_id junto com o email para vincular perfis criados pelo aplicativo aos sincronizados com o Shopify - deu errado. A lógica de fusão de perfis do Klaviyo tratou external_id como um identificador forte. Em vez de unir os perfis, ela suprimiu a fusão automática e criou duplicatas. A solução foi usar a identificação por email apenas do lado do aplicativo e deixar que a própria lógica de fusão do Klaviyo lidasse com a deduplicação contra o sync do Shopify.

A assinatura para newsletter adicionou outra assimetria. Assinar um perfil em uma lista funciona através da API cliente do Klaviyo - o aplicativo chama Klaviyo.subscribeToList(listId) e o perfil é adicionado. O cancelamento de assinatura, no entanto, não está disponível por meio do SDK cliente. A solução foi um fluxo assimétrico: o desassunção dispara um evento personalizado do aplicativo, que aciona uma flow do Klaviyo, que chama um webhook para remover o perfil da lista. Assinar é sincrônico e direto; cancelar assinatura é baseado em eventos e indireto.

Detalhes aprofundados: Klaviyo Profiles & Newsletter — onde os documentos não te ajudarão →

Fluxo de trabalho 4: Gerenciamento de consentimento para o Klaviyo com o Usercentrics

Toda provedora de analytics no aplicativo é controlada por consentimento do usuário, gerenciado através de uma CMP (Plataforma de Gestão de Consentimento) do Usercentrics. Sem consentimento, não há rastreamento - a GDPR exige isso e na prática significa que o configuração de consentimento bloqueia ou desbloqueia cada provedor independentemente.

O Klaviyo não tem um interruptor de coleta em tempo real. Não existe Klaviyo.setEnabled(false) - uma vez inicializado, o SDK está ativo. A barreira do consentimento vive na camada de dispatch: o AnalyticsDispatcher verifica o estado de consentimento do usuário para Klaviyo antes de passar qualquer evento ao adaptador do Klaviyo. Se não houver consentimento, o adaptador nunca dispara.

O Firebase requer um mecanismo diferente. Além da barreira na camada de dispatch, o Firebase tem comportamentos de coleta automática (vistas de tela, início de sessão) que ignoram suas chamadas de eventos no nível do código. Esses precisam ter FirebaseAnalytics.setConsent() com parâmetros do Google Consent Mode v2 - analyticsStorage, adStorage, adUserData, adPersonalization. Sem isso, o Firebase coleta dados mesmo quando sua camada de dispatch os bloqueia.

O dispatcher suporta ambos os mecanismos: barreiras por chamada para provedores como Klaviyo que não têm um interruptor nativo e APIs de consentimento do SDK para provedores como o Firebase que possuem um. Ambos verificam o mesmo estado de consentimento do Usercentrics.

O problema de checkout do Shopify: por que o Flutter não pode rastrear compras

O aplicativo rastreia três métricas nativas Klaviyo: openedApp, viewedProduct e addedToCart. Esses disparos vêm do código do aplicativo, passam pela camada de dispatch e chegam ao Klaviyo para segmentação e gatilhos de fluxo.

Há uma quarta métrica que você esperaria: purchase. Ela está ausente - e não pode ser adicionada do lado do aplicativo.

A razão: o checkout abre no navegador do sistema. O usuário toca em "Comprar agora", o aplicativo inicia uma URL de checkout do Shopify em Safari ou Chrome, e a compra é concluída lá. O aplicativo não tem um callback, webhook ou nenhuma maneira de saber que a compra aconteceu. A sessão no navegador está fora do processo do aplicativo e o checkout do Shopify não chama de volta para o aplicativo nativo.

Isso significa que fluxos baseados em compras no Klaviyo - emails pós-compra, sequências de recuperação com base na história de pedidos, atribuição de receita - não podem ser disparados a partir de eventos do lado do aplicativo. Os dados precisam vir de algum lugar diferente.

Existem três opções, todas fora do escopo do aplicativo:

  • Pixels web do Shopify: A integração nativa de análise do Shopify pode encaminhar eventos de checkout para o Klaviyo. Isso ocorre inteiramente no checkout do Shopify, sem a necessidade de envolvimento de aplicativo.
  • Webhooks de pedido para um backend: O Shopify dispara webhooks de pedido (orders/create) para um serviço de backend, que chama a API do servidor do Klaviyo para registrar o evento de compra.
  • Híbrido: Combine pixels web para rastreamento em tempo real com webhooks como fallback para confiabilidade.

A escolha depende da infraestrutura do cliente. Se eles já têm um backend que processa webhooks do Shopify, a rota de webhook é simples. Caso contrário, os pixels web do Shopify são a opção com manutenção menor.

Ponto-chave: essa decisão precisa ser tomada antes ou durante a integração, não depois. Se a equipe de marketing espera fluxos baseados em compras no Klaviyo e o plano de integração abrange apenas código do lado do aplicativo, há uma lacuna que nenhuma quantidade de desenvolvimento Flutter pode preencher.

Encontrou o mesmo problema com o checkout do Shopify? Naveguei por isso em aplicações Flutter baseadas no Shopify — vamos mapear suas opções em 15 minutos.

O cronograma real

O projeto durou cerca de cinco semanas do calendário, entregue através de seis pull requests. A fase foi deliberada: fundação primeiro, depois migração dos pontos de chamada, então integração do provedor e por fim QA.

Pacote de TrabalhoEscopoEfetivo
Absortação principalInterface do AnalyticsProvider, AnalyticsDispatcher2 PT
Adaptador FirebasePacote de serviço existente2.5 PT
Adaptador de atribuiçãoPacote de serviço existente + provedor1 PT
Riverpod wiring + consentimentoCriação do provedor, ConsentController0.25 PT
Migração dos pontos de chamadaSubstituir em ~10 arquivos (~15 pontos de chamada)1 PT
Integração do SDK KlaviyoDependência, adaptador, configuração nativa2.5 PT
META stubLugar reservado para ativar0.25 PT
QA & regressãoTodos os eventos, alternância de consentimento, Klaviyo1 PT
Total~10 PT

Cinco erros de escopo a evitar

  • Pulando a camada abstrativa. Adicionar Klaviyo em chamadas diretas dispersas cria uma migração dentro de uma migração. A camada de despacho foi cerca de 4,5 PT inicialmente, mas tornou toda integração subsequente de provedor um plug-in limpo de adaptador.
  • Subestimando conflitos de notificações push. Quando dois serviços competem pelo mesmo filtro de intenção Android, o perdedor não cai — nunca é chamado. Sem logs de erro, sem exceções. Reserve tempo para depurar falhas silenciosas de push.
  • Usando external_id para identidade contra uma conta sincronizada com Shopify. Parece certo — vincule perfis do aplicativo a perfis do Shopify por ID. Na prática, isso suprime o auto-fusão do Klaviyo e cria duplicatas. A identificação apenas por email é a solução.
  • Trazendo consentimento como um interruptor global. Diferentes provedores precisam de mecanismos de consentimento diferentes. Uma porta da camada de despacho funciona para o Klaviyo. O Firebase precisa de sua própria chamada API setConsent(). Construa para consentimento por provedor desde o início.
  • Descobrindo a lacuna de rastreamento de compra após a integração do SDK. Isso é o que determina se a integração atende às expectativas da equipe de marketing. Levante isso na primeira conversa sobre escopo.

Conclusão

A integração do Klaviyo em um aplicativo Flutter de e-commerce em produção é quatro fluxos de trabalho: abstração de análise, notificações push, identidade e newsletter e consentimento. O SDK em si é uma pequena parte do esforço total — a arquitetura ao seu redor é onde as semanas são gastos. A integração foi enviada para produção e está funcionando desde então.

O mais importante não é o código. É definir o escopo da lacuna de rastreamento de compras antes do início do desenvolvimento, para que as expectativas da equipe de marketing correspondam ao que o aplicativo pode entregar. Tudo que o aplicativo pode rastrear — aberturas, visualizações de produtos, adições ao carrinho — flui limpa e claramente. As compras não fazem isso, e essa é uma decisão do Shopify/backend, não do Flutter.

Planejando uma integração Klaviyo para seu aplicativo Flutter ou móvel? Eu já fiz isso em produção — agende um bate-papo casual de café e eu vou te guiar pelo que é necessário para sua configuração. Ou continue lendo a série: camada de análise · armadilhas das notificações push · perfis e newsletter.

Saiba como eu abordo projetos de desenvolvimento de aplicativos Flutter de ponta a ponta.

Leitura relacionada

Perguntas frequentes

O Klaviyo tem um SDK Flutter?

Sim. A biblioteca klaviyo_flutter_sdk envolve os SDKs nativos do Klaviyo para iOS e Android e cobre a gestão de perfis, o rastreamento de eventos e as notificações push. Ela lida com a inscrição do token push via FCM no Android e APNs no iOS.

Quanto tempo leva para integrar o Klaviyo em um aplicativo Flutter?

Para um aplicativo de comércio eletrônico de produção, a escala realista é várias semanas, não dias. No projeto que este artigo se baseia, o trabalho durou cerca de cinco semanas e seis pull requests ao longo da camada unificada de análise, a integração do SDK Klaviyo, notificações push, newsletter e gerenciamento de identidade, e gerenciamento de consentimento. A abstração de análises em si — construindo a camada de despacho e migrando os chamados existentes — representou cerca da metade do esforço total.

O que o cliente precisa fornecer antes de começar a integração do Klaviyo?

Três coisas: a chave pública da API do Klaviyo (ID do site), uma entrada do Klaviyo no gerenciador de consentimento (por exemplo, Usercentrics) e o ID da lista de newsletter que o aplicativo deve assinar perfis. Todos os três exigem ação de alguém fora da equipe de desenvolvimento — configurações de conta, configuração legal/compliance e configuração de marketing respectivamente.

O aplicativo pode rastrear compras no Klaviyo se o checkout for executado em um navegador?

Não apenas do aplicativo. Se o checkout abrir em um navegador externo, o aplicativo perde contexto e não pode emitir eventos de compra. O aplicativo pode rastrear openedApp, viewedProduct e addedToCart, mas o rastreamento de compras requer uma solução do lado do Shopify ou servidor. Opções incluem pixels web do Shopify, webhooks de ordem para um backend ou uma combinação híbrida das duas.

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa