Brug af Liquid-variabler i Shopify Flow

Liquid-variabler er pladsholdere defineret i Liquid, som erstattes af værdier fra GraphQL Admin API, når et workflow køres. Variabler kan beskrive de attributter for kunder, ordrer og produkter, der indgår i dine workflows, f.eks. ordrenummer, ordrepris eller kundenavn. Variabler kan bruges i betingelser til at styre logikken i dit workflow eller til at levere data fra en handling.

Tilføjelse af variabler i workflows ved hjælp af Liquid

Du kan tilføje variabler ved hjælp af Liquid i ethvert tekstfelt, der indeholder linket Tilføj en variabel. Klik på linket Tilføj en variabel under det relevante felt, og vælg derefter en variabel på listen.

Billede af konfigurationspanelet for handlingen Send intern mail, der fremhæver muligheden 'Tilføj variabel' under feltet Emne.

Variablerne på listen Tilføj en variabel er filtreret, så du kun bruger de variabler, der returneres af trin før det nuværende trin, f.eks. udløsere. Udløseren Ordre oprettet indeholder f.eks. ordre- og butiksressourcer fra Admin API, der kan indsættes som variabler. Når du har valgt en variabel på listen, føjes den til tekstfeltet som korrekt formateret Liquid.

Du kan også skrive Liquid direkte i tekstfeltet. Du kan f.eks. bruge variablen {{ order.name }} til at vise ordrestrengen fra Shopify-administratoren, f.eks. ordre-123.

Da Flow bruger Admin API til at hente de data, der bruges til Liquid, anvender variabelsyntaksen camel case. I camel case-variabler starter det første ord med et lille bogstav, og efterfølgende ord starter med et stort bogstav, f.eks. firstName eller canMarkAsPaid. Hvis du f.eks. vil have adgang til den dato, hvor et produkt blev oprettet, skal du angive {{ product.createdAt }}. Hvis du bruger Liquid-syntaksen i et Shopify-tema, som ikke bruger camel case, skal du i stedet angive {{ product.created_at }}.

Betingede og gentagende Liquid-tags

Liquid-tags kan bruges sammen med variabler til at udføre følgende funktioner:

  • Skrive betingede erklæringer, f.eks. afgøre om en ordres samlede beløb er større end 100 USD.
  • Gentage en liste over objekter, f.eks. vise data for hver varelinje i en ordre.

Du kan bruge Liquid-tags til at skrive disse erklæringer og gentage objekter.

Følgende Liquid viser f.eks. ordrenummeret, hvis ordrens samlede beløb er større end 100 USD:

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

Du kan også bruge en for-løkke til at gentage en liste over objekter, f.eks. varelinjer for en ordre. Følgende Liquid viser f.eks. navnet på hver varelinje i en ordre:

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

Flow understøtter følgende betingede (eller kontrolflow) Liquid-tags:

Flow understøtter også følgende gentagende Liquid-tags:

Anvendelse af filtre på variabler

Du kan transformere variabeldata i Liquid ved hjælp af filtre. Flow understøtter alle open source-Liquid-filtre.

Følgende Liquid fjerner f.eks. et præfiks fra et ordrenavn og viser det, der er tilbage: {{ order.name | remove: "Ordre-" }}

Overvejelser i forbindelse med brug af Liquid-variabler i filtre

Gennemgå følgende overvejelser, før du transformerer variabler ved hjælp af filtre:

  • Flow understøtter ikke punktnotation, som er tilgængelig for nogle filtre. Flow understøtter f.eks. {{ order.lineItems | size }}, men ikke {{ order.lineItems.size }}.
  • Flow understøtter ikke punktnotation for metafelter. Du kan f.eks. ikke bruge {{ order.metafields.custom.hold_note }}. I stedet skal du gennemløbe metafelterne som beskrevet i eksemplerne.
  • Flow understøtter ikke brug af indekser til at få adgang til varer på en liste. Du kan f.eks. ikke bruge {{ order.lineItems[0].title }}. I stedet skal du gennemløbe varelinjerne som beskrevet i eksemplerne.

Datofiltre

Ud over standard Liquid-filtrene indeholder Flow datofiltre til at hente en dato i forhold til en anden dato for at understøtte funktionerne Planlagt tidspunkt-udløser og Hent data. Disse filtre er: date_minus og date_plus. For eksempel:

  • Sådan returneres en dato én dag ude i fremtiden: {{ "now" | date_plus: "1 day" }}
  • Sådan returneres en dato én dag tilbage i tiden: {{ "now" | date_minus: "1 day" }}

Disse filtre accepterer second, minute, day, week, month og year som varighedsenhed, både i ental (f.eks. second) og flertal (f.eks. seconds). Du kan også angive følgende typer af enheder, der kan tilpasses:

  • Et heltal, der repræsenterer antallet af sekunder: {{ "now" | date_minus: 3600 }}, hvor 3600 svarer til 1 time.
  • En ISO8601-varighedsstreng: {{ "now" | date_minus: "P1Y2D" }}, hvor P1Y2D betyder 1 år og 2 dage.

Kryptografiske filtre

Flow indeholder kryptografiske filtre til hashing og oprettelse af hash-baserede meddelelsesgodkendelseskoder (HMAC'er). Disse filtre er nyttige til at oprette unikke identifikatorer, kontrolsummer eller til integration med tredjepartssystemer, der kræver specifikke hashformater.

Hashingfiltre

Shopify Flow understøtter følgende typer hashingfiltre:

  • blake3 – Opretter en BLAKE3-hash (anbefales til generel brug).
  • sha256 – Opretter en SHA-256-hash.
  • sha1 – Opretter en SHA-1-hash.
  • md5 – Opretter en MD5-hash.

Til generelle hashingformål og nye implementeringer bør du bruge blake3, da den giver overlegen ydeevne og sikkerhed sammenlignet med ældre algoritmer. sha256, sha1 og md5 er dog tilgængelige af hensyn til kompatibilitet med tredjepartssystemer.

Eksempel på brug: {{ "hello world" | blake3 }} returnerer BLAKE3-hashen for “hello world”.

HMAC-filtre

Hvis du vil oprette en HMAC med en hemmelig nøgle, skal du bruge et af følgende understøttede filtre:

Eksempel på brug:

  • Grundlæggende: {{ "message" | hmac_sha256: "secret_key" }}
  • Med hemmeligheder (anbefales): {{ "message" | hmac_sha256: secrets.api_key }}

Eksempler på brug af variabler med Liquid i Shopify Flow

Du kan få en bedre fornemmelse af, hvordan du bruger Liquid-variabler, ved at se på følgende eksempler:

Output webadresser for ressourcer

Du vil gerne vise webadresserne for den kunde, ordre og det produkt, der er involveret i et 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>

Konverter en liste over tags til et metafelt

Du vil gerne konvertere et sæt tags til et metafelt, der er en liste over tekstfelter med en enkelt linje. Du opretter et workflow ved hjælp af udløseren Produkt føjet til butik og bruger handlingen Opdater produktmetafelt. I afsnittet Værdi under handlingen Opdater produktmetafelt tilføjer du følgende Liquid-kode. I dette eksempel antages det, at du kun behøver at angive værdierne én gang, når produktet oprettes, og at produktet har to relevante tags: color:red og color:orange.

Eksempel på Liquid til at angive listen over et tekstfelt med en enkelt linje.
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"]

Skriv en dynamisk mail for en ordre

Du vil oprette et workflow, der sender en mail til en medarbejder, når en kunde bruger mere end 500 USD på en ordre. Du opretter et workflow ved hjælp af udløseren Ordre oprettet, angiver en betingelse, der er sand, hvis ordretotalen er over 500 USD, og bruger handlingen Send intern mail. I afsnittet Besked under handlingen Send intern mail bruger du følgende variabler.

Eksempel på brug af variabler til at angive kundeoplysninger.
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 }}.
Send venligst en personlig tak til Jeanne Dupont (jeanne@example.com) for at have afgivet en ordre på 763,42 USD.

Skriv en dynamisk mail for et produkt med lav lagerbeholdning

Du beslutter dig for, at du vil informere en medarbejder, når lagerbeholdningen for et produkt er ved at være lav, og der skal bestilles flere varer. Du opretter et workflow, der starter med udløseren Lagerantal ændret, og angiver en betingelse, der er sand, hvis det tidligere lagerantal er mindre end eller lig med 10. I afsnittet Besked under handlingen Send intern mail bruger du følgende variabler.

Eksempel på brug af variabler til at angive vareoplysninger.
InputOutput
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Genbestil venligst High Waist Leggings – Sort. Mail til owner@example.com for at bekræfte, at de har modtaget købsordren.

Skriv en dynamisk mail for at give en medarbejder besked om en svigagtig ordre

Du vil gerne annullere ordrer, der har et højt risikoniveau, men foretrækker, at dine medarbejdere annullerer ordren manuelt. Du opretter et workflow, der starter med udløseren Ordre oprettet, og angiver en betingelse, der er sand, hvis ordrens risikoniveau er lig med højt. I afsnittet Besked under handlingen Send intern mail bruger du følgende variabler.

Eksempel på brug af variabler til at give oplysninger om en svigagtig ordre.
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!
Vores Shopify-butik har modtaget en ordre med høj risiko for svindel. Vi vil gerne annullere denne ordre med det samme, før den sendes til produktion:

#1001
Dupont, Jeanne
jeanne@example.com

Bekræft den nye ordrestatus. På forhånd tak!

Output varelinjerne for en ordre ved hjælp af en for-løkke

Når der modtages en ordre, kan det være nyttigt at sende en besked, der indeholder de bestilte produkter. Du kan gøre dette ved hjælp af en for-løkke, som gentagne gange udfører en kodeblok. Tekstfelter, der understøtter variabler, understøtter også for-løkker og forloop-objektet.

Du vil f.eks. oprette et workflow, der returnerer en liste over alle SKU'er og antal i en ordre. I sektionen Besked i handlingen Send intern mail bruger du følgende variabler.

Eksempel på brug af for-løkke til at angive ordreoplysninger.
InputOutput
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Ordreoversigt:
8987097979 (50)
8877778887 (3)
888998898B (1)

Vis varelinjer for en ordre ved hjælp af en for-løkke med yderligere oplysninger

Du beslutter dig for at føje flere oplysninger til mailen, herunder produktnavn, SKU'er, pris pr. vare og kundens forsendelsesoplysninger. I sektionen Besked i handlingen Send intern mail bruger du følgende variabler.

Eksempel på brug af for-løkke til at angive mere omfattende ordreoplysninger.
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 %}
Ordreoversigt:
Produkt: High Waist Leggings - Black
SKU: 8987097979
Pris (pr. enhed): 8,49 USD
Antal: 5
Produkt: Athletic Socks - Blue
SKU: 888998898B
Pris (pr. enhed): 5,61 USD
Antal: 2

Vis nogle varelinjer ved at kombinere en for-løkke med en if-sætning

Du skal spore solgte varer, der leveres af en bestemt forhandler. I sektionen Besked i handlingen Send intern mail bruger du følgende variabler og inkluderer en if-sætning i din for-løkke.

Eksempel på brug af for-løkke og if-sætning til at angive ordreoplysninger for bestemte forhandlere.
InputOutput
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Solgt Acme-produkt:
Produktnavn: High Waist Leggings - Black
SKU: 8987097979

Komplekse dataobjekter i Shopify Flow

Flow giver dig adgang til næsten alle data i GraphQL Admin API. Dette omfatter komplekse dataobjekter, f.eks. lister og objekter. Der er dog nogle begrænsninger for, hvad du kan gøre med disse objekter. I dette afsnit beskrives disse begrænsninger, og der gives eksempler på, hvordan du kan arbejde med dem.

I stedet for at kalde lister og objekter direkte, bør du gennemløbe listen og kun medtage de felter, du vil have.

I stedet for at kalde {{ order.lineItems }} direkte kan du f.eks. bruge følgende format til at kalde bestemte felter. Disse eksempler indeholder alle de felter, der ville blive inkluderet, hvis du kaldte listen eller objektet direkte. Kopiér og indsæt de felter, du har brug for.

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

}