Pular para conteúdo

SHOPIFY PRODUCT UPDATE - Atualizar Produto do Shopify

O que é este Node?

O SHOPIFY PRODUCT UPDATE é o node responsável por atualizar informações de produtos existentes no Shopify, como título, descrição, preço, estoque e status.

Por que este Node existe?

Manter produtos atualizados é essencial para e-commerce. O SHOPIFY PRODUCT UPDATE existe para:

  1. Atualizar preços: Aplicar promoções e ajustes de preço automaticamente
  2. Controlar estoque: Sincronizar quantidade disponível com sistemas externos
  3. Modificar status: Ativar, desativar ou arquivar produtos
  4. Atualizar descrições: Corrigir ou melhorar informações do produto
  5. Gerenciar variantes: Adicionar ou modificar opções de tamanho/cor

Como funciona internamente?

Quando o SHOPIFY PRODUCT UPDATE é executado, o sistema:

  1. Valida credenciais e productId
  2. Prepara dados para atualização (apenas campos enviados serão alterados)
  3. Envia requisição PUT para /admin/api/{version}/products/{productId}.json
  4. Recebe produto atualizado como resposta
  5. Salva resultado na variável especificada
  6. Continua flow para próximo node

Código interno (shopify.executor.ts:39-44):

case 'update': {
  const productId = this.replaceVariables(node.data.productId, context.variables);
  const product = JSON.parse(this.replaceVariables(JSON.stringify(node.data.product), context.variables));
  const response = await axios.put(`${baseUrl}/products/${productId}.json`, { product }, { headers });
  result = response.data;
  break;
}

Quando você DEVE usar este Node?

Use SHOPIFY PRODUCT UPDATE quando precisar modificar produtos existentes:

Casos de uso:

  1. Aplicar desconto: "Reduzir preço de produto em promoção"
  2. Atualizar estoque: "Sincronizar estoque após venda ou reposição"
  3. Mudar status: "Desativar produto esgotado"
  4. Corrigir informações: "Atualizar descrição ou título do produto"
  5. Gerenciar promoções: "Ativar/desativar produtos sazonais"

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)
productId string/number Sim ID do produto a atualizar
product object Sim Campos a atualizar (apenas os enviados)
responseVariable string Não Nome da variável (padrão: shopifyResult)

Exemplo 1: Aplicar Desconto em Produto

Objetivo: Reduzir preço de produto específico aplicando desconto.

JSON para Importar

{
  "name": "Shopify - Aplicar Desconto",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "ID do Produto",
        "parameters": {
          "message": "Digite o ID do produto para aplicar desconto:",
          "variable": "productId"
        }
      }
    },
    {
      "id": "shopify_1",
      "type": "shopify",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Produto",
        "operation": "get",
        "resource": "products",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "productId": "{{productId}}",
        "responseVariable": "currentProduct"
      }
    },
    {
      "id": "number_1",
      "type": "number",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Porcentagem",
        "parameters": {
          "message": "Produto: {{currentProduct.product.title}}\nPreço atual: R$ {{currentProduct.product.variants[0].price}}\n\nDigite % de desconto (ex: 20):",
          "variable": "discountPercent",
          "min": 1,
          "max": 99,
          "decimals": 0
        }
      }
    },
    {
      "id": "calculator_1",
      "type": "calculator",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Calcular Novo Preço",
        "parameters": {
          "expression": "{{currentProduct.product.variants[0].price}} * (1 - {{discountPercent}} / 100)",
          "variable": "newPrice"
        }
      }
    },
    {
      "id": "shopify_2",
      "type": "shopify",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Atualizar Preço",
        "operation": "update",
        "resource": "products",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "productId": "{{productId}}",
        "product": {
          "variants": [
            {
              "id": "{{currentProduct.product.variants[0].id}}",
              "price": "{{newPrice}}"
            }
          ]
        },
        "responseVariable": "updatedProduct"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "message": "Desconto aplicado com sucesso!\n\n📦 Produto: {{currentProduct.product.title}}\n💰 Preço anterior: R$ {{currentProduct.product.variants[0].price}}\n🎁 Desconto: {{discountPercent}}%\n✅ Novo preço: R$ {{newPrice}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "shopify_1" },
    { "source": "shopify_1", "target": "number_1" },
    { "source": "number_1", "target": "calculator_1" },
    { "source": "calculator_1", "target": "shopify_2" },
    { "source": "shopify_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite o ID do produto para aplicar desconto:
Usuário: 8234567890123
Sistema: Produto: Camiseta Básica Preta
Preço atual: R$ 49.90

Digite % de desconto (ex: 20):
Usuário: 20
Sistema: Desconto aplicado com sucesso!

📦 Produto: Camiseta Básica Preta
💰 Preço anterior: R$ 49.90
🎁 Desconto: 20%
✅ Novo preço: R$ 39.92

Exemplo 2: Atualizar Estoque após Venda

Objetivo: Reduzir estoque de produto após venda confirmada.

JSON para Importar

{
  "name": "Shopify - Atualizar Estoque",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Dados da Venda",
        "parameters": {
          "assignments": [
            { "variable": "productId", "value": "8234567890123" },
            { "variable": "quantitySold", "value": "3" }
          ]
        }
      }
    },
    {
      "id": "shopify_1",
      "type": "shopify",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Estoque Atual",
        "operation": "get",
        "resource": "products",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "productId": "{{productId}}",
        "responseVariable": "product"
      }
    },
    {
      "id": "calculator_1",
      "type": "calculator",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Novo Estoque",
        "parameters": {
          "expression": "{{product.product.variants[0].inventory_quantity}} - {{quantitySold}}",
          "variable": "newStock"
        }
      }
    },
    {
      "id": "shopify_2",
      "type": "shopify",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Atualizar Estoque",
        "operation": "update",
        "resource": "products",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "productId": "{{productId}}",
        "product": {
          "variants": [
            {
              "id": "{{product.product.variants[0].id}}",
              "inventory_quantity": "{{newStock}}"
            }
          ]
        },
        "responseVariable": "updated"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "message": "Estoque atualizado!\n\n📦 Produto: {{product.product.title}}\n📊 Estoque anterior: {{product.product.variants[0].inventory_quantity}}\n🛒 Quantidade vendida: {{quantitySold}}\n✅ Novo estoque: {{newStock}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "shopify_1" },
    { "source": "shopify_1", "target": "calculator_1" },
    { "source": "calculator_1", "target": "shopify_2" },
    { "source": "shopify_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Estoque atualizado!

📦 Produto: Camiseta Básica Preta
📊 Estoque anterior: 50
🛒 Quantidade vendida: 3
✅ Novo estoque: 47

Exemplo 3: Alterar Status do Produto

Objetivo: Desativar produtos esgotados automaticamente.

JSON para Importar

{
  "name": "Shopify - Desativar Produto Esgotado",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "ID do Produto",
        "parameters": {
          "message": "Digite o ID do produto:",
          "variable": "productId"
        }
      }
    },
    {
      "id": "shopify_1",
      "type": "shopify",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Produto",
        "operation": "get",
        "resource": "products",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "productId": "{{productId}}",
        "responseVariable": "product"
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Estoque Zero?",
        "parameters": {
          "conditions": [
            {
              "variable": "product.product.variants[0].inventory_quantity",
              "operator": "<=",
              "value": "0"
            }
          ],
          "operator": "AND"
        }
      }
    },
    {
      "id": "shopify_2",
      "type": "shopify",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Desativar",
        "operation": "update",
        "resource": "products",
        "config": {
          "shopName": "minhaloja",
          "accessToken": "shpat_xxxxxxxxxxxxx",
          "apiVersion": "2025-01"
        },
        "productId": "{{productId}}",
        "product": {
          "status": "draft"
        },
        "responseVariable": "deactivated"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 1100, "y": 50 },
      "data": {
        "label": "Desativado",
        "parameters": {
          "message": "Produto desativado por falta de estoque!\n\n📦 {{product.product.title}}\n📊 Estoque: 0\n❌ Status: Desativado"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Tem Estoque",
        "parameters": {
          "message": "Produto tem estoque disponível!\n\n📦 {{product.product.title}}\n📊 Estoque: {{product.product.variants[0].inventory_quantity}}\n✅ Status: Ativo"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "shopify_1" },
    { "source": "shopify_1", "target": "condition_1" },
    { "source": "condition_1", "target": "shopify_2", "label": "true" },
    { "source": "condition_1", "target": "message_2", "label": "false" },
    { "source": "shopify_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada (sem estoque):

Sistema: Digite o ID do produto:
Usuário: 8234567890123
Sistema: Produto desativado por falta de estoque!

📦 Camiseta Básica Preta
📊 Estoque: 0
❌ Status: Desativado

Resposta do Node

{
  "product": {
    "id": 8234567890123,
    "title": "Camiseta Básica Preta",
    "body_html": "<p>Camiseta 100% algodão, confortável e durável.</p>",
    "vendor": "Minha Marca",
    "product_type": "Roupas",
    "created_at": "2025-01-15T10:30:00-03:00",
    "updated_at": "2025-01-15T11:45:00-03:00",
    "published_at": "2025-01-15T10:30:00-03:00",
    "status": "active",
    "tags": "camiseta, algodão, básica",
    "variants": [
      {
        "id": 44567890123456,
        "product_id": 8234567890123,
        "title": "Default Title",
        "price": "39.92",
        "sku": "CAM-BASIC-P",
        "position": 1,
        "inventory_quantity": 47,
        "updated_at": "2025-01-15T11:45:00-03:00"
      }
    ]
  }
}

Boas Práticas

SIM: - Sempre busque o produto antes de atualizar para ter dados atuais - Atualize apenas campos necessários (não envie objeto completo) - Valide dados antes de enviar (preço > 0, estoque >= 0) - Use variantes[0].id ao atualizar variantes específicas - Registre histórico de alterações em seu sistema

NÃO: - Não atualize sem validar se produto existe - Não envie preços negativos ou zerados sem intencionalidade - Não esqueça de atualizar estoque após vendas - Não faça atualizações em massa sem rate limiting - Não ignore erros de atualização

Dicas

Dica 1 - Atualização Parcial: Envie apenas os campos que deseja alterar - campos não enviados permanecem inalterados.

Dica 2 - Variantes: Para atualizar variante específica, inclua o id da variante no objeto variants.

Dica 3 - Status: Valores possíveis: active (ativo), draft (rascunho), archived (arquivado).

Dica 4 - Estoque: Use inventory_quantity para estoque absoluto. Para ajustes incrementais, use Inventory API.

Dica 5 - Tags: Tags são string separada por vírgula: "camiseta, algodão, promoção".

Dica 6 - Validação: Sempre valide resultado após atualização verificando campos atualizados.

Próximo Node

SHOPIFY PRODUCT GET - Buscar produto → SHOPIFY PRODUCT CREATE - Criar novo produto → SHOPIFY PRODUCT DELETE - Deletar produto