Menggunakan variabel Liquid di Shopify Flow

Variabel Liquid adalah placeholder yang ditentukan di Liquid, yang diganti dengan nilai dari GraphQL Admin API saat alur kerja dieksekusi. Variabel dapat menjelaskan atribut pelanggan, pesanan, dan produk yang terlibat dalam alur kerja Anda, seperti nomor pesanan, harga pesanan, atau nama pelanggan. Variabel dapat digunakan di kondisi untuk mengontrol logika dalam alur kerja Anda, atau untuk mengeluarkan data dari tindakan.

Menambahkan variabel di alur kerja menggunakan Liquid

Anda dapat menambahkan variabel menggunakan Liquid ke kolom teks mana pun yang berisi tautan Tambahkan variabel. Klik tautan Tambahkan variabel di bawah kolom yang relevan, lalu pilih variabel dari daftar.

Gambar panel konfigurasi tindakan Kirim email internal, menyoroti opsi 'Tambahkan variabel' di bawah kolom Subjek.

Variabel dalam daftar Tambahkan variabel difilter, sehingga Anda hanya menggunakan variabel yang dikembalikan oleh langkah-langkah sebelum langkah saat ini, seperti pemicu. Misalnya, pemicu Pesanan Dibuat menyediakan resource pesanan dan toko dari Admin API yang dapat disisipkan sebagai variabel. Setelah Anda memilih variabel dari daftar, variabel tersebut ditambahkan ke kotak teks dalam format Liquid yang benar.

Anda juga dapat menulis Liquid langsung di kolom teks. Misalnya, Anda dapat menggunakan variabel {{ order.name }} untuk menampilkan string pesanan dari admin Shopify, seperti order-123.

Karena Flow menggunakan Admin API untuk mengambil data yang digunakan untuk Liquid, sintaksis variabelnya menggunakan camel case. Variabel camel case memiliki kata pertama yang diawali dengan huruf kecil, dan kata-kata berikutnya diawali dengan huruf besar, seperti firstName atau canMarkAsPaid. Misalnya, untuk mengakses tanggal saat produk dibuat, masukkan {{ product.createdAt }}. Jika Anda menggunakan sintaksis Liquid di tema Shopify, yang tidak menggunakan camel case, Anda akan memasukkan {{ product.created_at }}.

Tag Liquid kondisional dan iterasi

Tag Liquid dapat digunakan dengan variabel untuk melakukan fungsi-fungsi berikut:

  • Menulis pernyataan kondisional, seperti menentukan apakah total pesanan lebih besar dari $100.
  • Melakukan iterasi pada daftar objek, seperti menampilkan data untuk setiap item pesanan dalam suatu pesanan.

Anda dapat menggunakan tag Liquid untuk menulis pernyataan ini dan melakukan iterasi pada objek.

Misalnya, Liquid berikut menampilkan nomor pesanan jika total pesanan lebih dari $100:

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

Anda juga dapat menggunakan loop for untuk melakukan iterasi pada daftar objek, seperti item pesanan untuk suatu pesanan. Misalnya, Liquid berikut menampilkan nama setiap item pesanan dalam sebuah pesanan:

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

Flow mendukung tag kondisional (atau alur kontrol) Liquid berikut:

Flow juga mendukung tag iterasi Liquid berikut:

Menerapkan filter ke variabel

Anda dapat mengubah data variabel di Liquid menggunakan filter. Flow mendukung semua filter Liquid sumber terbuka.

Misalnya, Liquid berikut menghapus prefiks dari nama pesanan dan menampilkan sisanya: {{ order.name | remove: "Order-" }}

Pertimbangan untuk menggunakan variabel Liquid dalam filter

Sebelum mengubah variabel menggunakan filter, tinjau pertimbangan berikut:

  • Flow tidak mendukung notasi titik yang tersedia untuk beberapa filter. Misalnya, Flow mendukung {{ order.lineItems | size }} tetapi tidak mendukung {{ order.lineItems.size }}.
  • Flow tidak mendukung notasi titik untuk metafield. Misalnya, Anda tidak dapat menggunakan {{ order.metafields.custom.hold_note }}. Sebaliknya, Anda harus melakukan loop pada metafield seperti yang diuraikan dalam contoh.
  • Flow tidak mendukung penggunaan indeks untuk mengakses item dalam daftar. Misalnya, Anda tidak dapat menggunakan {{ order.lineItems[0].title }}. Sebagai gantinya, Anda harus melakukan loop pada item pesanan seperti yang diuraikan dalam contoh.

Filter tanggal

Selain filter Liquid standar, Flow menyediakan filter tanggal untuk mendapatkan tanggal yang relatif terhadap tanggal lain guna mendukung pemicu Waktu terjadwal dan fitur Dapatkan data. Filter ini adalah: date_minus dan date_plus. Contoh:

  • Untuk mengembalikan tanggal satu hari di masa mendatang: {{ "now" | date_plus: "1 day" }}
  • Untuk mengembalikan tanggal satu hari di masa lalu: {{ "now" | date_minus: "1 day" }}

Filter ini menerima second, minute, day, week, month, dan year sebagai unit durasi, baik tunggal (seperti second) maupun jamak (seperti seconds). Anda juga dapat memberikan jenis unit yang dapat disesuaikan berikut:

  • Bilangan bulat yang mewakili jumlah detik: {{ "now" | date_minus: 3600 }}, dengan 3600 setara dengan 1 jam.
  • String durasi ISO8601: {{ "now" | date_minus: "P1Y2D" }}, dengan P1Y2D berarti 1 tahun dan 2 hari.

Filter kriptografi

Flow menyediakan filter kriptografi untuk hashing dan membuat Kode Autentikasi Pesan Berbasis Hash (HMAC). Filter ini berguna untuk membuat pengidentifikasi unik, checksum, atau berintegrasi dengan sistem pihak ketiga yang memerlukan format hash tertentu.

Filter hashing

Shopify Flow mendukung jenis filter hashing berikut:

  • blake3 - Membuat hash BLAKE3 (disarankan untuk penggunaan umum).
  • sha256 - Membuat hash SHA-256.
  • sha1 - Membuat hash SHA-1.
  • md5 - Membuat hash MD5.

Untuk tujuan hashing umum dan implementasi baru, sebaiknya gunakan blake3 karena menawarkan performa dan keamanan yang lebih unggul dibandingkan algoritme yang lebih lama. Namun, sha256, sha1, dan md5 tersedia untuk kompatibilitas dengan sistem pihak ketiga.

Contoh penggunaan: {{ "hello world" | blake3 }} menghasilkan hash BLAKE3 dari "hello world".

Filter HMAC

Untuk membuat HMAC dengan kunci rahasia, gunakan salah satu filter yang didukung berikut:

Contoh penggunaan:

  • Dasar: {{ "message" | hmac_sha256: "secret_key" }}
  • Dengan rahasia (disarankan): {{ "message" | hmac_sha256: secrets.api_key }}

Contoh penggunaan variabel dengan Liquid di Shopify Flow

Untuk mendapatkan pemahaman yang lebih baik tentang cara menggunakan variabel Liquid, pertimbangkan contoh-contoh berikut:

Menghasilkan URL untuk sumber daya

Anda ingin menghasilkan URL untuk pelanggan, pesanan, dan produk yang terlibat dalam alur kerja.

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

Mengonversi daftar tag ke metafield

Anda ingin mengonversi satu set tag ke metafield yang merupakan daftar kolom teks satu baris. Anda membuat alur kerja menggunakan pemicu Produk ditambahkan ke toko, dan menggunakan tindakan Perbarui metafield produk. Di bagian Nilai dari tindakan Perbarui metafield produk, Anda menambahkan kode liquid berikut. Contoh ini mengasumsikan bahwa Anda hanya perlu mengatur nilai sekali saat produk dibuat, dan produk tersebut memiliki dua tag yang relevan: color:red dan color:orange.

Contoh liquid untuk mengatur daftar kolom teks satu baris.
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"]

Menulis pesan email dinamis untuk pesanan

Anda ingin membuat alur kerja untuk mengirim email kepada karyawan ketika pelanggan membelanjakan lebih dari $500 untuk sebuah pesanan. Anda membuat alur kerja menggunakan pemicu Pesanan dibuat, mengatur kondisi yang bernilai benar jika total pesanan di atas $500, dan menggunakan tindakan Kirim email internal. Di bagian Pesan dari tindakan Kirim email internal, Anda menggunakan variabel berikut.

Contoh penggunaan variabel untuk memberikan detail pelanggan.
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 }}.
Harap kirim catatan terima kasih pribadi kepada Jeanne Dupont (jeanne@example.com) karena telah memesan senilai $763,42.

Menulis pesan email dinamis untuk produk yang stoknya hampir habis

Anda memutuskan bahwa Anda perlu memberi tahu anggota staf ketika inventaris produk hampir habis dan pesanan perlu dibuat untuk menambah stok. Anda membuat alur kerja yang dimulai dengan pemicu Jumlah inventaris diubah, dan menetapkan kondisi yang bernilai benar jika jumlah inventaris sebelumnya kurang dari atau sama dengan 10. Di bagian Pesan dari tindakan Kirim email internal, Anda menggunakan variabel berikut.

Contoh penggunaan variabel untuk memberikan detail item.
InputOutput
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Harap pesan ulang High Waist Leggings - Black. Email owner@example.com untuk memverifikasi bahwa mereka telah menerima pesanan pembelian.

Menulis pesan email dinamis untuk memberitahukan staf tentang pesanan mencurigakan

Anda ingin membatalkan pesanan yang memiliki tingkat risiko tinggi, tetapi lebih memilih staf Anda untuk membatalkan pesanan secara manual. Anda membuat alur kerja yang dimulai dengan pemicu Pesanan dibuat, dan mengatur kondisi yang bernilai benar jika tingkat risiko pesanan sama dengan tinggi. Di bagian Pesan dari tindakan Kirim email internal, Anda menggunakan variabel berikut.

Contoh penggunaan variabel untuk memberikan informasi tentang pesanan mencurigakan.
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!
Toko Shopify kami telah menerima pesanan dengan risiko penipuan tinggi. Kami ingin segera membatalkan pesanan ini, sebelum dikirim ke produksi:

#1001
Dupont, Jeanne
jeanne@example.com

Harap konfirmasikan status pesanan baru. Terima kasih!

Menghasilkan item pesanan untuk pesanan menggunakan for loop

Saat pesanan diterima, akan berguna untuk mengirim pesan yang berisi produk yang dipesan. Anda dapat melakukannya dengan menggunakan for loop, yang berulang kali mengeksekusi blok kode. Kolom teks yang mendukung variabel juga mendukung for loop dan objek forloop.

Misalnya, Anda ingin membuat alur kerja yang menampilkan daftar semua SKU dan kuantitas dalam suatu pesanan. Di bagian Pesan pada tindakan Kirim email internal, gunakan variabel berikut.

Contoh penggunaan loop for untuk memberikan informasi pesanan.
InputOutput
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Ringkasan pesanan:
8987097979 (50)
8877778887 (3)
888998898B (1)

Menampilkan item pesanan untuk pesanan menggunakan loop for dengan informasi tambahan

Anda memutuskan untuk menambahkan informasi lainnya ke email, termasuk nama produk, SKU, harga per item, dan informasi pengiriman pelanggan. Di bagian Pesan pada tindakan Kirim email internal, Anda menggunakan variabel berikut.

Contoh penggunaan loop for untuk memberikan informasi pesanan yang lebih lengkap.
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 %}
Ringkasan pesanan:
Produk: High Waist Leggings - Hitam
SKU: 8987097979
Harga (per unit): $8,49
Kuantitas: 5
Produk: Athletic Socks - Biru
SKU: 888998898B
Harga (per unit): $5,61
Kuantitas: 2

Menampilkan beberapa item pesanan dengan menggabungkan loop for dan statement if

Anda perlu melacak item terjual yang dipasok oleh vendor tertentu. Di bagian Pesan pada tindakan Kirim email internal, Anda menggunakan variabel berikut dan menyertakan statement if di dalam loop for Anda.

Contoh penggunaan loop for dan statement if untuk memberikan informasi pesanan untuk vendor tertentu.
InputOutput
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Produk Acme terjual:
Nama produk: High Waist Leggings - Hitam
SKU: 8987097979

Objek data kompleks di Shopify Flow

Flow memungkinkan Anda mengakses hampir semua data yang ada di GraphQL Admin API. Ini mencakup objek data yang kompleks, seperti daftar dan objek. Namun, ada beberapa batasan terkait hal yang dapat Anda lakukan dengan objek ini. Bagian ini menguraikan batasan tersebut dan memberikan contoh cara menggunakannya.

Daripada memanggil daftar dan objek secara langsung, Anda harus melakukan loop pada daftar dan hanya menyertakan kolom yang Anda inginkan.

Misalnya, daripada memanggil {{ order.lineItems }} secara langsung, gunakan format berikut untuk memanggil kolom tertentu. Contoh ini mencakup semua kolom yang akan disertakan jika Anda memanggil daftar atau objek secara langsung. Salin dan tempel kolom yang Anda perlukan.

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

}