Pular para conteúdo

SHOPIFY ORDER LIST - Listar Pedidos do Shopify

O que é este Node?

O SHOPIFY ORDER LIST é o node responsável por listar múltiplos pedidos da loja Shopify, retornando array com informações de pedidos filtrados por status.

Por que este Node existe?

Consultar lista de pedidos é essencial para gestão. O SHOPIFY ORDER LIST existe para:

  1. Relatórios: Gerar relatórios de vendas por período
  2. Gestão: Listar pedidos pendentes de envio
  3. Atendimento: Buscar pedidos de cliente específico
  4. Integração: Sincronizar pedidos com ERP/logística
  5. Análise: Monitorar performance de vendas

Como funciona internamente?

Quando o SHOPIFY ORDER LIST é executado, o sistema:

  1. Valida credenciais (shopName e accessToken)
  2. Monta query com filtros (status, limit)
  3. Envia requisição GET para /admin/api/{version}/orders.json
  4. Recebe array de pedidos
  5. Salva resultado na variável especificada
  6. Continua flow para próximo node

Código interno (shopify.executor.ts:66-70):

case 'list': {
  const status = node.data.status || 'any';
  const response = await axios.get(`${baseUrl}/orders.json?status=${status}&limit=${node.data.limit || 50}`, { headers });
  result = response.data;
  break;
}

Quando você DEVE usar este Node?

Use SHOPIFY ORDER LIST quando precisar consultar múltiplos pedidos:

Casos de uso:

  1. Pedidos pendentes: "Listar pedidos aguardando envio"
  2. Relatório de vendas: "Vendas do dia/mês"
  3. Busca de cliente: "Todos os pedidos de cliente X"
  4. Integração: "Sincronizar pedidos com sistema de entrega"
  5. Análise: "Pedidos cancelados no último mês"

Quando NÃO usar:

Parâmetros

Campo Tipo Obrigatório Descrição
config.shopName string Sim Nome da loja (sem .myshopify.com)
config.accessToken string Sim Token de acesso da API
config.apiVersion string Não Versão da API (padrão: 2025-01)
status string Não Status dos pedidos (any/open/closed/cancelled)
limit number Não Quantidade (padrão: 50, máx: 250)
responseVariable string Não Nome da variável (padrão: shopifyResult)

Status de Pedidos

Status Descrição
any Todos os pedidos (padrão)
open Pedidos abertos (não enviados/cancelados)
closed Pedidos fechados (entregues)
cancelled Pedidos cancelados

Exemplo 1: Listar Pedidos Pendentes de Envio

Objetivo: Exibir pedidos pagos aguardando envio.

JSON para Importar

{
  "name": "Shopify - Pedidos Pendentes",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "shopify_1",
      "type": "shopify",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Listar Pedidos",
        "operation": "list",
        "resource": "orders",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "status": "open",
        "limit": 50,
        "responseVariable": "orders"
      }
    },
    {
      "id": "loop_1",
      "type": "loop",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Loop Pedidos",
        "parameters": {
          "items": "{{orders.orders}}",
          "itemVariable": "order",
          "indexVariable": "i"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Pago e Não Enviado?",
        "parameters": {
          "conditions": [
            {
              "variable": "order.financial_status",
              "operator": "==",
              "value": "paid"
            },
            {
              "variable": "order.fulfillment_status",
              "operator": "==",
              "value": "null"
            }
          ],
          "operator": "AND"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Pedido Pendente",
        "parameters": {
          "message": "⚠️ PENDENTE DE ENVIO\n\nPedido #{{order.order_number}}\nCliente: {{order.customer.first_name}}\nValor: R$ {{order.total_price}}\nData: {{order.created_at}}"
        }
      }
    },
    {
      "id": "merge_1",
      "type": "merge",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Próximo" }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Resumo",
        "parameters": {
          "message": "✅ Análise concluída!\n\nTotal de pedidos abertos: {{orders.orders.length}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "shopify_1" },
    { "source": "shopify_1", "target": "loop_1" },
    { "source": "loop_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_1", "label": "true" },
    { "source": "condition_1", "target": "merge_1", "label": "false" },
    { "source": "message_1", "target": "merge_1" },
    { "source": "merge_1", "target": "loop_1", "label": "next" },
    { "source": "loop_1", "target": "message_2", "label": "done" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: ⚠️ PENDENTE DE ENVIO

Pedido #1234
Cliente: João
Valor: R$ 349.80
Data: 2025-01-10T14:30:00-03:00

Sistema: ⚠️ PENDENTE DE ENVIO

Pedido #1235
Cliente: Maria
Valor: R$ 199.90
Data: 2025-01-10T15:20:00-03:00

Sistema: ✅ Análise concluída!

Total de pedidos abertos: 15

Exemplo 2: Relatório de Vendas do Dia

Objetivo: Gerar relatório com total de vendas e quantidade de pedidos.

JSON para Importar

{
  "name": "Shopify - Vendas do Dia",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "shopify_1",
      "type": "shopify",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Listar Pedidos",
        "operation": "list",
        "resource": "orders",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "status": "any",
        "limit": 250,
        "responseVariable": "allOrders"
      }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Inicializar Contadores",
        "parameters": {
          "assignments": [
            { "variable": "totalSales", "value": "0" },
            { "variable": "orderCount", "value": "0" }
          ]
        }
      }
    },
    {
      "id": "loop_1",
      "type": "loop",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Loop Pedidos",
        "parameters": {
          "items": "{{allOrders.orders}}",
          "itemVariable": "order",
          "indexVariable": "i"
        }
      }
    },
    {
      "id": "calculator_1",
      "type": "calculator",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Somar Vendas",
        "parameters": {
          "expression": "{{totalSales}} + {{order.total_price}}",
          "variable": "totalSales"
        }
      }
    },
    {
      "id": "accumulator_1",
      "type": "accumulator",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Contar Pedidos",
        "parameters": {
          "variable": "orderCount",
          "operation": "increment",
          "value": "1"
        }
      }
    },
    {
      "id": "merge_1",
      "type": "merge",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Próximo" }
    },
    {
      "id": "calculator_2",
      "type": "calculator",
      "position": { "x": 1500, "y": 100 },
      "data": {
        "label": "Ticket Médio",
        "parameters": {
          "expression": "{{totalSales}} / {{orderCount}}",
          "variable": "avgTicket"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 1700, "y": 100 },
      "data": {
        "label": "Relatório",
        "parameters": {
          "message": "📊 RELATÓRIO DE VENDAS\n\n🛍️ Pedidos: {{orderCount}}\n💰 Faturamento: R$ {{totalSales}}\n📈 Ticket Médio: R$ {{avgTicket}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "shopify_1" },
    { "source": "shopify_1", "target": "variable_1" },
    { "source": "variable_1", "target": "loop_1" },
    { "source": "loop_1", "target": "calculator_1" },
    { "source": "calculator_1", "target": "accumulator_1" },
    { "source": "accumulator_1", "target": "merge_1" },
    { "source": "merge_1", "target": "loop_1", "label": "next" },
    { "source": "loop_1", "target": "calculator_2", "label": "done" },
    { "source": "calculator_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 📊 RELATÓRIO DE VENDAS

🛍️ Pedidos: 45
💰 Faturamento: R$ 15.789,50
📈 Ticket Médio: R$ 350,88

Resposta do Node

{
  "orders": [
    {
      "id": 5234567890123,
      "order_number": 1234,
      "email": "joao@example.com",
      "created_at": "2025-01-10T14:30:00-03:00",
      "total_price": "349.80",
      "financial_status": "paid",
      "fulfillment_status": null,
      "customer": {
        "first_name": "João",
        "last_name": "Silva"
      }
    },
    {
      "id": 5234567890456,
      "order_number": 1235,
      "email": "maria@example.com",
      "created_at": "2025-01-10T15:20:00-03:00",
      "total_price": "199.90",
      "financial_status": "paid",
      "fulfillment_status": "fulfilled",
      "customer": {
        "first_name": "Maria",
        "last_name": "Santos"
      }
    }
  ]
}

Boas Práticas

SIM: - Use status apropriado para filtrar pedidos relevantes - Implemente paginação para listas grandes (> 250) - Use loops para processar todos os pedidos - Filtre por financial_status e fulfillment_status quando necessário - Cache resultados para relatórios que não mudam frequentemente

NÃO: - Não solicite mais pedidos que necessário (use limit) - Não assuma que todos terão fulfillment_status - Não ignore tratamento de lista vazia - Não faça múltiplas requisições desnecessárias

Dicas

Dica 1 - Filtros: Use status=open para pedidos ativos, closed para finalizados.

Dica 2 - Limit: Máximo 250 pedidos por requisição - use paginação para mais.

Dica 3 - Ordenação: Pedidos vêm ordenados por data de criação (mais recente primeiro).

Dica 4 - Performance: Para análises pesadas, considere executar em horários de baixo movimento.

Dica 5 - Campos: Resposta vem com campos principais - use GET para detalhes completos.

Próximo Node

SHOPIFY ORDER GET - Buscar pedido específico → SHOPIFY ORDER CANCEL - Cancelar pedido → SHOPIFY ORDER FULFILL - Marcar como enviado