Publicámos conectores de MRW, SEUR, Correos Express, DHL, GLS, UPS e CTT para Odoo e integrámos transportadoras em sites sem Odoo por trás, como eclipseando.com. As API mudam de nome e de formato, mas o trabalho é sempre o mesmo: quatro chamadas, três ou quatro erros que se repetem e uma decisão de arquitetura que convém tomar antes de escrever a primeira linha. Este artigo é a versão para um site próprio; se a sua loja usa Odoo, a maior parte já está resolvida nos conectores de transportadora.
Ideia-chave: a integração não termina quando sai a etiqueta. Termina quando o cliente recebe o aviso de que o seu pacote está a caminho, ou parado num ponto de recolha, sem que ninguém da sua equipa tenha copiado nada. Se desenhar apenas a etiqueta, fará o resto à mão.
Antes de programar: a adesão e o ambiente de testes
Nenhuma transportadora lhe dá acesso à sua API por preencher um formulário no site. É preciso um contrato de transporte com um comercial, e daí saem as credenciais: um código de cliente ou assinante, um utilizador e uma palavra-passe ou chave, e por vezes um código de franquia ou de agência. Peça-as desde o primeiro dia e peça também o ambiente de testes, que nem todas têm e nem todas se comportam como a produção. Algumas API continuam a ser SOAP com XML (é o caso histórico de várias transportadoras espanholas); outras são REST com JSON. Não muda o que há a fazer, muda o tempo que custa ler a documentação.
As quatro chamadas
| Chamada | O que lhe envia | O que lhe devolve | Onde falha |
|---|---|---|---|
| Criar envio | Remetente, destinatário, volumes, peso, serviço, referência da encomenda. | Número de expedição e, quase sempre, a etiqueta na mesma resposta. | Moradas por normalizar, códigos postais das Canárias ou das Baleares, telefones com espaços, caracteres fora de ASCII. |
| Etiqueta | Número de expedição e formato (PDF, ZPL, tamanho). | O ficheiro, normalmente em base64. | Pedi-la duas vezes e gerar duas expedições; imprimir em A4 o que era 10×15. |
| Seguimento | Número de expedição. | Lista de eventos com data, código e texto. | Consultar a cada minuto e ser bloqueado; não traduzir os códigos para estados próprios. |
| Manifesto / fecho | Data e expedições do dia. | Confirmação ou documento de recolha. | Esquecê-lo: a transportadora não recolhe o que não está manifestado. |
Criar o envio: metade do trabalho é limpar a morada
A chamada de criação é onde se concentram as rejeições. Cada transportadora tem a sua ideia do que é uma morada válida: comprimento máximo da rua, código postal com exatamente cinco dígitos, província como código e não como texto, telefone obrigatório e sem indicativo, e em várias nada fora de ASCII no nome. O que funciona é normalizar antes de chamar: separar rua e número, cortar os campos ao máximo que cada API admite, substituir os acentos quando a API não os aceita e validar que o código postal existe para esse país. E guardar sempre o pedido e a resposta completos, em XML ou JSON, junto da encomenda. Quando um pacote se perde três semanas depois, esse registo é a única prova do que foi enviado.
Seguimento: sondagem com cabeça, ou webhook se existir
Poucas transportadoras avisam por webhook; a maioria tem de ser consultada. A forma correta é uma ação agendada que consulta apenas as expedições abertas, com um intervalo razoável (de hora a hora costuma bastar, mais vezes no dia da entrega), que para quando o estado é final e que respeita os limites da API. Os códigos de evento traduzem-se para um conjunto pequeno de estados próprios: aceite, em trânsito, em distribuição, entregue, incidência, devolvido. Cinco ou seis, não quarenta. E cada mudança de estado dispara o aviso ao cliente, que é para o que se faz tudo isto.
Quando não tem a API porque quem envia é o seu fornecedor
É mais frequente do que parece: vende você, mas o pacote é preparado e enviado por um fornecedor com o seu próprio contrato de transporte. Não tem credenciais, não pode criar o envio nem consultar a expedição. O que quase sempre tem são os e-mails que a transportadora envia para o endereço de contacto a cada movimento. Em eclipseando.com resolvemo-lo assim com a GLS: uma tarefa lê a caixa de correio a cada dez minutos, reconhece os quatro tipos de e-mail (a caminho, em distribuição, em ponto de recolha com data limite, destinatário ausente), extrai o número de expedição e a encomenda a que pertence, e converte cada um num estado e num aviso ao comprador. Os dois últimos são os urgentes: um pacote num ponto de recolha volta ao remetente se ninguém o for buscar, e um cliente que não sabe que está lá não vai.

Os erros que vemos em produção
- Testar apenas contra a sandbox. Várias transportadoras têm um ambiente de testes que aceita o que a produção rejeita. O teste que vale é um envio real para o seu próprio escritório.
- Criar o envio ao confirmar a encomenda no site. Cria-se ao preparar o pacote. Se se criar antes, cada cancelamento é uma expedição fantasma que por vezes é faturada.
- Não guardar o pedido e a resposta. Sem o XML ou JSON completos junto da encomenda, uma reclamação é a sua palavra contra a da transportadora.
- Um único número de seguimento por encomenda. Funciona até à primeira encomenda com dois volumes ou dois fornecedores. O seguimento modela-se por envio.
- Certificados e cifragem antigos. Algumas API continuam em TLS com cifras que as bibliotecas modernas rejeitam por defeito. Deteta-se no primeiro dia, não no da entrada em produção.
Com Odoo por trás, quase nada disto se programa
Se a loja usa Odoo, as quatro chamadas já estão escritas nos conectores que publicamos na App Store de Odoo, testados em Odoo 19, 18 e 17 sobre Odoo.sh real: a etiqueta sai ao validar a guia de remessa, o seguimento é consultado por ação agendada e escrito na guia, o manifesto fecha-se a partir do próprio Odoo e o aviso ao cliente sai por e-mail ou SMS com o modelo que quiser. O site só tem de ler o estado da guia. Por isso, quando alguém nos pede para integrar uma transportadora num site e já tem Odoo, a resposta costuma ser ligar o site ao ERP, não voltar a escrever a integração.
Perguntas frequentes
Quanto tempo demora a integrar uma transportadora?
Depende sobretudo de duas coisas que não controla: quanto tempo a transportadora demora a dar-lhe credenciais e ambiente de testes, e se a sua API é REST com documentação atual ou SOAP com um PDF de há anos. As quatro chamadas em si são trabalho delimitado; o que o alonga são as esperas e os testes com envios reais.
É possível integrar várias transportadoras ao mesmo tempo?
Sim, e convém desenhá-lo assim desde o início: uma camada própria com as quatro operações (criar, etiqueta, seguimento, manifesto) e um adaptador por transportadora por baixo. Acrescentar a segunda custa uma fração da primeira se a primeira foi feita com essa separação.
E se o meu fornecedor envia com a sua transportadora e eu não tenho acesso?
Trabalha-se com o que chega: os e-mails da transportadora ou os ficheiros que o fornecedor devolver. Lê-los automaticamente e convertê-los em estados e avisos não é tão limpo como uma API, mas elimina a cópia manual e, sobretudo, evita que um cliente não saiba que o seu pacote está à espera num ponto de recolha.
Ligações úteis dentro da FlexigoTech
O que fazemos sobre isto
Tem de ligar uma transportadora e não sabe por onde começar?
Diga-nos qual é, se já tem credenciais e se há Odoo por trás. Dizemos-lhe o que se programa, o que já existe e o que tem de pedir à transportadora antes de começar. Escreva para comercial@flexigobe.com ou ligue para +34 616 809 504.

