Använda Liquid-variabler i Shopify Flow

Liquid-variabler är platshållare definierade i Liquid som ersätts med värden från GraphQL Admin API när ett arbetsflöde körs. Variabler kan beskriva attributen för de kunder, ordrar och produkter som ingår i dina arbetsflöden, till exempel ordernummer, orderpris eller kundnamn. Variabler kan användas i villkor för att styra logiken i ditt arbetsflöde eller för att mata ut data från en åtgärd.

Lägga till variabler i arbetsflöden med Liquid

Du kan lägga till variabler med Liquid i alla textfält som innehåller länken Lägg till en variabel. Klicka på länken Lägg till en variabel under det relevanta fältet och välj sedan en variabel från listan.

Bild av konfigurationspanelen för åtgärden Skicka internt e-postmeddelande, som markerar alternativet ”Lägg till variabel” under fältet Ämne.

Variablerna i listan Lägg till en variabel filtreras, så att du endast använder de variabler som returneras av steg före det aktuella steget, till exempel utlösare. Utlösaren Order skapad tillhandahåller till exempel order- och butiksresurser från Admin API som kan infogas som variabler. När du har valt en variabel från listan läggs den till i textrutan som korrekt formaterad Liquid.

Du kan även skriva Liquid direkt i textfältet. Du kan till exempel använda variabeln {{ order.name }} för att visa ordersträngen från Shopify-admin, såsom order-123.

Eftersom Flow använder Admin API för att hämta de data som används för Liquid, använder variabelsyntaxen camel case. Camel case-variabler har det första ordet som börjar med en gemen och efterföljande ord börjar med en versal, till exempel firstName eller canMarkAsPaid. Om du till exempel vill komma åt det datum då en produkt skapades anger du {{ product.createdAt }}. Om du använder Liquid-syntaxen i ett Shopify-tema, som inte använder camel case, anger du istället {{ product.created_at }}.

Villkorliga Liquid-taggar och iterations-taggar

Liquid-taggar kan användas med variabler för att utföra följande funktioner:

  • Skriva villkorliga satser, till exempel för att avgöra om en ordersumma är större än 100 USD.
  • Iterera genom en lista med objekt, till exempel för att mata ut data för varje post i en order.

Du kan använda Liquid-taggar för att skriva dessa satser och iterera genom objekt.

Följande Liquid-kod visar till exempel ordernumret om ordersumman är större än 100 USD:

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

Du kan även använda en for-loop för att iterera genom en lista med objekt, till exempel poster för en order. Följande Liquid-kod visar till exempel namnet på varje post i en order:

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

Flow stöder följande villkorliga Liquid-taggar (eller kontrollflödestaggar):

Flow stöder även följande Liquid-iterationstaggar:

Tillämpa filter på variabler

Du kan omvandla variabeldata i Liquid med hjälp av filter. Flow stöder alla Liquid-filter med öppen källkod.

Följande Liquid-kod tar till exempel bort ett prefix från ett ordernamn och matar ut det som blir kvar: {{ order.name | remove: "Order-" }}

Att tänka på när du använder Liquid-variabler i filter

Granska följande överväganden innan du omvandlar variabler med hjälp av filter:

  • Flow stöder inte punktnotation som är tillgänglig för vissa filter. Till exempel stöder Flow {{ order.lineItems | size }} men inte {{ order.lineItems.size }}.
  • Flow stöder inte punktnotation för metafält. Du kan till exempel inte använda {{ order.metafields.custom.hold_note }}. Istället måste du loopa över metafälten enligt beskrivningen i exemplen.
  • Flow stöder inte användning av index för att komma åt artiklar i en lista. Du kan till exempel inte använda {{ order.lineItems[0].title }}. Istället måste du loopa över posterna enligt beskrivningen i exemplen.

Datumfilter

Utöver standardfiltren för Liquid tillhandahåller Flow datumfilter för att hämta ett datum i förhållande till ett annat datum för att stödja funktionerna för utlösaren Schemalagd tid och Hämta data. Dessa filter är: date_minus och date_plus. Exempel:

  • För att returnera ett datum en dag framåt i tiden: {{ "now" | date_plus: "1 day" }}
  • För att returnera ett datum en dag bakåt i tiden: {{ "now" | date_minus: "1 day" }}

Dessa filter accepterar second, minute, day, week, month och year som varaktighetsenhet, både i singular (som second) och plural (som seconds). Du kan även ange följande typer av anpassningsbara enheter:

  • Ett heltal som representerar antalet sekunder: {{ "now" | date_minus: 3600 }}, där 3 600 motsvarar 1 timme.
  • En ISO8601-varaktighetssträng: {{ "now" | date_minus: "P1Y2D" }}, där P1Y2D betyder 1 år och 2 dagar.

Kryptografiska filter

Flow tillhandahåller kryptografiska filter för hashning och för att skapa hash-baserade meddelandeautentiseringskoder (HMAC). Dessa filter är användbara för att skapa unika identifierare, kontrollsummor eller för att integrera med tredjepartssystem som kräver specifika hashformat.

Hashningsfilter

Shopify Flow har stöd för följande typer av hashningsfilter:

  • blake3 – Skapar en BLAKE3-hash (rekommenderas för allmän användning).
  • sha256 – Skapar en SHA-256-hash.
  • sha1 – Skapar en SHA-1-hash.
  • md5 – Skapar en MD5-hash.

För allmänna hashningsändamål och nya implementeringar bör du använda blake3, eftersom det erbjuder överlägsen prestanda och säkerhet jämfört med äldre algoritmer. Däremot finns sha256, sha1 och md5 tillgängliga för kompatibilitet med tredjepartssystem.

Exempel på användning: {{ "hello world" | blake3 }} returnerar BLAKE3-hashen för ”hello world”.

HMAC-filter

Använd ett av följande filter som stöds för att skapa en HMAC med en hemlig nyckel:

Exempel på användning:

  • Grundläggande: {{ "message" | hmac_sha256: "secret_key" }}
  • Med hemligheter (rekommenderas): {{ "message" | hmac_sha256: secrets.api_key }}

Exempel på hur du använder variabler med Liquid i Shopify Flow

Titta på följande exempel för att få en bättre uppfattning om hur du använder Liquid-variabler:

Mata ut URL:er för resurser

Du vill mata ut URL:erna för kunden, ordern och produkten som är involverade i ett arbetsflöde.

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

Konvertera en lista med taggar till ett metafält

Du vill konvertera en uppsättning taggar till ett metafält som är en lista över textfält med en rad. Du skapar ett arbetsflöde med utlösaren Produkt har lagts till i butik och använder åtgärden Uppdatera produktmetafält. I avsnittet Värde för åtgärden Uppdatera produktmetafält lägger du till följande Liquid-kod. Det här exemplet förutsätter att du bara behöver ange värdena en gång när produkten skapas och att produkten har två relevanta taggar: color:red och color:orange.

Exempel på Liquid för att ange listan för ett textfält med en rad.
IndataUtdata
{% 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"]

Skriv ett dynamiskt e-postmeddelande för en order

Du vill skapa ett arbetsflöde för att skicka ett e-postmeddelande till en anställd när en kund spenderar mer än 500 USD på en order. Du skapar ett arbetsflöde med utlösaren Order skapad, anger ett villkor som är sant om ordersumman är över 500 USD och använder åtgärden Skicka internt e-postmeddelande. I avsnittet Meddelande för åtgärden Skicka internt e-postmeddelande använder du följande variabler.

Exempel på variabelanvändning för att tillhandahålla kunduppgifter.
IndataUtdata
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 }}.
Skicka ett personligt tackkort till Jeanne Dupont (jeanne@example.com) för att ha lagt en order på 763,42 USD.

Skriv ett dynamiskt e-postmeddelande för en produkt med lågt lagersaldo

Du bestämmer dig för att du behöver informera en personalmedlem när en produkts lagersaldo börjar bli lågt och mer måste beställas. Du skapar ett arbetsflöde som startar med utlösaren Lagerkvantitet ändrad och anger ett villkor som är sant om den tidigare lagerkvantiteten är mindre än eller lika med 10. I avsnittet Meddelande för åtgärden Skicka internt e-postmeddelande använder du följande variabler.

Exempel på variabelanvändning för att tillhandahålla artikeluppgifter.
IndataUtdata
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Återbeställ High Waist Leggings – Black. Skicka e-post till owner@example.com för att verifiera att de har mottagit inköpsordern.

Skriv ett dynamiskt e-postmeddelande för att meddela personalen om en bedräglig order

Du vill annullera ordrar som har en hög risknivå, men föredrar att din personal annullerar ordern manuellt. Du skapar ett arbetsflöde som startar med utlösaren Order skapad och anger ett villkor som är sant om orderns risknivå är lika med hög. I avsnittet Meddelande för åtgärden Skicka internt e-postmeddelande använder du följande variabler.

Exempel på variabelanvändning för att tillhandahålla information om en bedräglig order.
IndataUtdata
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!
Vår Shopify-butik har fått en order med hög risk för bedrägeri. Vi vill annullera denna order omedelbart, innan den skickas till produktion:

#1001
Dupont, Jeanne
jeanne@example.com

Bekräfta den nya orderstatusen. Tack!

Mata ut orderposter med en for-loop

När en order tas emot kan det vara användbart att skicka ett meddelande som innehåller de beställda produkterna. Du kan göra det genom att använda en for loop, som upprepade gånger kör ett kodblock. Textfält som stöder variabler stöder även for-loopar och forloop-objektet.

Om du till exempel vill skapa ett arbetsflöde som returnerar en lista över alla SKU:er och antal i en order använder du följande variabler i avsnittet Meddelande för åtgärden Skicka internt e-postmeddelande.

Exempel på användning av for-loop för att tillhandahålla orderinformation.
IndataUtdata
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Ordersammanfattning:
8987097979 (50)
8877778887 (3)
888998898B (1)

Mata ut poster för en order med hjälp av en for-loop med ytterligare information

Du bestämmer dig för att lägga till mer information i e-postmeddelandet, inklusive produktnamn, SKU:er, styckpris och kundens fraktinformation. I avsnittet Meddelande för åtgärden Skicka internt e-postmeddelande använder du följande variabler.

Exempel på användning av for-loop för att tillhandahålla mer omfattande orderinformation.
IndataUtdata
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Ordersammanfattning:
Produkt: High Waist Leggings - Black
SKU: 8987097979
Pris (per enhet): 8,49 $
Kvantitet: 5
Produkt: Athletic Socks - Blue
SKU: 888998898B
Pris (per enhet): 5,61 $
Kvantitet: 2

Mata ut vissa poster genom att kombinera en for-loop med en if-sats

Du behöver spåra sålda artiklar som levereras av en specifik säljare. I avsnittet Meddelande för åtgärden Skicka internt e-postmeddelande använder du följande variabler och inkluderar en if-sats i din for-loop.

Exempel på användning av for-loop och if-sats för att tillhandahålla orderinformation för specifika säljare.
IndataUtdata
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Acme-produkt såld:
Produktnamn: High Waist Leggings - Black
SKU: 8987097979

Komplexa dataobjekt i Shopify Flow

Flow ger dig åtkomst till nästan all data som finns i GraphQL Admin API. Det inkluderar komplexa dataobjekt, såsom listor och objekt. Det finns dock vissa begränsningar för vad du kan göra med dessa objekt. I det här avsnittet beskrivs dessa begränsningar och det ges exempel på hur du kan arbeta med dem.

Istället för att anropa listor och objekt direkt bör du loopa över listan och endast inkludera de fält du vill ha.

I stället för att anropa {{ order.lineItems }} direkt, använd till exempel följande format för att anropa specifika fält. Dessa exempel inkluderar alla fält som skulle inkluderas genom att anropa listan eller objektet direkt. Kopiera och klistra in de fält du behöver.

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

}