Utilizzo delle variabili Liquid in Shopify Flow

Le variabili Liquid sono dei segnaposto definiti in Liquid che vengono sostituiti con i valori da GraphQL Admin API quando viene eseguito un flusso di lavoro. Le variabili possono descrivere gli attributi di clienti, ordini e prodotti coinvolti nei tuoi flussi di lavoro, come il numero d'ordine, il prezzo dell'ordine o il nome del cliente. Le variabili possono essere utilizzate nelle condizioni per controllare la logica nel flusso di lavoro oppure per produrre dati in output da un'azione.

Aggiunta di variabili nei flussi di lavoro utilizzando Liquid

Puoi aggiungere variabili utilizzando Liquid in qualsiasi campo di testo che contenga il link Aggiungi una variabile. Fai clic sul link Aggiungi una variabile sotto il campo pertinente, quindi scegli una variabile dall’elenco.

Immagine del pannello di configurazione dell’azione Invia email interna, che evidenzia l’opzione ’Aggiungi variabile’ sotto il campo Oggetto.

Le variabili nell’elenco Aggiungi una variabile sono filtrate in modo che tu possa utilizzare solo le variabili restituite dai passaggi precedenti a quello corrente, come i trigger. Ad esempio, il trigger Ordine creato fornisce risorse relative a ordini e negozio dall’API Admin che possono essere inserite come variabili. Dopo aver scelto una variabile dall’elenco, questa viene aggiunta alla casella di testo come Liquid formattato correttamente.

Puoi anche scrivere Liquid direttamente nel campo di testo. Ad esempio, puoi utilizzare la variabile {{ order.name }} per visualizzare la stringa dell’ordine dal pannello di controllo Shopify, come ordine-123.

Poiché Flow utilizza l’API Admin per recuperare i dati usati per Liquid, la sintassi delle variabili utilizza il formato camel case. Le variabili in formato camel case hanno la prima parola che inizia con una lettera minuscola e le parole successive che iniziano con una lettera maiuscola, come firstName o canMarkAsPaid. Ad esempio, per accedere alla data di creazione di un prodotto, inserisci {{ product.createdAt }}. Se utilizzi la sintassi Liquid in un tema di Shopify, che non utilizza il formato camel case, dovrai inserire {{ product.created_at }}.

Tag condizionali e di iterazione Liquid

I tag Liquid possono essere utilizzati con le variabili per svolgere le seguenti funzioni:

  • Scrivere istruzioni condizionali, ad esempio per determinare se il totale di un ordine è maggiore di 100 $.
  • Eseguire l'iterazione di un elenco di oggetti, ad esempio per generare dati per ogni voce di un ordine.

Puoi utilizzare i tag Liquid per scrivere queste istruzioni ed eseguire l'iterazione degli oggetti.

Ad esempio, il seguente codice Liquid mostra il numero dell'ordine se il totale dell'ordine è maggiore di 100 $:

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

Puoi anche utilizzare un ciclo for per eseguire l'iterazione di un elenco di oggetti, come le voci di un ordine. Ad esempio, il seguente codice Liquid mostra il nome di ogni voce di un ordine:

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

Flow supporta i seguenti tag condizionali (o di controllo del flusso) Liquid:

Flow supporta anche i seguenti tag di iterazione Liquid:

Applicazione di filtri alle variabili

Puoi trasformare i dati delle variabili in Liquid utilizzando i filtri. Flow supporta tutti i filtri Liquid open source.

Ad esempio, il seguente codice Liquid rimuove un prefisso da un nome ordine e genera ciò che rimane: {{ order.name | remove: "Order-" }}

Considerazioni sull'utilizzo delle variabili Liquid nei filtri

Prima di trasformare le variabili utilizzando i filtri, esamina le seguenti considerazioni:

  • Flow non supporta la notazione con punto disponibile per alcuni filtri. Ad esempio, Flow supporta {{ order.lineItems | size }} ma non {{ order.lineItems.size }}.
  • Flow non supporta la notazione con punto per i metafield. Ad esempio, non puoi utilizzare {{ order.metafields.custom.hold_note }}. Devi invece eseguire il loop dei metafield come indicato negli esempi.
  • Flow non supporta l'utilizzo di indici per accedere agli articoli in un elenco. Ad esempio, non puoi utilizzare {{ order.lineItems[0].title }}. Devi invece eseguire il loop delle voci come indicato negli esempi.

Filtri per la data

Oltre ai filtri Liquid standard, Flow fornisce filtri per la data che consentono di ottenere una data relativa a un'altra per supportare il trigger Ora programmata e le funzionalità Ottieni dati. Questi filtri sono: date_minus e date_plus. Ad esempio:

  • Per restituire una data futura di un giorno: {{ "now" | date_plus: "1 day" }}
  • Per restituire una data passata di un giorno: {{ "now" | date_minus: "1 day" }}

Questi filtri accettano second, minute, day, week, month e year come unità di durata, sia al singolare (ad esempio second) che al plurale (ad esempio seconds). Puoi anche fornire i seguenti tipi di unità personalizzabili:

  • Un numero intero che rappresenta il numero di secondi: {{ "now" | date_minus: 3600 }}, dove 3600 equivale a 1 ora.
  • Una stringa di durata ISO 8601: {{ "now" | date_minus: "P1Y2D" }}, dove P1Y2D significa 1 anno e 2 giorni.

Filtri crittografici

Flow fornisce filtri crittografici per l'hashing e la creazione di codici di autenticazione dei messaggi basati su hash (HMAC). Questi filtri sono utili per creare identificatori univoci, checksum o per l’integrazione con sistemi di terze parti che richiedono formati di hash specifici.

Filtri di hashing

Shopify Flow supporta i seguenti tipi di filtri di hashing:

  • blake3: crea un hash BLAKE3 (consigliato per l’uso generale).
  • sha256: crea un hash SHA-256.
  • sha1: crea un hash SHA-1.
  • md5: crea un hash MD5.

Per scopi di hashing generali e nuove implementazioni, è consigliabile utilizzare blake3, in quanto offre prestazioni e sicurezza superiori rispetto agli algoritmi meno recenti. Tuttavia, sha256, sha1 e md5 sono disponibili per garantire la compatibilità con i sistemi di terze parti.

Esempio di utilizzo: {{ "hello world" | blake3 }} restituisce l’hash BLAKE3 di “hello world”.

Filtri HMAC

Per creare un HMAC con una chiave segreta, utilizza uno dei seguenti filtri supportati:

Esempio di utilizzo:

  • Di base: {{ "message" | hmac_sha256: "secret_key" }}
  • Con segreti (consigliato): {{ "message" | hmac_sha256: secrets.api_key }}

Esempi di utilizzo delle variabili con Liquid in Shopify Flow

Per capire meglio come utilizzare le variabili Liquid, considera gli esempi seguenti:

Visualizzare gli URL per le risorse

Vuoi visualizzare gli URL per il cliente, l’ordine e il prodotto coinvolti in un flusso di lavoro.

# 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>

Convertire un elenco di tag in un metafield

Vuoi convertire un set di tag in un metafield che sia un elenco di campi di testo a riga singola. Crea un flusso di lavoro utilizzando il trigger Prodotto aggiunto al negozio e utilizza l'azione Aggiorna metafield prodotto. Nella sezione Valore dell'azione Aggiorna metafield prodotto, aggiungi il seguente codice Liquid. Questo esempio presuppone che i valori debbano essere impostati solo una volta al momento della creazione del prodotto e che il prodotto abbia due tag pertinenti: color:red e color:orange.

Esempio di codice Liquid per impostare l’elenco di un campo di testo a riga singola.
InputOutput
{% 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"]

Scrivere un messaggio email dinamico per un ordine

Vuoi creare un flusso di lavoro per inviare un’email a un dipendente quando un cliente spende più di 500 $ in un ordine. Crea un flusso di lavoro utilizzando il trigger Ordine creato, imposta una condizione che sia vera se il totale dell’ordine è superiore a 500 $ e utilizza l’azione Invia email interna. Nella sezione Messaggio dell’azione Invia email interna, utilizza le seguenti variabili.

Esempio di utilizzo delle variabili per fornire i dettagli del cliente.
InputOutput
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 }}.
Invia una nota di ringraziamento personale a Jeanne Dupont (jeanne@example.com) per aver effettuato un ordine di 763,42 $.

Scrivere un messaggio email dinamico per un prodotto con scorte in esaurimento

Decidi di dover informare un membro dello staff quando le scorte di un prodotto si stanno esaurendo ed è necessario effettuare un ordine per altre scorte. Crea un flusso di lavoro che inizia con il trigger Quantità di scorte modificata e imposta una condizione che sia vera se la quantità di scorte precedente è minore o uguale a 10. Nella sezione Messaggio dell'azione Invia email interna, utilizza le seguenti variabili.

Esempio di utilizzo delle variabili per fornire i dettagli dell’articolo.
InputOutput
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Ordina di nuovo Leggings a vita alta - Nero. Invia un'email a owner@example.com per verificare che abbia ricevuto l'ordine d'acquisto.

Scrivere un messaggio email dinamico per avvisare lo staff di un ordine fraudolento

Vuoi annullare gli ordini con un livello di rischio elevato, ma preferisci che sia lo staff ad annullarveli manualmente. Crea un flusso di lavoro che inizia con il trigger Ordine creato e imposta una condizione che sia vera se il livello di rischio dell'ordine è uguale a elevato. Nella sezione Messaggio dell'azione Invia email interna, utilizza le seguenti variabili.

Esempio di utilizzo delle variabili per fornire informazioni su un ordine fraudolento.
InputOutput
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!
Il nostro negozio Shopify ha ricevuto un ordine con un alto rischio di frode. Vorremmo annullare questo ordine immediatamente, prima che venga inviato in produzione:

#1001
Dupont, Jeanne
jeanne@example.com

Conferma il nuovo stato dell'ordine. Grazie!

Visualizzare le voci di un ordine utilizzando un loop for

Quando ricevi un ordine, può essere utile inviare un messaggio che contenga i prodotti ordinati. Puoi farlo utilizzando un loop for, che esegue ripetutamente un blocco di codice. I campi di testo che supportano le variabili supportano anche i loop for e l’oggetto forloop.

Ad esempio, vuoi creare un flusso di lavoro che restituisca un elenco di tutti gli SKU e le quantità di un ordine. Nella sezione Messaggio dell’azione Invia email interna, utilizzi le seguenti variabili.

Esempio di utilizzo del ciclo for per fornire informazioni sull’ordine.
InputOutput
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Riepilogo ordine:
8987097979 (50)
8877778887 (3)
888998898B (1)

Output delle voci di un ordine utilizzando un ciclo for con informazioni aggiuntive

Decidi di aggiungere ulteriori informazioni all’email, tra cui nome del prodotto, SKU, prezzo per articolo e informazioni di spedizione del cliente. Nella sezione Messaggio dell’azione Invia email interna, utilizzi le seguenti variabili.

Esempio di utilizzo del ciclo for per fornire informazioni sull’ordine più dettagliate.
InputOutput
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Riepilogo ordine:
Prodotto: Leggings a vita alta - Neri
SKU: 8987097979
Prezzo (per unità): 8,49 $
Quantità: 5
Prodotto: Calzini sportivi - Blu
SKU: 888998898B
Prezzo (per unità): 5,61 $
Quantità: 2

Output di alcune voci combinando un ciclo for con un’istruzione if

Devi tracciare gli articoli venduti forniti da un venditore specifico. Nella sezione Messaggio dell’azione Invia email interna, utilizzi le seguenti variabili e includi un’istruzione if nel tuo ciclo for.

Esempio di utilizzo del ciclo for e dell’istruzione if per fornire informazioni sull’ordine per venditori specifici.
InputOutput
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Prodotto Acme venduto:
Nome del prodotto: Leggings a vita alta - Neri
SKU: 8987097979

Oggetti di dati complessi in Shopify Flow

Flow ti consente di accedere a quasi tutti i dati presenti nella GraphQL Admin API. Ciò include oggetti di dati complessi, come elenchi e oggetti. Tuttavia, ci sono alcune limitazioni a ciò che puoi fare con questi oggetti. Questa sezione illustra tali limitazioni e fornisce esempi su come utilizzarli.

Invece di richiamare direttamente elenchi e oggetti, dovresti eseguire un ciclo sull'elenco e includere solo i campi desiderati.

Ad esempio, invece di richiamare direttamente {{ order.lineItems }}, usa il formato seguente per richiamare campi specifici. Questi esempi includono tutti i campi che verrebbero inclusi richiamando direttamente l’elenco o l’oggetto. Copia e incolla i campi di cui hai bisogno.

Testo
{% 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 %}
]

}