Liquid-variabelen gebruiken in Shopify Flow

Liquid-variabelen zijn tijdelijke aanduidingen in Liquid die worden vervangen door waarden uit de GraphQL Admin API wanneer een workflow wordt uitgevoerd. Variabelen kunnen de attributen beschrijven van de klanten, bestellingen en producten die bij je workflows betrokken zijn, zoals het bestelnummer, de bestelprijs of de klantnaam. Variabelen kunnen in voorwaarden worden gebruikt om de logica in je workflow te sturen, of om gegevens uit een actie uit te voeren.

Variabelen toevoegen in workflows met Liquid

Je kunt met Liquid variabelen toevoegen aan elk tekstvak met de link Een variabele toevoegen. Klik op de link Een variabele toevoegen onder het betreffende veld en kies vervolgens een variabele uit de lijst.

Afbeelding van het configuratievenster van de actie 'Interne e-mail verzenden', waarop de optie 'Variabele toevoegen' onder het veld 'Onderwerp' is gemarkeerd.

De variabelen in de lijst Een variabele toevoegen zijn gefilterd, zodat je alleen de variabelen gebruikt die worden geretourneerd door stappen die vóór de huidige stap komen, zoals triggers. De trigger Bestelling aangemaakt levert bijvoorbeeld bestel- en winkelresources uit de Admin API die als variabelen kunnen worden ingevoegd. Nadat je een variabele uit de lijst hebt gekozen, wordt deze als correct opgemaakte Liquid aan het tekstvak toegevoegd.

Je kunt Liquid ook rechtstreeks in het tekstvak schrijven. Je kunt bijvoorbeeld de variabele {{ order.name }} gebruiken om de besteltekenreeks uit het Shopify-beheercentrum weer te geven, zoals bestelling-123.

Omdat Flow de Admin API gebruikt om de gegevens voor Liquid op te halen, wordt voor de variabele syntaxis camel case gebruikt. Bij camel case-variabelen begint het eerste woord met een kleine letter en beginnen de volgende woorden met een hoofdletter, zoals firstName of canMarkAsPaid. Voer bijvoorbeeld {{ product.createdAt }} in om de aanmaakdatum van een product te openen. Als je de Liquid-syntaxis in een Shopify-thema gebruikt (waarbij geen camel case wordt gebruikt), voer je {{ product.created_at }} in.

Conditionele en iteratie-Liquid-tags

Liquid-tags kunnen met variabelen worden gebruikt om de volgende functies uit te voeren:

  • Conditionele verklaringen schrijven, zoals bepalen of een besteltotaal hoger is dan $ 100.
  • Door een lijst met objecten itereren, zoals gegevens weergeven voor elke orderregel in een bestelling.

Je kunt Liquid-tags gebruiken om deze verklaringen te schrijven en door objecten te itereren.

De volgende Liquid geeft bijvoorbeeld het bestelnummer weer als het besteltotaal hoger is dan $ 100:

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

Je kunt ook een for-lus gebruiken om door een lijst met objecten te itereren, zoals de orderregels voor een bestelling. De volgende Liquid geeft bijvoorbeeld de naam van elke orderregel in een bestelling weer:

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

Flow ondersteunt de volgende conditionele (of control flow) Liquid-tags:

Flow ondersteunt ook de volgende iteratie-Liquid-tags:

Filters toepassen op variabelen

Je kunt variabele gegevens in Liquid transformeren met filters. Flow ondersteunt alle open source-Liquid-filters.

De volgende Liquid verwijdert bijvoorbeeld een voorvoegsel van een bestelnaam en geeft het resterende deel weer: {{ order.name | remove: "Order-" }}

Aandachtspunten voor het gebruik van Liquid-variabelen in filters

Lees de volgende aandachtspunten door voordat je variabelen met filters transformeert:

  • Flow ondersteunt geen puntnotatie die voor sommige filters beschikbaar is. Flow ondersteunt bijvoorbeeld wel {{ order.lineItems | size }}, maar niet {{ order.lineItems.size }}.
  • Flow ondersteunt geen puntnotatie voor metavelden. Je kunt bijvoorbeeld niet {{ order.metafields.custom.hold_note }} gebruiken. In plaats daarvan moet je over de metavelden loopen, zoals beschreven in de voorbeelden.
  • Flow ondersteunt het gebruik van indexen niet om toegang te krijgen tot artikelen in een lijst. Je kunt bijvoorbeeld niet {{ order.lineItems[0].title }} gebruiken. In plaats daarvan moet je over de orderregels loopen, zoals beschreven in de voorbeelden.

Datumfilters

Naast de standaard Liquid-filters biedt Flow datumfilters om een datum ten opzichte van een andere datum te krijgen. Dit ter ondersteuning van de trigger Geplande tijd en de functie Gegevens ophalen. Deze filters zijn: date_minus en date_plus. Bijvoorbeeld:

  • Een datum één dag in de toekomst retourneren: {{ "now" | date_plus: "1 day" }}
  • Een datum één dag in het verleden retourneren: {{ "now" | date_minus: "1 day" }}

Deze filters accepteren second, minute, day, week, month en year als duur-eenheid, zowel in het enkelvoud (zoals second) als in het meervoud (zoals seconds). Je kunt ook de volgende soorten aanpasbare eenheden opgeven:

  • Een geheel getal dat het aantal seconden aangeeft: {{ "now" | date_minus: 3600 }}, waarbij 3600 gelijk is aan 1 uur.
  • Een ISO8601-duurtekenreeks: {{ "now" | date_minus: "P1Y2D" }}, waarbij P1Y2D 1 jaar en 2 dagen betekent.

Cryptografische filters

Flow biedt cryptografische filters voor hashen en het aanmaken van HMAC's (Hash-based Message Authentication Codes). Deze filters zijn handig voor het aanmaken van unieke ID's, checksums of voor integratie met systemen van externe partijen die specifieke hash-indelingen vereisen.

Hashingfilters

Shopify Flow ondersteunt de volgende soorten hashingfilters:

  • blake3 - Maakt een BLAKE3-hash aan (aanbevolen voor algemeen gebruik).
  • sha256 - Maakt een SHA-256-hash aan.
  • sha1 - Maakt een SHA-1-hash aan.
  • md5 - Maakt een MD5-hash aan.

Voor algemene hashingdoeleinden en nieuwe implementaties kun je het beste blake3 gebruiken, omdat dit betere prestaties en beveiliging biedt in vergelijking met oudere algoritmen. sha256, sha1 en md5 zijn echter beschikbaar voor compatibiliteit met systemen van externe partijen.

Voorbeeld van gebruik: {{ "hello world" | blake3 }} geeft de BLAKE3-hash van 'hello world' terug.

HMAC-filters

Gebruik een van de volgende ondersteunde filters om een HMAC met een geheime sleutel aan te maken:

Voorbeeld van gebruik:

  • Basis: {{ "message" | hmac_sha256: "secret_key" }}
  • Met geheimen (aanbevolen): {{ "message" | hmac_sha256: secrets.api_key }}

Voorbeelden van het gebruik van variabelen met Liquid in Shopify Flow

Bekijk de volgende voorbeelden om een beter beeld te krijgen van het gebruik van Liquid-variabelen:

URL's voor resources uitvoeren

Je wilt de URL's uitvoeren voor de klant, bestelling en het product die bij een workflow betrokken zijn.

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

Een lijst met tags naar een metaveld omzetten

Je wilt een set tags omzetten naar een metaveld dat een lijst met tekstvelden van één regel is. Je maakt een workflow aan met de trigger Product toegevoegd aan winkel en gebruikt de actie Productmetaveld bijwerken. In de sectie Waarde van de actie Productmetaveld bijwerken voeg je de volgende Liquid-code toe. In dit voorbeeld wordt ervan uitgegaan dat je de waarden maar één keer hoeft in te stellen wanneer het product wordt aangemaakt en dat het product twee relevante tags heeft: color:red en color:orange.

Voorbeeld van Liquid om de lijst van een tekstveld van één regel in te stellen.
InvoerUitvoer
{% 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"]

Een dynamisch e-mailbericht voor een bestelling schrijven

Je wilt een workflow aanmaken om een e-mail naar een medewerker te sturen wanneer een klant meer dan $ 500 aan een bestelling besteedt. Je maakt een workflow aan met de trigger Bestelling aangemaakt, stelt een voorwaarde in die waar is als het totaalbedrag van de bestelling hoger is dan $ 500 en gebruikt de actie Interne e-mail verzenden. In de sectie Bericht van de actie Interne e-mail verzenden gebruik je de volgende variabelen.

Voorbeeld van het gebruik van variabelen om klantgegevens te verstrekken.
InvoerUitvoer
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 }}.
Stuur een persoonlijk bedankje naar Jeanne Dupont (jeanne@example.com) voor het plaatsen van een bestelling van $ 763,42.

Een dynamisch e-mailbericht schrijven voor een product met een lage voorraad

Je besluit dat je een medewerker moet informeren wanneer de productvoorraad laag wordt en er meer voorraad moet worden besteld. Je maakt een workflow aan die begint met de trigger Voorraadaantal gewijzigd en stelt een voorwaarde in die waar is als het vorige voorraadaantal kleiner is dan of gelijk is aan 10. In de sectie Bericht van de actie Interne e-mail verzenden gebruik je de volgende variabelen.

Voorbeeld van het gebruik van variabelen om artikelgegevens te verstrekken.
InvoerUitvoer
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Bestel Legging met hoge taille - Zwart opnieuw. E-mail owner@example.com om te verifiëren dat ze de inkooporder hebben ontvangen.

Een dynamisch e-mailbericht schrijven om medewerkers op de hoogte te stellen van een frauduleuze bestelling

Je wilt bestellingen met een hoog risiconiveau annuleren, maar geeft er de voorkeur aan dat je medewerkers de bestelling handmatig annuleren. Je maakt een workflow aan die begint met de trigger Bestelling aangemaakt en stelt een voorwaarde in die waar is als het risiconiveau van de bestelling gelijk is aan 'hoog'. In de sectie Bericht van de actie Interne e-mail verzenden gebruik je de volgende variabelen.

Voorbeeld van het gebruik van variabelen om informatie over een frauduleuze bestelling te verstrekken.
InvoerUitvoer
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!
Onze Shopify-winkel heeft een bestelling ontvangen met een hoog risico op fraude. We willen deze bestelling direct annuleren, voordat deze naar productie wordt gestuurd:

#1001
Dupont, Jeanne
jeanne@example.com

Bevestig de nieuwe bestelstatus. Bedankt!

De orderregels voor een bestelling uitvoeren met een for-loop

Wanneer een bestelling wordt ontvangen, kan het handig zijn een bericht te sturen met de bestelde producten. Dit kun je doen met een for-loop, die herhaaldelijk een codeblok uitvoert. Tekstvelden die variabelen ondersteunen, ondersteunen ook for-loops en het forloop-object.

Stel, je wilt een workflow aanmaken die een lijst genereert met alle SKU's en hoeveelheden in een bestelling. In de sectie Bericht van de actie Interne e-mail verzenden gebruik je de volgende variabelen.

Voorbeeld van het gebruik van een for-loop om bestelgegevens weer te geven.
InvoerUitvoer
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Besteloverzicht:
8987097979 (50)
8877778887 (3)
888998898B (1)

Orderregels voor een bestelling weergeven met een for-loop en extra informatie

Je besluit meer informatie aan de e-mail toe te voegen, zoals de productnaam, SKU's, de prijs per artikel en de verzendgegevens van de klant. In de sectie Bericht van de actie Interne e-mail verzenden gebruik je de volgende variabelen.

Voorbeeld van het gebruik van een for-loop om uitgebreidere bestelgegevens weer te geven.
InvoerUitvoer
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Besteloverzicht:
Product: High Waist Leggings - Black
SKU: 8987097979
Prijs (per stuk): $ 8,49
Aantal: 5
Product: Athletic Socks - Blue
SKU: 888998898B
Prijs (per stuk): $ 5,61
Aantal: 2

Bepaalde orderregels weergeven door een for-loop met een if-statement te combineren

Je wilt verkochte artikelen volgen die door een specifieke verkoper worden geleverd. In de sectie Bericht van de actie Interne e-mail verzenden gebruik je de volgende variabelen en voeg je een if-statement toe aan je for-loop.

Voorbeeld van het gebruik van een for-loop en if-statement om bestelgegevens voor specifieke verkopers weer te geven.
InvoerUitvoer
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Acme-product verkocht:
Productnaam: High Waist Leggings - Black
SKU: 8987097979

Complexe dataobjecten in Shopify Flow

Met Flow heb je toegang tot bijna alle gegevens in de GraphQL Admin API. Dit omvat complexe dataobjecten, zoals lijsten en objecten. Er zijn echter enkele beperkingen aan wat je met deze objecten kunt doen. In deze sectie worden deze beperkingen beschreven en vind je voorbeelden van hoe je ermee kunt werken.

In plaats van lijsten en objecten rechtstreeks aan te roepen, moet je de lijst doorlopen en alleen de gewenste velden opnemen.

In plaats van {{ order.lineItems }} rechtstreeks aan te roepen, gebruik je bijvoorbeeld de volgende indeling om specifieke velden aan te roepen. Deze voorbeelden bevatten alle velden die zouden worden opgenomen door de lijst of het object rechtstreeks aan te roepen. Kopieer en plak de velden die je nodig hebt.

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

}