Recuperação de carrinho abandonado do Shopify por ligação

Alguém chega ao checkout e vai embora sem pagar. Mais tarde, seu agente de IA liga para essa pessoa pelo nome — a menos que já tenha comprado nesse meio-tempo. Configuração completa: o aplicativo do Shopify, as permissões e todos os pontos em que isso fica em silêncio.

Atualizado

A maior parte da recuperação de carrinho abandonado é feita por e-mail. Uma ligação funciona diferente, porque a ligação é a única que exige julgamento. Mandar e-mail para quem já comprou é algo tolerável. Ligar é um minuto ruim para vocês dois.

Por isso, a maior parte deste guia não é sobre discar. É sobre tudo que precisa ser verdade antes: que exista um checkout de verdade, que a pessoa realmente não tenha comprado, que não seja meio da noite para ela, que ela nunca tenha pedido que você pare de ligar, e que você saiba o nome dela bem o suficiente para abrir a ligação com ele.

Reserve meia hora. A maior parte dela é no Shopify, não aqui.

Menos de dois minutos: o checkout que alguém abandona, as três regras que decidem se alguém recebe ligação, a frase que monta o fluxo, e a ligação que começa com o seu código de desconto.

A versão curta

  1. Crie um aplicativo do Shopify, marque quatro permissões e instale-o
  2. Copie dois segredos diferentes do Shopify
  3. Salve os dois no Omni Octo como conexões
  4. Peça ao Octo para construir o fluxo
  5. Copie o endereço do webhook e cole no Shopify, duas vezes
  6. Teste com uma espera de um minuto

Os passos 1 e 5 são onde as pessoas travam. Eles têm as próprias seções.

Passo 1 — Crie o aplicativo do Shopify e instale-o

No Shopify: Configurações → Aplicativos e canais de vendas → Desenvolver apps → Criar app. Dê um nome que você reconheça depois.

Marque estas permissões

Abra Configuração → Integração da API Admin → Configurar e conceda:

PermissãoPara que serve
read_ordersVerificar se o comprador terminou comprando
read_all_ordersA mesma verificação em pedidos com mais de 60 dias
read_customersO nome e o número de telefone dele
read_productsLer o que estava no carrinho

Você vai procurar uma permissão de checkout e não vai encontrar. read_checkouts existe, mas o Shopify a trata como protegida: ela não está na lista que você pode marcar, e pedi-la exige a aprovação do próprio Shopify. Se você chamar a API de checkouts sem ela, o Shopify responde:

This action requires merchant approval for read_checkouts scope.

Tudo bem, e é por isso que este fluxo nunca lê checkouts. Ele faz uma pergunta melhor no lugar — apareceu um pedido? — que precisa só de read_orders.

Instale-o

Este é o passo que todo mundo esquece. Configurar um aplicativo não faz nada até você clicar em Instalar aplicativo na página Overview do aplicativo. Até lá, não existe token de acesso da API Admin para copiar, e cada passo seguinte falha de um jeito que parece outra coisa quebrada.

Copie dois segredos, e não os misture

Você precisa de duas coisas diferentes, e é fácil confundi-las porque as duas parecem sequências aleatórias.

O quêOndeO que faz
Token de acesso da API AdminA aba Credenciais da API do aplicativo, depois de instalar. Começa com shpat_Deixa o Omni Octo fazer perguntas ao Shopify
Segredo de assinatura do webhookConfigurações → Notificações → Webhooks, no fim da páginaDeixa o Omni Octo verificar as mensagens que o Shopify envia

Um serve para falar com o Shopify. O outro, para conferir que foi o Shopify que realmente enviou algo. Misturá-los é o erro mais caro desta configuração, e o sintoma não se parece em nada com a causa — veja Quando nada acontece.

Passo 2 — Salve os dois segredos no Omni Octo

Vá para a página Conexões e adicione-os um de cada vez.

O token de acesso da API Admin. Clique em Nova conexão e escolha o cartão Chave HTTP / de API sob Outro. Cole o token shpat_. Dê à conexão um nome que você reconheça numa lista — “Token da API Admin do Shopify” é melhor que “Shopify”.

O segredo de assinatura do webhook. Clique em Nova conexão de novo e escolha Signing secret, depois cole o segredo da página Notificações. O formulário diz aquilo que vale lembrar:

The secret the sender signs with, not a key you call them with.

O diálogo de conexão Signing secret, com um campo Nome e um campo rotulado Signing secret.
Este é o cartão que as pessoas deixam passar. Se você colar aqui o token da API Admin, ou o segredo de assinatura no cartão de chave de API, tudo abaixo falha com um erro que não nomeia nenhum dos dois.

Duas conexões, duas direções. Salve as duas antes de construir qualquer coisa.

A página Conexões listando duas credenciais do Shopify: um token da API Admin sob HTTP e um segredo de assinatura de webhook sob Webhook, ambos marcados como ativos.
O pronto se parece com isto. Duas linhas, dois tipos: uma para fazer perguntas ao Shopify, outra para conferir que foi o Shopify que realmente enviou algo.

Passo 3 — Peça ao Octo para construir o fluxo

Você não escreve a automação. Abra o chat e descreva o que quer, incluindo a parte de salvar o comprador como contato:

Quando alguém abandonar o carrinho na minha loja Shopify, espere cerca de trinta minutos e ligue. Salve a pessoa primeiro como contato, com nome e número de telefone, para que o agente possa cumprimentá-la pelo nome. Ligue de +1 555 0100 usando meu agente Shopify Cart Recovery.

Diga a parte do contato em voz alta. O Octo monta um fluxo funcional sem ela, mas o agente abre com um “Olá” genérico em vez de “Olá, Sarah”, porque a saudação tira o nome do seu registro de contatos, e não da mensagem do Shopify. Pedir isso é a diferença entre uma ligação de recuperação e uma ligação a frio.

O Octo vai ler suas conexões, encontrar seu agente e pode perguntar qual segredo de assinatura usar, se você salvou mais de um. Responda com o segredo de assinatura, não com o token da API Admin.

O Octo no chat descrevendo o fluxo que construiu: a espera e a verificação de compra moram no gatilho, o comprador é salvo como contato, e então a ligação.
Um parágrafo enviado, e isto é o que volta. Note que a espera e a verificação de compra fazem parte do gatilho — não sobra nada para você lembrar de adicionar.

Depois confira que aparece como ativo. Um fluxo ainda marcado como rascunho rejeita tudo que o Shopify envia, e o registro de entregas do Shopify enche de falhas que parecem endereço errado.

Passo 4 — Dê o endereço ao Shopify

Abra o fluxo e procure o cartão Webhook endpoint acima do diagrama. Ele mostra o endereço e um status:

  • Ready — no ar, com um segredo de assinatura salvo
  • Inactive — pausado ou ainda em rascunho, então as mensagens do Shopify são rejeitadas
O cartão Webhook endpoint na aba Visão geral de um fluxo: o endereço, um selo Ready, um botão Copy e a assinatura que ele espera.
O endereço mora aqui, na aba Visão geral do fluxo. Ready significa que o fluxo está no ar e que há um segredo de assinatura salvo; qualquer outra coisa e as entregas do Shopify serão rejeitadas.

Clique em Copy. Depois, no Shopify, vá a Configurações → Notificações → Webhooks → Criar webhook e crie dois, colando o mesmo endereço nos dois:

EventoFormatoPor quê
Criação de checkoutJSONDispara quando alguém chega ao checkout
Atualização de checkoutJSONDispara quando a pessoa preenche mais dados

Por que dois, em termos simples

O Shopify avisa sobre um checkout no momento em que alguém começa um — o que é muitas vezes antes de a pessoa digitar um telefone. Ele avisa de novo a cada coisa preenchida, e uma dessas mensagens posteriores costuma ser a que carrega o número.

Assine só a primeira e você terá fluxos que começam sem ninguém para ligar. Assine as duas e você terá alguém para ligar.

O mesmo menu suspenso oferece Criação de carrinho, que soa certo e não é. Um carrinho é só uma cesta: o Shopify não tem e-mail, telefone nem nome para ele, então não há quem ligar. Use só se você quiser um sinal inofensivo de que seus webhooks estão chegando.

Crie esses webhooks no admin do Shopify, à mão, nesta página. Não os crie pela API do Shopify. Testamos os dois jeitos: os criados nesta página chegaram em uns trinta segundos; os criados pela API nunca chegaram, por mais de uma hora, e o Shopify não deu erro em nenhum caso.

Clique em Enviar teste em um deles. Algo deve aparecer na lista de execuções do seu fluxo dentro de um minuto. Esse clique é o caminho mais rápido de provar que a conexão funciona, e não custa nada.

Passo 5 — Teste em um minuto

Peça ao Octo para mudar a espera para um minuto.

Primeiro, coloque seu próprio número de telefone num registro de cliente. No Shopify: Clientes → escolha ou crie um cliente com o seu e-mail → adicione seu telefone e salve.

Faça isso antes de comprar. Digitar um número de telefone na página de checkout não basta: no checkout de uma página do Shopify não há etapa para enviá-lo antes do pagamento, então um número digitado ali pode nunca chegar ao Shopify. Perdemos uma noite com isso. O número no registro do cliente viaja com o checkout desde a primeira mensagem, e é isso que faz o teste funcionar.

Depois:

  1. Entre na sua loja como esse cliente
  2. Coloque algo no carrinho
  3. Vá ao checkout, para a página carregar
  4. Feche a aba

Seu telefone deve tocar cerca de um minuto depois o Shopify entregar a mensagem. Você não precisa digitar nada no formulário de checkout.

Depois peça ao Octo para devolver a espera aos trinta minutos. Com um minuto, o fluxo liga para pessoas que ainda estão digitando o número do cartão.

Quando nada acontece

Esta é a seção que a gente gostaria de ter tido. Percorra em ordem — cada item é algo que de fato parou um teste.

Nada chega ao fluxo

Você clicou em Instalar aplicativo? Configurar as permissões não é instalar.

Os webhooks foram criados no admin do Shopify, e não pela API? Veja acima. Este foi, de longe, o que mais nos custou tempo.

O fluxo está ativo? Um rascunho rejeita tudo.

Você acabou de criar ou editar o fluxo? Dê uns dois minutos. Um fluxo novinho responde por um instante que não está pronto enquanto é registrado, e o Shopify repete a entrega sozinho.

Confira primeiro o registro de entregas do próprio Shopify, no webhook que você criou. Se o Shopify não mostra uma entrega, o problema está do lado de lá da linha e nada no Omni Octo vai explicar.

O Shopify envia, mas o fluxo rejeita

Quase sempre é o segredo errado. Qual deles assina depende de como o webhook foi criado, e isso não é óbvio:

Webhook criado…Assinado com
À mão, na página NotificaçõesO segredo de assinatura dessa mesma página
Por um aplicativo, pela APIA chave secreta de API do próprio aplicativo

Se você seguiu este guia, você quer a primeira linha. Aponte o fluxo para a conexão do segredo de assinatura do Passo 2.

O fluxo começa, mas ninguém é chamado

Havia um número de telefone? Abra a execução e veja o que chegou. Sem número, sem ligação, por decisão de projeto.

Colocar no carrinho não basta. Um carrinho sozinho não diz nada ao Shopify. A pessoa precisa chegar à página de checkout, e o Shopify precisa ter um meio de contactá-la — pela conta em que está logada, ou pelo que ela digitar.

Digitar um número de telefone não é o mesmo que enviá-lo. No checkout de uma página do Shopify não há botão de “continuar” antes do pagamento, então um número que a pessoa digita pode nunca chegar ao Shopify. A correção confiável é a próxima.

Coloque um número de telefone no registro do cliente. No Shopify: Clientes → a pessoa → adicione o telefone dela. O número de um comprador logado viaja então com o checkout desde a primeira mensagem, e nada do resto importa. Esta foi a única mudança que fez o nosso próprio teste funcionar.

Entrar por SMS não conta. Se o Shopify mandou um código por SMS para o login, esse número pertence ao sistema de login do Shopify. Ele nunca chega ao seu registro de clientes e você não pode usá-lo.

Testando numa loja de teste ou protegida por senha

Você precisa da senha da loja para comprar na sua própria loja, em Loja virtual → Preferências → Proteção por senha.

Não confie em onlineStoreUrl como sinal de que um produto está publicado. Numa loja protegida por senha, o Shopify o reporta vazio para todo produto, publicado ou não. Perdemos tempo publicando produtos que já estavam publicados. Só abra a página do produto com a senha e veja.

O que impede uma ligação

Quatro verificações. Cada uma é um ponto onde a execução termina em silêncio e corretamente, em vez de falhar. O que você vê depois muda, então vale saber qual é qual.

A pessoa comprou. Depois da espera, perguntamos ao Shopify se já existe um pedido para aquele checkout. Se existe, a execução para. Este é todo o motivo da espera: o Shopify conta um checkout como abandonado no momento em que alguém digita um e-mail, o que com frequência é enquanto a pessoa ainda está pegando o cartão.

Não deu para saber. Se essa verificação falha — token expirado, permissão removida, problema de rede — a execução para sem ligar. Chutar para o outro lado liga para alguém que já pagou.

Essas duas acontecem antes do primeiro passo, porque a verificação faz parte do gatilho. Assim, uma execução parada assim aparece como concluída sem passos executados — nada foi salvo e nada foi discado. Hoje a tela de execuções ainda não mostra qual das duas foi; se execuções estão concluindo sem passos e você esperava ligações, confira primeiro a conexão da API Admin.

É noite para a pessoa. Os horários de ligação vêm do código de país do número, e um número que não conseguimos situar num fuso é um número para o qual não ligaremos. Para um país que atravessa vários fusos, precisa ser dia em todos.

A pessoa pediu para parar. Um registro de não ligar para aquele número bloqueia a ligação antes de discar qualquer coisa, e a execução anota a recusa em vez de falhar.

Uma execução de fluxo que salvou o comprador como contato e depois declinou discar, com o passo de ligação reportando dialed false e skipped quiet_hours.
Uma recusa, por escrito. Esta execução salvou o comprador e depois declinou ligar para ele à uma e meia da manhã — dialed: false, e o motivo escrito ao lado.

O que isto não vai fazer

Não vai criar os webhooks do Shopify para você. Você cola o endereço pessoalmente, duas vezes.

Não vai inventar um número de telefone. Sem número, sem ligação.

Trate uma ligação de recuperação como “pelo menos uma vez”, não “exatamente uma vez”. O Shopify envia uma mensagem cada vez que o comprador muda algo, e cada uma inicia sua própria execução. Essas execuções são agrupadas, então costumam produzir uma única ligação, mas um intervalo longo o suficiente entre mensagens ainda pode produzir uma segunda. Vale saber disso antes de apontar para clientes reais.

Mantenha a versão da API em dia. A conexão da API Admin registra qual versão da API do Shopify usar. O Shopify dá suporte a cada versão por cerca de um ano e depois responde em silêncio com uma mais antiga, em vez de avisar. Se já faz um ano, atualize.