Variáveis no Shopify Flow
As variáveis são marcadores de posição substituídos por valores quando um fluxo de trabalho é executado e descrevem os atributos de clientes, pedidos e produtos envolvidos. Por exemplo, há variáveis de modelo para número do pedido, preço do pedido, nome do cliente e assim por diante.
O Flow usa outra versão do Liquid, diferente dos temas da Shopify, além de ter acesso a todas as variáveis disponibilizadas na API GraphQL Admin.
Os nomes da maioria das variáveis são autodescritivos. Por exemplo, a variável que exibe o nome do produto é {{ product.title }}
. Vale lembrar que, após o envio da mensagem, a variável é substituída pelo nome do produto pedido: Large Coffee Mug
.
Adicionar variáveis às ações
É possível incluir variáveis em campos de texto que contenham o link Add variable ("Adicionar variável"). Clique nesse link, logo abaixo do campo relevante, e escolha uma opção da lista.
As variáveis na lista Add variable ("Adicionar variável") são filtradas, portanto você verá apenas aquelas aplicáveis ao acionador selecionado. Depois que você escolher uma variável, ela será formatada corretamente e adicionada à caixa de texto.
O Flow é compatível com quase todos os campos da API Admin GraphQL.
Variáveis do Liquid
Pessoas com experiência em desenvolvimento no código Liquid podem usá-lo para escrever variáveis ou editar aquelas inseridas pelo link Adicionar variável. Para saber mais, consulte a Referência da API GraphQL Admin.
Tags condicionais e de iteração
Adicione manualmente tags de variáveis do Liquid às mensagens do fluxo de trabalho. É bom usá-las para incluir mais informações nas mensagens.
Por exemplo, você pode usar um objeto for loop
para iteração por meio de uma lista de objetos, como itens de linha, em um pedido. Com essas tags, você pode criar mensagens que contenham dados, como o título do produto, SKU, preço e quantidade para cada item de linha em um pedido, e poupar seus destinatários de terem que procurar essas informações no admin da Shopify.
O Flow é compatível com estas tags condicionais do Liquid (ou de controle de fluxo):
- if
- unless
- elsif/else
- case/when
- e/ou (várias condições)
O Flow também é compatível com estas tags de iteração do Liquid:
Filtros
O Flow é compatível com os seguintes filtros do Liquid:
Nome do filtro | Tipo de filtro |
---|---|
abs | Math |
append | String |
at_least | Math |
at_most | Math |
capitalize | String |
ceil | Math |
concat | Array |
date | Adicional |
padrão | Adicional |
divided_by | Math |
downcase | String |
escape | String |
primeiro | Array |
floor | Math |
join | Array |
last | Array |
lstrip | String |
map | Array |
minus | Math |
modulo | Math |
newline_to_br | String |
plus | Math |
prepend | String |
remover | String |
remove_first | String |
replace | String |
replace_first | String | reverse | Array |
round | Math |
rstrip | String |
tamanho | Array |
slice | String |
organizar | Array |
split | String |
strip | String |
strip_html | String |
strip_newlines | String |
times | Math |
truncate | String |
truncatewords | String |
uniq | Array |
upcase | String |
url_encode | String |
onde | Array |
Exemplos de variáveis
Por exemplo, digamos que você queira criar um fluxo de trabalho para enviar um e-mail a um funcionário quando um cliente gastar mais de R$ 500 em um pedido. Para isso, crie um fluxo com o acionador Order created ("Pedido criado"), defina uma condição que seja verdadeira se o total do pedido for superior a R$ 500 e use a ação Send internal email ("Enviar e-mail interno"). A seção Message ("Mensagem") dessa ação permite o uso das variáveis abaixo.
Entrada | Saída |
---|---|
Envie uma nota pessoal de agradecimento a {{ order.customer.firstName }} {{ order.customer.lastName }}({{ order.customer.email }}) pelo pedido de R$ {{ order.totalPriceSet.shopMoney.amount }} realizado. | Envie uma nota pessoal de agradecimento a Jane Oliveira (jane@exemplo.com.br) pelo pedido de R$ 763,42 realizado. |
Você decide que precisa informar um membro da equipe quando o estoque de produtos estiver baixo e for necessário fazer um pedido para reabastecê-lo. Para isso, crie um fluxo de trabalho que inicie com o acionador Inventory quantity changed ("Volume de estoque alterado") e defina uma condição que seja verdadeira se o volume anterior for menor ou igual a 10. Na seção Message ("Mensagem") da ação Send internal email ("Enviar e-mail interno"), use as variáveis abaixo.
Entrada | Saída |
---|---|
Por favor, renove o estoque de {{ product.title }}. Envie um e-mail para titular@loja.com.br para confirmar se o pedido de compra foi recebido. | Por favor, renove o estoque de Leggings cintura alta - preto. Envie um e-mail para titular@loja.com.br para confirmar se o pedido de compra foi recebido. |
Você quer cancelar pedidos que tenham um nível de risco alto, mas prefere que a equipe faça o cancelamento manual. Para isso, crie um fluxo de trabalho que inicie com o acionador Order created ("Pedido criado") e defina uma condição que seja verdadeira se o nível de risco do pedido for igual a "High" ("Alto"). Na seção Message ("Mensagem") da ação Send internal email ("Enviar e-mail interno"), use as variáveis abaixo.
Entrada | Saída |
---|---|
Nossa loja da Shopify recebeu um pedido com alto risco de fraude. Queremos cancelá-lo imediatamente, antes que ele seja enviado para produção: {{ order.name }} {{ order.billingAddress.lastName }}, {{ order.billingAddress.firstName }} {{ order.email }} Por favor, confirme o novo status do pedido. Obrigado! |
Nossa loja da Shopify recebeu um pedido com risco alto de fraude. Queremos cancelá-lo imediatamente, antes que ele seja enviado para produção: nº 1001 Oliveira, Joana joana@exemplo.com.br Por favor, confirme o novo status do pedido. Obrigado! |
Exemplos de loops for
Quando um pedido é recebido, pode ser útil enviar uma mensagem que contenha os produtos solicitados. Para isso, use for loop
, que executa repetidamente um bloco de código. Os campos de texto compatíveis com variáveis também aceitam for loops e o objeto forloop.
Por exemplo, digamos que você queira criar um fluxo de trabalho que retorne uma lista de todas as SKUs e quantidades de um pedido. Na seção Message ("Mensagem") da ação Send internal email ("Enviar e-mail interno"), use as variáveis abaixo.
Entrada | Saída |
---|---|
Resumo do pedido: {% for a in order.lineItems %} SKU: {{a.sku}} ( {{a.quantity}} ), {% endfor %} |
Resumo do pedido: 8987097979 (50) 8877778887 (3) 888998888B (1) |
Você decide adicionar mais dados ao e-mail, incluindo nome do produto, SKUs, preço por item e informações de frete do cliente. Na seção Message ("Mensagem") da ação Send internal email ("Enviar e-mail interno"), use as variáveis abaixo.
Entrada | Saída |
---|---|
Resumo do pedido: {% for a in order.lineItems %} Produto: {{a.title}} SKU: {{a.sku}} Preço (por unidade): R$ {{a.originalUnitPriceSet.shopMoney.amount}} Quantidade: {{a.quantity}} {% endfor %} |
Resumo do pedido: Produto: Leggings de cintura alta - preto SKU: 8987097979 Preço (por unidade): R$ 8,49 Quantidade: 5 Produto: Meias esportivas - azul SKU: 88898898B Preço (por unidade): R$ 5,61 Quantidade: 2 |
Você precisa rastrear os itens vendidos que são fornecidos por um fabricante específico. Na seção Message ("Mensagem") da ação Send internal email ("Enviar e-mail interno"), use as variáveis abaixo e inclua uma instrução if
em for loop
.
Entrada | Saída |
---|---|
Produto Acme vendido: {% for x in order.lineItems %} {% if x.vendor == 'acme-vendor' %} Nome do produto: {{x.title}} SKU: {{x.sku}} {% endif %} {% endfor %} |
Produto Acme vendido: Nome do produto: Leggings de cintura alta - preto SKU: 8987097979 |
Objetos de dados complexos no Shopify Flow
O Shopify Flow não é compatível com a saída de matrizes e objetos pelos seguintes motivos:
- A saída de dados desnecessários está obsoleta para a API GraphQL e cria consultas extensas que causam falha no fluxo de trabalho.
- Com a introdução de novos recursos, novos campos da API são adicionados, o que pode quebrar seu fluxo de trabalho.
O fluxo de trabalho falha quando muitos dados são enviados automaticamente. Em vez de chamar matrizes e objetos diretamente, repita matrizes e inclua apenas os campos desejados.
Por exemplo, em vez de chamar diretamente {{ order.lineItems }}
, use o formato a seguir para chamar campos específicos. Esses exemplos incluem todos os campos que seriam incluídos ao chamar a matriz ou o objeto diretamente. Copie e cole os campos necessários.
{% for li in order.lineItems %}
{% comment %}li.contract - omitted{% endcomment %}
{% for ca in li.customAttributes %}
{{ ca.key }}
{{ ca.value }}
{% endfor %}
{% for da in li.discountAllocations %}
{{ da.allocatedAmountSet.presentmentMoney.amount }}
{{ da.allocatedAmountSet.presentmentMoney.currencyCode }}
{{ da.allocatedAmountSet.shopMoney.amount }}
{{ da.allocatedAmountSet.shopMoney.currencyCode }}
{% endfor %}
{{ li.discountedTotalSet.presentmentMoney.amount }}
{{ li.discountedTotalSet.presentmentMoney.currencyCode }}
{{ li.discountedTotalSet.shopMoney.amount }}
{{ li.discountedTotalSet.shopMoney.currencyCode }}
{{ li.discountedUnitPriceSet.presentmentMoney.amount }}
{{ li.discountedUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.discountedUnitPriceSet.shopMoney.amount }}
{{ li.discountedUnitPriceSet.shopMoney.currencyCode }}
{% comment %}li.duties - omitted {% endcomment %}
{{ li.fulfillableQuantity }}
{{ li.fulfillmentService.callbackUrl }}
{{ li.fulfillmentService.fulfillmentOrdersOptIn }}
{{ li.fulfillmentService.handle }}
{{ li.fulfillmentService.id }}
{{ li.fulfillmentService.inventoryManagement }}
{% comment %}rest of location omitted{% endcomment %}
{{ li.fulfillmentService.location.name }}
{{ li.fulfillmentService.productBased }}
{{ li.fulfillmentService.serviceName }}
{% for sm in li.fulfillmentService.shippingMethods %}
{{ sm.code }}
{{ sm.label }}
{% endfor %}
{{ li.fulfillmentService.type }}
{{ li.fulfillmentStatus }}
{{ li.id }}
{{ li.image.altText }}
{{ li.image.height }}
{{ li.image.id }}
{% comment %}li.image.metafield omitted{% endcomment %}
{% comment %}li.image.privateMetafield omitted{% endcomment %}
{{ li.image.width }}
{{ li.merchantEditable }}
{{ li.name }}
{{ li.nonFulfillableQuantity }}
{{ li.originalTotalSet.presentmentMoney.amount }}
{{ li.originalTotalSet.presentmentMoney.currencyCode }}
{{ li.originalTotalSet.shopMoney.amount }}
{{ li.originalTotalSet.shopMoney.currencyCode }}
{{ li.originalUnitPriceSet.presentmentMoney.amount }}
{{ li.originalUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.originalUnitPriceSet.shopMoney.amount }}
{{ li.originalUnitPriceSet.shopMoney.currencyCode }}
{% comment %}rest of product omitted{% endcomment %}
{{ li.product.title }}
{{ li.quantity }}
{{ li.refundableQuantity }}
{{ li.requiresShipping }}
{{ li.restockable }}
{{ li.sellingPlan.name }}
{{ li.sku }}
{% for tl in li.taxLines %}
{{ tl.priceSet.presentmentMoney.amount | json }}
{{ tl.priceSet.presentmentMoney.currencyCode | json }}
{{ tl.priceSet.shopMoney.amount | json }}
{{ tl.priceSet.shopMoney.currencyCode | json }}
{{ tl.rate | json }}
{{ tl.ratePercentage | json }}
{{ tl.title | json }}
{% endfor %}
{{ li.taxable }}
{{ li.title }}
{{ li.totalDiscountSet.presentmentMoney.amount }}
{{ li.totalDiscountSet.presentmentMoney.currencyCode }}
{{ li.totalDiscountSet.shopMoney.amount }}
{{ li.totalDiscountSet.shopMoney.currencyCode }}
{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode }}
{{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode }}
{{ li.unfulfilledQuantity }}
{% comment %}rest of variant omitted{% endcomment %}
{{ li.variant.title }}
{{ li.variantTitle }}
{{ li.vendor }}
{% endfor %}
{
"lineItems": [
{% for li in order.lineItems %}
{% if forloop.first != true %},{% endif %}
{
"contract": {
{% comment %}rest of contract omitted{% endcomment %}
"id": {{ li.contract.id | json }}
},
"customAttributes": [
{% for ca in li.customAttributes %}
{% if forloop.first != true %},{% endif %}
{
"key":{{ ca.key | json }},
"value":{{ ca.value | json }}
}
{% endfor %}
],
"discountAllocations": [
{% for da in li.discountAllocations %}
{% if forloop.first != true %},{% endif %}
"allocatedAmountSet": {
"presentmentMoney" : {
"amount": {{ da.allocatedAmountSet.presentmentMoney.amount | json }},
"currencyCode": {{ da.allocatedAmountSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ da.allocatedAmountSet.shopMoney.amount | json }},
"currencyCode": {{ da.allocatedAmountSet.shopMoney.currencyCode | json }}
}
}
{% endfor %}
],
"discountedTotalSet": {
"presentmentMoney" : {
"amount": {{ li.discountedTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.discountedTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.discountedTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.discountedTotalSet.shopMoney.currencyCode | json }}
}
},
"discountedUnitPriceSet": {
"presentmentMoney" : {
"amount": {{ li.discountedUnitPriceSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.discountedUnitPriceSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.discountedUnitPriceSet.shopMoney.amount | json }},
"currencyCode": {{ li.discountedUnitPriceSet.shopMoney.currencyCode | json }}
}
},
"duties": [
{% for duty li.duties %}
{% if forloop.first != true %},{% endif %}
{
{% comment %}rest of duties omitted{% endcomment %}
"id": {{ duty.id | json }}
}
{% endfor %}
],
"fulfillableQuantity": {{ li.fulfillableQuantity | json }},
"fulfillmentService": {
"callbackUrl":{{ li.fulfillmentService.callbackUrl | json }},
"fulfillmentOrdersOptIn": {{ li.fulfillmentService.fulfillmentOrdersOptIn | json }},
"handle": {{ li.fulfillmentService.handle | json }},
"id": {{ li.fulfillmentService.id | json }},
"inventoryManagement": {{ li.fulfillmentService.inventoryManagement | json }},
{% comment %}fulfillmentService.inventoryManagement - omitted {% endcomment %}
"productBased": {{ li.fulfillmentService.productBased | json }},
"serviceName": {{ li.fulfillmentService.serviceName | json }},
"shippingMethods": [
{% for sm in li.fulfillmentService.shippingMethods %}
{% if forloop.first != true %},{% endif %}
{
"code": {{ sm.code | json }},
"label": {{ sm.label | json }}
}
{% endfor %}
],
"type": {{ li.fulfillmentService.type | json }}
},
"fulfillmentStatus": {{ li.fulfillmentStatus | json }},
"id": {{ li.id | json }},
"image": {
"altText": {{ li.image.altText | json }},
"height": {{ li.image.height | json }},
"id": {{ li.image.id | json }},
{% comment %}li.image.metafield omitted{% endcomment %}
{% comment %}li.image.privateMetafield omitted{% endcomment %}
"width":{{ li.image.width | json }}
},
"merchantEditable": {{ li.merchantEditable | json }},
"name": {{ li.name | json }},
"nonFulfillableQuantity": {{ li.nonFulfillableQuantity | json }},
"originalTotalSet": {
"presentmentMoney" : {
"amount": {{ li.originalTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.originalTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.originalTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.originalTotalSet.shopMoney.currencyCode | json }}
}
},
"originalUnitPriceSet": {
"presentmentMoney" : {
"amount": {{ li.originalUnitPriceSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.originalUnitPriceSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.originalUnitPriceSet.shopMoney.amount | json }},
"currencyCode": {{ li.originalUnitPriceSet.shopMoney.currencyCode | json }}
}
},
"product": {
{% comment %}rest of Product omitted{% endcomment %}
"title": {{ li.product.title | json }}
},
"quantity": {{ li.quantity | json }},
"refundableQuantity": {{ li.refundableQuantity | json }},
"requiresShipping": {{ li.requiresShipping | json }},
"restockable": {{ li.restockable | json }},
"sellingPlan": {
"name": {{ li.sellingPlan.name | json }}
},
"sku": {{ li.sku | json }},
"taxLines": [
{% for tl in li.taxLines %}
{% if forloop.first != true %},{% endif %}
{
"priceSet": {
"presentmentMoney" : {
"amount": {{ tl.priceSet.presentmentMoney.amount | json }},
"currencyCode": {{ tl.priceSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ tl.priceSet.shopMoney.amount | json }},
"currencyCode": {{ tl.priceSet.shopMoney.currencyCode | json }}
}
},
"rate": {{ tl.rate | json }},
"ratePercentage": {{ tl.ratePercentage | json }},
"title": {{ tl.title | json }}
}
{% endfor %}
],
"taxable":{{ li.taxable | json }},
"title":{{ li.title | json }},
"totalDiscountSet": {
"presentmentMoney" : {
"amount": {{ li.totalDiscountSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.totalDiscountSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.totalDiscountSet.shopMoney.amount | json }},
"currencyCode": {{ li.totalDiscountSet.shopMoney.currencyCode | json }}
}
},
"unfulfilledDiscountedTotalSet": {
"presentmentMoney" : {
"amount": {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.unfulfilledDiscountedTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode | json }}
}
},
"unfulfilledOriginalTotalSet": {
"presentmentMoney" : {
"amount": {{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.unfulfilledOriginalTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode | json }}
}
},
"unfulfilledQuantity": {{ li.unfulfilledQuantity | json }},
"variant": {
{% comment %}rest of variant omitted {% endcomment %}
"title": {{ li.variant.title | json }}
},
"variantTitle": {{ li.variantTitle | json }},
"vendor": {{ li.vendor | json }}
}
{% endfor %}
]
}