Guia de Integração com Shopify

Este guia abrangente orienta você na integração do Tajo com sua loja Shopify para desbloquear capacidades poderosas de engajamento com clientes, programas de fidelidade e automação de marketing.

Visão Geral

A integração Tajo-Shopify permite que você:

  • Sincronize dados de clientes automaticamente da sua loja Shopify
  • Rastreie pedidos e produtos para marketing personalizado
  • Execute programas de fidelidade com pontos, níveis e recompensas
  • Automatize campanhas de marketing via Brevo (e-mail, SMS, WhatsApp)
  • Segmente clientes por comportamento de compra e engajamento
  • Recupere carrinhos abandonados com sequências automatizadas

Pré-requisitos

Antes de iniciar a integração, certifique-se de ter:

  • Loja Shopify em qualquer plano (Basic, Shopify, Advanced ou Plus)
  • Conta Tajo com assinatura ativa
  • Conta Brevo (opcional, para automação de marketing)
  • Acesso de administrador à sua loja Shopify

Passo 1: Instalar o App Tajo

Pela Shopify App Store

  1. Acesse a Shopify App Store
  2. Pesquise por “Tajo”
  3. Clique em Adicionar app
  4. Revise as permissões e clique em Instalar app
  5. Você será redirecionado para o assistente de configuração do Tajo

Instalação Manual

Se preferir configuração manual:

Terminal window
# Clone o app Tajo Shopify
git clone https://github.com/tajo/shopify-app.git
# Instale as dependências
cd shopify-app
npm install
# Configure o ambiente
cp .env.example .env

Configure seu arquivo .env:

SHOPIFY_API_KEY=your_api_key
SHOPIFY_API_SECRET=your_api_secret
SHOPIFY_SCOPES=read_customers,write_customers,read_orders,read_products
TAJO_API_KEY=your_tajo_api_key
BREVO_API_KEY=your_brevo_api_key

Passo 2: Configurar Sincronização de Dados

Configurações de Sincronização de Clientes

No seu painel do Tajo, configure quais dados de clientes sincronizar:

{
"sync_settings": {
"customers": {
"enabled": true,
"sync_frequency": "real-time",
"fields": [
"email",
"first_name",
"last_name",
"phone",
"accepts_marketing",
"tags",
"total_spent",
"orders_count",
"created_at",
"addresses"
]
},
"orders": {
"enabled": true,
"sync_frequency": "real-time",
"include_line_items": true,
"include_fulfillments": true
},
"products": {
"enabled": true,
"sync_frequency": "hourly",
"include_variants": true,
"include_images": true
}
}
}

Configuração de Webhooks

O Tajo registra automaticamente estes webhooks do Shopify:

WebhookFinalidade
customers/createSincronizar novos clientes com Tajo e Brevo
customers/updateManter perfis de clientes atualizados
orders/createRastrear compras, conceder pontos de fidelidade
orders/paidAcionar campanhas pós-compra
orders/fulfilledEnviar notificações de envio
carts/createRastrear dados de carrinho abandonado
carts/updateAtualizar sequências de abandono de carrinho
products/updateManter catálogo de produtos sincronizado

Importação Inicial de Dados

Para lojas existentes, importe dados históricos:

// Importar clientes existentes
async function importShopifyCustomers() {
const shopify = new Shopify({
shopName: process.env.SHOP_NAME,
apiKey: process.env.SHOPIFY_API_KEY,
password: process.env.SHOPIFY_PASSWORD
});
let customers = [];
let params = { limit: 250 };
do {
const batch = await shopify.customer.list(params);
customers = customers.concat(batch);
params = batch.nextPageParameters;
} while (params);
// Sincronizar com o Tajo
for (const customer of customers) {
await tajo.customers.upsert({
email: customer.email,
firstName: customer.first_name,
lastName: customer.last_name,
phone: customer.phone,
totalSpent: customer.total_spent,
ordersCount: customer.orders_count,
tags: customer.tags,
source: 'shopify',
externalId: customer.id
});
}
console.log(`Imported ${customers.length} customers`);
}

Passo 3: Configurar Programa de Fidelidade

Configurar Sistema de Pontos

Defina como os clientes ganham pontos:

const pointsConfig = {
// Pontos por dólar gasto
purchasePoints: {
enabled: true,
rate: 1, // 1 ponto por $1
roundingMode: 'floor'
},
// Ações de bônus
bonusPoints: {
accountCreation: 100,
firstPurchase: 200,
reviewSubmitted: 50,
referralMade: 500,
birthdayBonus: 100,
socialShare: 25
},
// Multiplicadores por nível
tierMultipliers: {
Bronze: 1.0,
Silver: 1.25,
Gold: 1.5,
Platinum: 2.0
}
};

Definir Níveis de Fidelidade

const loyaltyTiers = [
{
name: 'Bronze',
minPoints: 0,
benefits: [
'1 ponto por $1 gasto',
'Pontos bônus de aniversário',
'Promoções exclusivas para membros'
]
},
{
name: 'Silver',
minPoints: 1000,
benefits: [
'Multiplicador de 1,25x nos pontos',
'Frete grátis em pedidos acima de $50',
'Acesso antecipado a vendas'
]
},
{
name: 'Gold',
minPoints: 5000,
benefits: [
'Multiplicador de 1,5x nos pontos',
'Frete grátis em todos os pedidos',
'Acesso exclusivo a produtos',
'Suporte prioritário ao cliente'
]
},
{
name: 'Platinum',
minPoints: 15000,
benefits: [
'Multiplicador de 2x nos pontos',
'Frete expresso grátis',
'Experiências VIP',
'Assistente de compras pessoal',
'Presente anual'
]
}
];

Criar Catálogo de Recompensas

const rewards = [
{
id: 'discount_5',
name: '$5 de Desconto',
pointsCost: 500,
type: 'fixed_discount',
value: 5,
minPurchase: 25
},
{
id: 'discount_10',
name: '$10 de Desconto',
pointsCost: 900,
type: 'fixed_discount',
value: 10,
minPurchase: 50
},
{
id: 'percent_10',
name: '10% de Desconto',
pointsCost: 750,
type: 'percentage_discount',
value: 10,
maxDiscount: 50
},
{
id: 'free_shipping',
name: 'Frete Grátis',
pointsCost: 300,
type: 'free_shipping'
},
{
id: 'free_product',
name: 'Brinde',
pointsCost: 2000,
type: 'free_product',
productId: 'gid://shopify/Product/123456'
}
];

Passo 4: Recuperação de Carrinho Abandonado

Configurar Rastreamento de Carrinho

// Rastrear atualizações de carrinho
shopify.webhooks.on('carts/update', async (cart) => {
if (cart.line_items.length === 0) return;
const customer = await getCustomerByCart(cart);
if (!customer?.email) return;
await tajo.carts.track({
customerId: customer.id,
cartToken: cart.token,
items: cart.line_items.map(item => ({
productId: item.product_id,
variantId: item.variant_id,
title: item.title,
quantity: item.quantity,
price: item.price,
image: item.image
})),
totalPrice: cart.total_price,
currency: cart.currency,
checkoutUrl: cart.checkout_url
});
});

Configurar Sequência de Recuperação

{
"abandoned_cart_sequence": {
"trigger": {
"event": "cart_abandoned",
"delay": "1 hour"
},
"emails": [
{
"delay": "1 hour",
"channel": "email",
"template": "cart_reminder_1",
"subject": "Você deixou algo para trás!"
},
{
"delay": "24 hours",
"channel": "email",
"template": "cart_reminder_2",
"subject": "Seu carrinho está esperando - 10% de desconto aqui dentro"
},
{
"delay": "72 hours",
"channel": "sms",
"template": "cart_sms_final",
"message": "Última chance! Seu carrinho expira em breve. Finalize seu pedido: {{checkout_url}}"
}
],
"exit_conditions": [
"order_completed",
"cart_emptied",
"unsubscribed"
]
}
}

Passo 5: Automação de Marketing com a Brevo

Segmentos de Clientes

Crie segmentos poderosos baseados em dados do Shopify:

const shopifySegments = [
// Comportamento de compra
{
name: 'Compradores de Primeira Vez',
conditions: { orders_count: 1 }
},
{
name: 'Clientes Recorrentes',
conditions: { orders_count: { $gte: 2 } }
},
{
name: 'Clientes VIP',
conditions: { total_spent: { $gte: 500 } }
},
{
name: 'Clientes em Risco',
conditions: {
last_order_date: { $lt: '90 days ago' },
orders_count: { $gte: 2 }
}
},
// Interesse em produto
{
name: 'Categoria: Eletrônicos',
conditions: { purchased_categories: { $contains: 'Electronics' } }
},
// Engajamento
{
name: 'Carrinho Abandonado',
conditions: { has_abandoned_cart: true }
},
{
name: 'Visitantes sem Compra',
conditions: {
viewed_products: { $gte: 3 },
orders_count: 0
}
}
];

Gatilhos de Campanhas Automatizadas

// Confirmação de pedido + upsell
shopify.webhooks.on('orders/paid', async (order) => {
const customer = await tajo.customers.get(order.customer.id);
// Atualizar estatísticas do cliente
await tajo.customers.update(customer.id, {
totalSpent: customer.totalSpent + order.total_price,
ordersCount: customer.ordersCount + 1,
lastOrderDate: order.created_at
});
// Conceder pontos de fidelidade
const pointsEarned = calculatePoints(order, customer);
await tajo.loyalty.awardPoints(customer.id, pointsEarned, {
reason: 'purchase',
orderId: order.id
});
// Enviar para a Brevo para campanhas
await brevo.trackEvent(customer.email, 'order_completed', {
order_id: order.id,
order_total: order.total_price,
points_earned: pointsEarned,
loyalty_tier: customer.loyaltyTier,
products: order.line_items.map(i => i.title).join(', ')
});
});
// Campanha de solicitação de avaliação pós-compra
const reviewRequestCampaign = {
trigger: 'order_delivered',
delay: '7 days',
template: 'review_request',
conditions: {
customer_tags: { $not: { $contains: 'no-review-request' } }
}
};
// Campanha de reconquista
const winBackCampaign = {
trigger: 'customer_inactive',
conditions: {
last_order_date: '90 days ago',
orders_count: { $gte: 1 }
},
sequence: [
{ delay: '0', template: 'we_miss_you', offer: '15% de desconto' },
{ delay: '7 days', template: 'win_back_2', offer: '20% de desconto' },
{ delay: '14 days', template: 'final_offer', offer: '25% de desconto' }
]
};

Passo 6: Recomendações de Produtos

Configurar Motor de Recomendações

const recommendationConfig = {
algorithms: [
{
name: 'frequently_bought_together',
weight: 0.3
},
{
name: 'similar_products',
weight: 0.25
},
{
name: 'customer_also_viewed',
weight: 0.2
},
{
name: 'trending_in_category',
weight: 0.15
},
{
name: 'personalized_for_you',
weight: 0.1
}
],
filters: {
exclude_purchased: true,
exclude_out_of_stock: true,
min_rating: 3.5
}
};
// Obter recomendações para e-mail
async function getEmailRecommendations(customerId, limit = 4) {
const customer = await tajo.customers.get(customerId);
const recentOrders = await tajo.orders.list({
customerId,
limit: 5
});
return await tajo.recommendations.get({
customerId,
purchaseHistory: recentOrders,
browsingHistory: customer.recentlyViewed,
limit,
algorithms: recommendationConfig.algorithms
});
}

Passo 7: Analytics e Relatórios

Painel de Métricas Principais

const dashboardMetrics = {
// Métricas de clientes
customers: {
total: await tajo.analytics.count('customers'),
new_this_month: await tajo.analytics.count('customers', {
created_at: { $gte: 'this_month' }
}),
returning_rate: await tajo.analytics.returningCustomerRate()
},
// Métricas de receita
revenue: {
total: await tajo.analytics.sum('orders.total'),
average_order_value: await tajo.analytics.avg('orders.total'),
revenue_per_customer: await tajo.analytics.revenuePerCustomer()
},
// Métricas de fidelidade
loyalty: {
active_members: await tajo.analytics.count('loyalty_members', {
status: 'active'
}),
points_issued: await tajo.analytics.sum('points.awarded'),
points_redeemed: await tajo.analytics.sum('points.redeemed'),
redemption_rate: await tajo.analytics.pointsRedemptionRate()
},
// Métricas de campanha
campaigns: {
emails_sent: await brevo.analytics.emailsSent('this_month'),
open_rate: await brevo.analytics.openRate('this_month'),
click_rate: await brevo.analytics.clickRate('this_month'),
revenue_attributed: await tajo.analytics.campaignRevenue('this_month')
}
};

Solução de Problemas

Problemas Comuns

Falhas na Entrega de Webhooks

// Verificar assinatura do webhook
function verifyShopifyWebhook(req) {
const hmac = req.headers['x-shopify-hmac-sha256'];
const body = req.rawBody;
const hash = crypto
.createHmac('sha256', process.env.SHOPIFY_WEBHOOK_SECRET)
.update(body)
.digest('base64');
return crypto.timingSafeEqual(
Buffer.from(hash),
Buffer.from(hmac)
);
}

Conflitos de Sincronização

// Lidar com clientes duplicados
async function resolveCustomerConflict(shopifyCustomer, tajoCustomer) {
// Mesclar dados, preferindo as atualizações mais recentes
const merged = {
...tajoCustomer,
email: shopifyCustomer.email,
firstName: shopifyCustomer.first_name || tajoCustomer.firstName,
lastName: shopifyCustomer.last_name || tajoCustomer.lastName,
phone: shopifyCustomer.phone || tajoCustomer.phone,
// Manter dados de fidelidade do Tajo
loyaltyPoints: tajoCustomer.loyaltyPoints,
loyaltyTier: tajoCustomer.loyaltyTier
};
return await tajo.customers.update(tajoCustomer.id, merged);
}

Limitação de Taxa

// Implementar recuo exponencial
async function shopifyApiCall(fn, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
return await fn();
} catch (error) {
if (error.code === 429 && i < retries - 1) {
const delay = Math.pow(2, i) * 1000;
await new Promise(r => setTimeout(r, delay));
continue;
}
throw error;
}
}
}

Próximos Passos

  1. Configurar Integração com a Brevo para campanhas de e-mail/SMS
  2. Configurar Webhooks para eventos em tempo real
  3. Criar Segmentos de Clientes para marketing direcionado
  4. Criar Templates de E-mail para campanhas automatizadas

Suporte

Assistente AI

Olá! Pergunte-me qualquer coisa sobre a documentação.

Comece grátis com Brevo