Bruke Liquid-variabler i Shopify Flow

Liquid-variabler er plassholdere definert i Liquid, som erstattes med verdier fra GraphQL Admin API når en arbeidsflyt kjører. Variabler kan beskrive egenskapene til kundene, bestillingene og produktene som er involvert i arbeidsflytene, for eksempel ordrenummer, bestillingspris eller kundenavn. Variabler kan brukes i betingelser for å kontrollere logikken i arbeidsflyten, eller for å sende ut data fra en handling.

Legge til variabler i arbeidsflyter ved hjelp av Liquid

Du kan legge til variabler med Liquid i alle tekstfelt som inneholder Legg til en variabel-koblingen. Klikk på Legg til en variabel-koblingen under det relevante feltet, og velg deretter en variabel fra listen.

Bilde av konfigurasjonspanelet til «Send intern e-post»-handlingen, som fremhever «Legg til variabel»-alternativet under Emne-feltet.

Variablene i listen Legg til en variabel filtreres, slik at du bare bruker variablene som returneres av trinn før det gjeldende trinnet, som for eksempel utløsere. For eksempel gir Bestilling opprettet-utløseren bestillings- og butikkressurser fra Admin API som kan settes inn som variabler. Når du har valgt en variabel fra listen, legges den til i tekstboksen som korrekt formatert Liquid.

Du kan også skrive Liquid direkte i tekstfeltet. Du kan for eksempel bruke variabelen {{ order.name }} for å vise ordrenavnet fra Shopify-administrator, som for eksempel order-123.

Siden Flow bruker Admin API til å hente dataene som brukes til Liquid, bruker variabelsyntaksen camel case. I camel case-variabler starter det første ordet med en liten bokstav, og de påfølgende ordene starter med en stor bokstav, som for eksempel firstName eller canMarkAsPaid. For å få tilgang til datoen et produkt ble opprettet, skriver du for eksempel inn {{ product.createdAt }}. Hvis du bruker Liquid-syntaksen i et Shopify-tema, som ikke bruker camel case, skriver du inn {{ product.created_at }}.

Betingede Liquid-tagger og iterasjonstagger

Liquid-tagger kan brukes med variabler til å utføre følgende funksjoner:

  • Skrive betingede setninger, som for eksempel å avgjøre om en ordresum er større enn 100 USD.
  • Iterere gjennom en liste over objekter, som for eksempel å sende ut data for hver post i en bestilling.

Du kan bruke Liquid-tagger til å skrive disse setningene og iterere gjennom objekter.

Følgende Liquid viser for eksempel ordrenummeret hvis ordresummen er større enn 100 USD:

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

Du kan også bruke en for-løkke til å iterere gjennom en liste over objekter, som poster for en bestilling. Følgende Liquid viser for eksempel navnet på hver post i en bestilling:

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

Flow støtter følgende betingede (eller kontrollflyt) Liquid-tagger:

Flow støtter også følgende Liquid-iterasjonstagger:

Bruke filtre på variabler

Du kan transformere variabeldata i Liquid ved hjelp av filtre. Flow støtter alle Liquid-filtrene med åpen kildekode.

Følgende Liquid fjerner for eksempel et prefiks fra et ordrenavn og sender ut det som er igjen: {{ order.name | remove: "Order-" }}

Hensyn ved bruk av Liquid-variabler i filtre

Før du transformerer variabler ved hjelp av filtre, bør du se gjennom følgende hensyn:

  • Flow støtter ikke punktnotasjon som er tilgjengelig for enkelte filtre. Flow støtter for eksempel {{ order.lineItems | size }}, men ikke {{ order.lineItems.size }}.
  • Flow støtter ikke punktnotasjon for metafelt. Du kan for eksempel ikke bruke {{ order.metafields.custom.hold_note }}. I stedet må du løkke gjennom metafelt som beskrevet i eksemplene.
  • Flow støtter ikke bruk av indekser for å få tilgang til elementer i en liste. Du kan for eksempel ikke bruke {{ order.lineItems[0].title }}. I stedet må du løkke gjennom postene som beskrevet i eksemplene.

Datofiltre

I tillegg til standard Liquid-filtrene har Flow datofiltre for å hente en dato i forhold til en annen dato, for å støtte Planlagt tidspunkt-utløseren og Hent data-funksjonene. Disse filtrene er: date_minus og date_plus. For eksempel:

  • Slik returnerer du en dato én dag frem i tid: {{ "now" | date_plus: "1 day" }}
  • Slik returnerer du en dato én dag tilbake i tid: {{ "now" | date_minus: "1 day" }}

Disse filtrene godtar second, minute, day, week, month og year som varighetsenhet, både i entall (som second) og i flertall (som seconds). Du kan også angi følgende typer tilpassbare enheter:

  • Et heltall som representerer antall sekunder: {{ "now" | date_minus: 3600 }}, der 3600 tilsvarer 1 time.
  • En ISO 8601-varighetsstreng: {{ "now" | date_minus: "P1Y2D" }}, der P1Y2D betyr 1 år og 2 dager.

Kryptografiske filtre

Flow tilbyr kryptografiske filtre for hashing og for å opprette hash-baserte meldingsautentiseringskoder (HMAC-er). Disse filtrene er nyttige for å opprette unike identifikatorer, kontrollsummer eller for å integrere med tredjepartssystemer som krever spesifikke hash-formater.

Hashing-filtre

Shopify Flow støtter følgende typer hashing-filtre:

  • blake3 – oppretter en BLAKE3-hash (anbefales for generell bruk).
  • sha256 – oppretter en SHA-256-hash.
  • sha1 – oppretter en SHA-1-hash.
  • md5 – oppretter en MD5-hash.

For generelle hashing-formål og nye implementeringer bør du bruke blake3, ettersom den gir overlegen ytelse og sikkerhet sammenlignet med eldre algoritmer. sha256, sha1 og md5 er imidlertid tilgjengelige for kompatibilitet med tredjepartssystemer.

Eksempel på bruk: {{ "hello world" | blake3 }} returnerer BLAKE3-hashen til «hello world».

HMAC-filtre

For å opprette en HMAC med en hemmelig nøkkel, kan du bruke ett av følgende støttede filtre:

Eksempel på bruk:

  • Grunnleggende: {{ "message" | hmac_sha256: "secret_key" }}
  • Med hemmeligheter (anbefalt): {{ "message" | hmac_sha256: secrets.api_key }}

Eksempler på bruk av variabler med Liquid i Shopify Flow

For å få en bedre forståelse av hvordan du bruker Liquid-variabler, kan du se på følgende eksempler:

Skriv ut URL-adresser for ressurser

Du vil skrive ut URL-adressene for kunden, bestillingen og produktet som er involvert i en arbeidsflyt.

# 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 med tagger til et metafelt

Du vil konvertere et sett med tagger til et metafelt som er en liste med enlinjes tekstfelt. Du oppretter en arbeidsflyt med utløseren Produkt lagt til i butikk, og bruker handlingen Oppdater produktmetafelt. I Verdi-seksjonen av handlingen Oppdater produktmetafelt legger du til følgende Liquid-kode. Dette eksempelet antar at du bare trenger å angi verdiene én gang når produktet opprettes, og at produktet har to relevante tagger: color:red og color:orange.

Eksempel på Liquid for å angi listen over et enlinjes tekstfelt.
InndataUtdata
{% 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 e-postmelding for en bestilling

Du vil opprette en arbeidsflyt for å sende en e-post til en ansatt når en kunde bruker mer enn 500 USD på en bestilling. Du oppretter en arbeidsflyt med utløseren Bestilling opprettet, angir en betingelse som er sann hvis totalsummen for bestillingen er over 500 USD, og bruker handlingen Send intern e-post. I Melding-delen av handlingen Send intern e-post bruker du følgende variabler.

Eksempel på variabelbruk for å oppgi kundeinformasjon.
InndataUtdata
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 en personlig takkemelding til Jeanne Dupont (jeanne@example.com) for å ha lagt inn en bestilling på 763,42 USD.

Skriv en dynamisk e-postmelding for et produkt med lavt lagerantall

Du bestemmer deg for at du må informere en ansatt når lagerbeholdningen til et produkt er lav og det må legges inn en bestilling på flere varer. Du oppretter en arbeidsflyt som starter med utløseren Lagerantall endret, og angir en betingelse som er sann hvis det forrige lagerantallet er mindre enn eller lik 10. I Melding-seksjonen av handlingen Send intern e-post bruker du følgende variabler.

Eksempel på variabelbruk for å oppgi vareinformasjon.
InndataUtdata
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Bestill High Waist Leggings – Black på nytt. Send e-post til owner@example.com for å bekrefte at de har mottatt innkjøpsordren.

Skriv en dynamisk e-postmelding for å varsle personalet om en falsk bestilling

Du vil kansellere bestillinger med høyt risikonivå, men foretrekker at personalet kansellerer bestillingen manuelt. Du oppretter en arbeidsflyt som starter med utløseren Bestilling opprettet, og angir en betingelse som er sann hvis risikonivået for bestillingen er lik høy. I Melding-seksjonen av handlingen Send intern e-post bruker du følgende variabler.

Eksempel på variabelbruk for å oppgi informasjon om en falsk bestilling.
InndataUtdata
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!
Shopify-butikken vår har mottatt en bestilling med høy risiko for svindel. Vi vil gjerne kansellere denne bestillingen med én gang, før den sendes til produksjon:

#1001
Dupont, Jeanne
jeanne@example.com

Bekreft den nye statusen for ordren. Takk!

Skriv ut postene for en bestilling ved hjelp av en for-løkke

Når en bestilling mottas, kan det være nyttig å sende en melding som inneholder produktene som er bestilt. Du kan gjøre dette ved å bruke en for-løkke, som utfører en kodeblokk gjentatte ganger. Tekstfelter som støtter variabler, støtter også for-løkker og forloop-objektet.

Du vil for eksempel opprette en arbeidsflyt som returnerer en liste over alle SKU-er og antall i en bestilling. I seksjonen Melding i handlingen Send intern e-post, bruker du følgende variabler.

Eksempel på bruk av for-løkke for å angi bestillingsinformasjon.
InndataUtdata
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Bestillingssammendrag:
8987097979 (50)
8877778887 (3)
888998898B (1)

Angi postene for en bestilling ved hjelp av en for-løkke med tilleggsinformasjon

Du bestemmer deg for å legge til mer informasjon i e-posten, inkludert produktnavn, SKU-er, pris per vare og kundens fraktinformasjon. I seksjonen Melding i handlingen Send intern e-post bruker du følgende variabler.

Eksempel på bruk av for-løkke for å angi mer omfattende bestillingsinformasjon.
InndataUtdata
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Bestillingssammendrag:
Produkt: High Waist Leggings – Black
SKU: 8987097979
Pris (per enhet): $ 8,49
Antall: 5
Produkt: Athletic Socks – Blue
SKU: 888998898B
Pris (per enhet): $ 5,61
Antall: 2

Angi noen poster ved å kombinere en for-løkke med en if-setning

Du må spore varer som selges, som leveres av en bestemt selger. I seksjonen Melding i handlingen Send intern e-post bruker du følgende variabler og inkluderer en if-setning i for-løkken.

Eksempel på bruk av for-løkke og if-setning for å angi bestillingsinformasjon for bestemte selgere.
InndataUtdata
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Acme-produkt solgt:
Produktnavn: High Waist Leggings – Black
SKU: 8987097979

Komplekse dataobjekter i Shopify Flow

Flow gir deg tilgang til nesten alle data som finnes i GraphQL Admin API. Dette inkluderer komplekse dataobjekter, som lister og objekter. Det er imidlertid noen begrensninger for hva du kan gjøre med disse objektene. Denne delen beskriver disse begrensningene og gir eksempler på hvordan du kan jobbe med dem.

I stedet for å kalle lister og objekter direkte, bør du iterere over listen og bare inkludere feltene du vil ha.

I stedet for å kalle {{ order.lineItems }} direkte, kan du for eksempel bruke følgende format til å kalle bestemte felt. Disse eksemplene inkluderer alle feltene som ville blitt inkludert ved å kalle listen eller objektet direkte. Kopier og lim inn feltene du trenger.

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

}