Usar variáveis do Liquid no Shopify Flow

As variáveis do Liquid são marcadores de posição definidos no Liquid que são substituídos por valores da GraphQL Admin API quando um fluxo de trabalho é executado. Elas podem descrever as características dos clientes, pedidos e produtos envolvidos em seus fluxos de trabalho, como o número do pedido, preço do pedido ou nome do cliente. As variáveis podem ser usadas em condições para controlar a lógica no fluxo de trabalho ou para gerar dados a partir de uma ação.

Adicionar variáveis em fluxos de trabalho com o Liquid

É possível adicionar variáveis com o Liquid a qualquer campo de texto que contenha o link Adicionar uma variável. Clique no link Adicionar uma variável abaixo do campo relevante e escolha uma variável na lista.

Imagem do painel de configuração da ação 'Enviar e-mail interno', destacando a opção 'Adicionar variável' abaixo do campo 'Assunto'.

As variáveis na lista Adicionar uma variável são filtradas para que você use apenas aquelas retornadas por etapas anteriores à atual, como os acionadores. Por exemplo, o acionador Pedido criado fornece recursos de pedido e loja da Admin API que podem ser inseridos como variáveis. Depois de escolher uma variável na lista, ela é adicionada à caixa de texto como um Liquid formatado corretamente.

Você também pode escrever o Liquid diretamente no campo de texto. Por exemplo, pode usar a variável {{ order.name }} para exibir a string do pedido do admin da Shopify, como order-123.

Como o Flow usa a Admin API para recuperar os dados usados pelo Liquid, a sintaxe da variável usa camel case. Nas variáveis em camel case, a primeira palavra começa com letra minúscula, e as palavras seguintes começam com letra maiúscula, como em firstName ou canMarkAsPaid. Por exemplo, para acessar a data de criação de um produto, insira {{ product.createdAt }}. Se você usar a sintaxe do Liquid em um tema da Shopify, que não usa camel case, precisará inserir {{ product.created_at }}.

Tags condicionais e de iteração do Liquid

As tags do Liquid podem ser usadas com variáveis para executar as seguintes funções:

  • Escrever instruções condicionais, como determinar se o total de um pedido é maior que US$ 100.
  • Iterar em uma lista de objetos, como gerar dados para cada item de linha em um pedido.

Use as tags do Liquid para escrever essas instruções e iterar em objetos.

Por exemplo, o Liquid a seguir exibe o número do pedido se o total for maior que US$ 100:

{% if order.totalPriceSet.shopMoney.amount > 100 %}
  Order number: {{ order.name }}
{% endif %}

Você também pode usar um loop "for" para iterar em uma lista de objetos, como os itens de linha de um pedido. Por exemplo, o Liquid a seguir exibe o nome de cada item de linha em um pedido:

{% for li in order.lineItems %}
  {{ li.title }}
{% endfor %}

O Flow é compatível com as seguintes tags condicionais (ou de controle de fluxo) do Liquid:

O Flow também é compatível com as seguintes tags de iteração do Liquid:

Aplicar filtros a variáveis

É possível transformar os dados das variáveis no Liquid usando filtros. O Flow é compatível com todos os filtros do Liquid de código aberto.

Por exemplo, o Liquid a seguir remove um prefixo do nome de um pedido e exibe o que resta: {{ order.name | remove: "Order-" }}

Considerações sobre o uso de variáveis do Liquid em filtros

Antes de transformar variáveis com filtros, analise as seguintes considerações:

  • O Flow não é compatível com a notação de ponto disponível para alguns filtros. Por exemplo, o Flow é compatível com {{ order.lineItems | size }}, mas não com {{ order.lineItems.size }}.
  • O Flow não é compatível com a notação de ponto para metacampos. Por exemplo, não é possível usar {{ order.metafields.custom.hold_note }}. Em vez disso, você precisa percorrer os metacampos em um loop, conforme descrito nos exemplos.
  • O Flow não é compatível com o uso de índices para acessar itens em uma lista. Por exemplo, não é possível usar {{ order.lineItems[0].title }}. Em vez disso, você precisa percorrer os itens de linha em um loop, conforme descrito nos exemplos.

Filtros de data

Além dos filtros-padrão do Liquid, o Flow oferece filtros de data para obter uma data relativa a outra, para uso nos recursos de acionador Hora programada e Obter dados. Esses filtros são: date_minus e date_plus. Por exemplo:

  • Para retornar uma data um dia no futuro: {{ "now" | date_plus: "1 day" }}
  • Para retornar uma data um dia no passado: {{ "now" | date_minus: "1 day" }}

Esses filtros aceitam second, minute, day, week, month e year como unidade de duração, tanto no singular (como second) quanto no plural (como seconds). Você também pode fornecer os seguintes tipos de unidade personalizável:

  • Um número inteiro que representa o número de segundos: {{ "now" | date_minus: 3600 }}, em que 3600 equivale a 1 hora.
  • Uma string de duração ISO8601: {{ "now" | date_minus: "P1Y2D" }}, em que P1Y2D significa 1 ano e 2 dias.

Filtros criptográficos

O Flow oferece filtros criptográficos para hashing e para a criação de Códigos de autenticação de mensagem baseados em hash (HMACs). Esses filtros são úteis para criar identificadores exclusivos, checksums ou para integrar com sistemas de terceiros que exigem formatos de hash específicos.

Filtros de hashing

O Shopify Flow é compatível com os seguintes tipos de filtros de hashing:

  • blake3: cria um hash BLAKE3 (recomendado para uso geral).
  • sha256: cria um hash SHA-256.
  • sha1: cria um hash SHA-1.
  • md5: cria um hash MD5.

Para fins gerais de hashing e novas implementações, use blake3, pois ele oferece desempenho e segurança superiores em comparação com algoritmos mais antigos. No entanto, sha256, sha1 e md5 estão disponíveis para compatibilidade com sistemas de terceiros.

Exemplo de uso: {{ "hello world" | blake3 }} retorna o hash BLAKE3 de "hello world".

Filtros HMAC

Para criar um HMAC com uma chave secreta, use um dos seguintes filtros compatíveis:

Exemplo de uso:

  • Básico: {{ "message" | hmac_sha256: "secret_key" }}
  • Com segredos (recomendado): {{ "message" | hmac_sha256: secrets.api_key }}

Exemplos de uso de variáveis com o Liquid no Shopify Flow

Para ter uma ideia melhor de como usar as variáveis do Liquid, confira os exemplos a seguir:

Exibir URLs para recursos

Para exibir os URLs do cliente, do pedido e do produto envolvidos em um workflow.

# Output the base Admin URL for your store
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}

# Assign the base Admin url to a variable named base_url:
{%- capture base_url -%}https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}{%- endcapture -%}

# Customer from a Customer trigger:
{{ base_url }}/customers/{{ customer.legacyResourceId }}

# Customer without the base_url:
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}/customers/{{ customer.legacyResourceId }}

# Customer from an Order trigger:
{{ base_url }}/customers/{{ order.customer.legacyResourceId }}

# Order:
{{ base_url }}/orders/{{ order.legacyResourceId }}

# Product:
{{ base_url }}/products/{{ product.legacyResourceId }}

# Product Variant:
{{ base_url }}/products/{{ product.legacyResourceId }}/variants/{{ productVariant.legacyResourceId }}

# Example showing a clickable link in HTML, making use of the URL:
<a href="{{ base_url }}/products/{{ product.legacyResourceId }}">{{ product.title }}</a>

Converter uma lista de tags em um metacampo

Para converter um conjunto de tags em um metacampo que é uma lista de campos de texto de linha única, crie um workflow com o acionador Produto adicionado à loja e use a ação Atualizar metacampo do produto. Na seção Valor da ação Atualizar metacampo do produto, adicione o seguinte código Liquid. Este exemplo pressupõe que você só precisa definir os valores uma vez quando o produto é criado e que o produto tem duas tags relevantes: color:red e color:orange.

Exemplo de Liquid para definir a lista de um campo de texto de linha única.
EntradaSaída
{% capture mf_value %}
{%- for tags_item in product.tags -%}
  {%- if tags_item contains "color:" -%}
    "{{- tags_item | remove_first: "color:" | strip -}}",
  {%- endif -%}
{%- endfor -%}
{% endcapture -%}
[{{mf_value | remove_last: ","}}]
      
["red","orange"]

Escrever um e-mail dinâmico para um pedido

Para criar um workflow que envia um e-mail a um funcionário quando um cliente gasta mais de US$ 500 em um pedido, crie um workflow com o acionador Pedido criado, defina uma condição que seja verdadeira se o total do pedido for superior a US$ 500 e use a ação Enviar e-mail interno. Na seção Mensagem da ação Enviar e-mail interno, use as seguintes variáveis.

Exemplo de uso de variável para fornecer informações do cliente.
EntradaSaída
Please send a personal thank you note to {{ order.customer.firstName }} {{ order.customer.lastName }}({{ order.customer.email }}) for placing an order for $ {{ order.totalPriceSet.shopMoney.amount }}.
Envie uma nota de agradecimento pessoal para Jeanne Dupont (jeanne@example.com) por fazer um pedido de US$ 763,42.

Escrever um e-mail dinâmico para um produto com pouco estoque

Você decide que precisa informar um membro da equipe quando o estoque de um produto estiver baixo e for preciso fazer um pedido para renovar o estoque. Crie um workflow que comece com o acionador Volume de estoque alterado e defina uma condição que seja verdadeira se o volume de estoque anterior for menor ou igual a 10. Na seção Mensagem da ação Enviar e-mail interno, use as seguintes variáveis.

Exemplo de uso de variável para fornecer detalhes do item.
EntradaSaída
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Faça um novo pedido de High Waist Leggings - Preto. Envie um e-mail para owner@example.com para verificar se o pedido de compra foi recebido.

Escrever um e-mail dinâmico para notificar a equipe sobre um pedido fraudulento

Para cancelar pedidos com alto nível de risco, mas preferindo que a equipe cancele o pedido manualmente, crie um workflow que comece com o acionador Pedido criado e defina uma condição que seja verdadeira se o nível de risco do pedido for igual a alto. Na seção Mensagem da ação Enviar e-mail interno, use as seguintes variáveis.

Exemplo de uso de variável para fornecer informações sobre um pedido fraudulento.
EntradaSaída
Our Shopify store has received an order with a high risk of fraud. We would like to cancel this order right away, before it is sent to production:
{{ order.name }} {{ order.billingAddress.lastName }}, {{ order.billingAddress.firstName }} {{ order.email }}
Please confirm the new order status. Thanks!
Nossa loja na Shopify recebeu um pedido com alto risco de fraude. Gostaríamos de cancelar o pedido imediatamente antes que seja enviado para produção:

#1001
Dupont, Jeanne
jeanne@example.com

Por favor, confirme o novo status do pedido. Agradecemos!

Exibir os itens de linha de um pedido usando um loop "for"

Quando um pedido é recebido, pode ser útil enviar uma mensagem que contenha os produtos do pedido. Para isso, use um loop "for", que executa um bloco de código repetidamente. Os campos de texto compatíveis com variáveis também são compatíveis com loops "for" e com o objeto forloop.

Por exemplo, para criar um fluxo de trabalho que retorne uma lista de todos os SKUs e as quantidades de um pedido, use as variáveis a seguir na seção Mensagem da ação Enviar e-mail interno.

Exemplo do uso do loop “for” para fornecer informações do pedido.
EntradaSaída
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Resumo do pedido:
8987097979 (50)
8877778887 (3)
888998898B (1)

Exibir os itens de linha de um pedido com informações adicionais usando um loop “for”

Para adicionar mais informações ao e-mail, como o nome do produto, os SKUs, o preço por item e as informações de frete do cliente, use as variáveis a seguir na seção Mensagem da ação Enviar e-mail interno.

Exemplo do uso do loop “for” para fornecer informações mais detalhadas do pedido.
EntradaSaída
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Resumo do pedido:
Produto: High Waist Leggings - Black
SKU: 8987097979
Preço (por unidade): $ 8,49
Quantidade: 5
Produto: Athletic Socks - Blue
SKU: 888998898B
Preço (por unidade): $ 5,61
Quantidade: 2

Exibir itens de linha combinando um loop “for” com uma instrução “if”

Para rastrear itens vendidos fornecidos por um fabricante específico, use as variáveis a seguir na seção Mensagem da ação Enviar e-mail interno e inclua uma instrução if no loop for.

Exemplo do uso do loop “for” e da instrução “if” para fornecer informações do pedido de fabricantes específicos.
EntradaSaída
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Produto Acme vendido:
Nome do produto: High Waist Leggings - Black
SKU: 8987097979

Objetos de dados complexos no Shopify Flow

O Flow permite acessar praticamente todos os dados que estão na GraphQL Admin API, incluindo objetos de dados complexos, como listas e objetos. No entanto, há algumas limitações sobre o que é possível fazer com esses objetos. Esta seção descreve essas limitações e apresenta exemplos de como trabalhar com eles.

Em vez de chamar listas e objetos diretamente, percorra a lista em loop e inclua apenas os campos desejados.

Por exemplo, em vez de chamar {{ order.lineItems }} diretamente, use o formato a seguir para chamar campos específicos. Estes exemplos incluem todos os campos que seriam incluídos na chamada direta da lista ou do objeto. Copie e cole os campos necessários.

Texto
{% 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 %}

JSON
{
    "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 %}
            ],
&#x22;discountAllocations&#x22;: [
            {% for da in li.discountAllocations %}
                {% if forloop.first != true %},{% endif %}
                &#x22;allocatedAmountSet&#x22;: {
                    &#x22;presentmentMoney&#x22; : {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.presentmentMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.presentmentMoney.currencyCode | json }}
                    },
                    &#x22;shopMoney&#x22;: {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.shopMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.shopMoney.currencyCode | json }}
                    }
                }
            {% endfor %}
        ],

        &#x22;discountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;discountedUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },
        &#x22;duties&#x22;: [
            {% for duty li.duties %}
            {% if forloop.first != true %},{% endif %}
            {
                {% comment %}rest of duties omitted{% endcomment %}
                &#x22;id&#x22;: {{ duty.id | json }}
            }
            {% endfor %}
        ],
        &#x22;fulfillableQuantity&#x22;: {{ li.fulfillableQuantity | json }},

        &#x22;fulfillmentService&#x22;: {
            &#x22;callbackUrl&#x22;:{{ li.fulfillmentService.callbackUrl | json }},
            &#x22;fulfillmentOrdersOptIn&#x22;: {{ li.fulfillmentService.fulfillmentOrdersOptIn | json }},
            &#x22;handle&#x22;: {{ li.fulfillmentService.handle | json }},
            &#x22;id&#x22;: {{ li.fulfillmentService.id | json }},
            &#x22;inventoryManagement&#x22;: {{ li.fulfillmentService.inventoryManagement | json }},
            {% comment %}fulfillmentService.inventoryManagement - omitted {% endcomment %}
            &#x22;productBased&#x22;: {{ li.fulfillmentService.productBased | json }},
            &#x22;serviceName&#x22;: {{ li.fulfillmentService.serviceName | json }},
            &#x22;shippingMethods&#x22;: [
                {% for sm in li.fulfillmentService.shippingMethods %}
                    {% if forloop.first != true %},{% endif %}
                    {
                        &#x22;code&#x22;: {{ sm.code | json }},
                        &#x22;label&#x22;: {{ sm.label | json }}
                    }
                {% endfor %}
            ],
            &#x22;type&#x22;: {{ li.fulfillmentService.type | json }}

        },
        &#x22;fulfillmentStatus&#x22;: {{ li.fulfillmentStatus | json }},
        &#x22;id&#x22;: {{ li.id | json }},
        &#x22;image&#x22;: {
            &#x22;altText&#x22;: {{ li.image.altText | json }},
            &#x22;height&#x22;: {{ li.image.height | json }},
            &#x22;id&#x22;: {{ li.image.id | json }},
            {% comment %}li.image.metafield omitted{% endcomment %}
            {% comment %}li.image.privateMetafield omitted{% endcomment %}
            &#x22;width&#x22;:{{ li.image.width | json }}
        },
        &#x22;merchantEditable&#x22;: {{ li.merchantEditable | json }},
        &#x22;name&#x22;: {{ li.name | json }},
        &#x22;nonFulfillableQuantity&#x22;: {{ li.nonFulfillableQuantity | json }},

        &#x22;originalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;originalUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;product&#x22;: {
            {% comment %}rest of Product omitted{% endcomment %}
            &#x22;title&#x22;: {{ li.product.title | json }}
        },

        &#x22;quantity&#x22;: {{ li.quantity | json }},
        &#x22;refundableQuantity&#x22;: {{ li.refundableQuantity | json }},
        &#x22;requiresShipping&#x22;: {{ li.requiresShipping | json }},
        &#x22;restockable&#x22;: {{ li.restockable | json }},

        &#x22;sellingPlan&#x22;: {
            &#x22;name&#x22;: {{ li.sellingPlan.name | json }}
        },

        &#x22;sku&#x22;: {{ li.sku | json }},

        &#x22;taxLines&#x22;: [
            {% for tl in li.taxLines %}
                {% if forloop.first != true %},{% endif %}
                {
                    &#x22;priceSet&#x22;: {
                        &#x22;presentmentMoney&#x22; : {
                            &#x22;amount&#x22;: {{ tl.priceSet.presentmentMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.presentmentMoney.currencyCode | json }}
                        },
                        &#x22;shopMoney&#x22;: {
                            &#x22;amount&#x22;: {{ tl.priceSet.shopMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.shopMoney.currencyCode | json }}
                        }
                    },
                    &#x22;rate&#x22;: {{ tl.rate | json }},
                    &#x22;ratePercentage&#x22;: {{ tl.ratePercentage | json }},
                    &#x22;title&#x22;: {{ tl.title | json }}
                }
            {% endfor %}
        ],
        &#x22;taxable&#x22;:{{ li.taxable | json }},
        &#x22;title&#x22;:{{ li.title | json }},

        &#x22;totalDiscountSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledDiscountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledOriginalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledQuantity&#x22;: {{ li.unfulfilledQuantity | json }},

        &#x22;variant&#x22;: {
            {% comment %}rest of variant omitted {% endcomment %}
            &#x22;title&#x22;: {{ li.variant.title | json }}
        },

        &#x22;variantTitle&#x22;: {{ li.variantTitle | json }},
        &#x22;vendor&#x22;: {{ li.vendor | json }}
    }
{% endfor %}
]

}