Shopify Flow मध्ये लिक्विड व्हेरिएबल्स वापरणे

लिक्विड व्हेरिएबल्स हे Liquid मध्ये परिभाषित केलेले प्लेसहोल्डर्स आहेत, जे वर्कफ्लो रन झाल्यानंतर GraphQL Admin API मधील मूल्यांद्वारे रिप्लेस केले जातात. व्हेरिएबल्स हे तुमच्या वर्कफ्लोजमध्ये समाविष्ट असलेल्या ग्राहक, ऑर्डर्स आणि उत्पादनांच्या गुणधर्मांचे वर्णन करू शकतात जसे की, ऑर्डर क्रमांक, ऑर्डरची किंमत किंवा ग्राहकाचे नाव. तुमच्या वर्कफ्लोमधील लॉजिक नियंत्रित करण्यासाठी कंडिशन्समध्ये किंवा एखाद्या अ‍ॅक्शनमधून डेटा आउटपुट करण्यासाठी व्हेरिएबल्सचा वापर केला जाऊ शकतो.

Liquid चा वापर करून वर्कफ्लोमध्ये व्हेरिएबल्स जोडणे

व्हेरिएबल जोडा (Add a variable) लिंक असलेल्या कोणत्याही मजकूर फील्डमध्ये तुम्ही Liquid वापरून व्हेरिएबल्स जोडू शकता. संबंधित फील्डच्या खालील व्हेरिएबल जोडा लिंकवर क्लिक करा आणि त्यानंतर सूचीमधून एखादे व्हेरिएबल निवडा.

अंतर्गत ईमेल पाठवा ॲक्शनच्या कॉन्फिगरेशन पॅनेलची इमेज, जी विषय फील्डच्या खाली 'व्हेरिएबल जोडा' पर्याय हायलाइट करत आहे.

व्हेरिएबल जोडा सूचीमधील व्हेरिएबल्स फिल्टर केलेले असतात, जेणेकरून तुम्ही फक्त ट्रिगर्ससारख्या वर्तमान पायरीच्या आधीच्या पायऱ्यांद्वारे रिटर्न केलेले व्हेरिएबल्स वापरू शकता. उदाहरणार्थ, ऑर्डर तयार केली ट्रिगर Admin API मधून ऑर्डर आणि शॉप रिसोर्सेस देतो, जे व्हेरिएबल्स म्हणून समाविष्ट केले जाऊ शकतात. तुम्ही सूचीमधून एखादे व्हेरिएबल निवडल्यानंतर, ते मजकूर बॉक्समध्ये योग्यरित्या फॉरमॅट केलेले Liquid म्हणून जोडले जाते.

तुम्ही थेट मजकूर फील्डमध्ये Liquid लिहू शकता. उदाहरणार्थ, तुम्ही Shopify ॲडमिनमधून ऑर्डर स्ट्रिंग (जसे की order-123) दाखवण्यासाठी {{ order.name }} हे व्हेरिएबल वापरू शकता.

Liquid साठी वापरला जाणारा डेटा पुनर्प्राप्त करण्यासाठी Flow हा Admin API वापरतो, त्यामुळे व्हेरिएबल सिंटॅक्स कॅमल केस वापरतो. कॅमल केस व्हेरिएबल्समध्ये पहिला शब्द लोअरकेस अक्षराने सुरू होतो आणि त्यानंतरचे शब्द अप्परकेस अक्षराने सुरू होतात, जसे की firstName किंवा canMarkAsPaid. उदाहरणार्थ, उत्पादन तयार केल्याच्या तारखेमध्ये अ‍ॅक्सेस मिळवण्यासाठी, {{ product.createdAt }} एंटर करा. तुम्ही कॅमल केस न वापरणाऱ्या एखाद्या Shopify थीममध्ये Liquid सिंटॅक्स वापरत असल्यास, तुम्ही {{ product.created_at }} एंटर कराल.

कंडिशनल आणि इटरेशन Liquid टॅग्ज

खालील कार्ये करण्यासाठी व्हेरिएबल्ससोबत Liquid टॅग्ज वापरले जाऊ शकतात:

  • ऑर्डरची एकूण रक्कम $100 पेक्षा जास्त आहे की नाही हे ठरवणे यासारखी कंडिशनल विधाने लिहिणे.
  • ऑर्डरमधील प्रत्येक लाइन आयटमसाठी डेटा आउटपुट करणे यासारख्या ऑब्जेक्ट्सच्या सूचीमधून इटरेट करणे.

ही विधाने लिहिण्यासाठी आणि ऑब्जेक्ट्समधून इटरेट करण्यासाठी तुम्ही Liquid टॅग्ज वापरू शकता.

उदाहरणार्थ, जर ऑर्डरची एकूण रक्कम $100 पेक्षा जास्त असेल, तर खालील Liquid ऑर्डर क्रमांक दाखवते:

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

ऑर्डरसाठी लाइन आयटम्ससारख्या ऑब्जेक्ट्सच्या सूचीमधून इटरेट करण्यासाठी तुम्ही for लूप देखील वापरू शकता. उदाहरणार्थ, खालील Liquid ऑर्डरमधील प्रत्येक लाइन आयटमचे नाव दाखवते:

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

Flow खालील Liquid कंडिशनल (किंवा कंट्रोल फ्लो) टॅग्जना सपोर्ट करतो:

Flow खालील Liquid इटरेशन टॅग्जना देखील सपोर्ट करतो:

व्हेरिएबल्सवर फिल्टर्स लागू करणे

फिल्टर्सचा वापर करून तुम्ही Liquid मधील व्हेरिएबल डेटा रूपांतरित करू शकता. Flow सर्व ओपन सोर्स Liquid फिल्टर्सना सपोर्ट करतो.

उदाहरणार्थ, खालील Liquid ऑर्डरच्या नावामधून प्रीफिक्स काढून टाकते आणि जे उरले आहे ते आउटपुट करते: {{ order.name | remove: "Order-" }}

फिल्टर्समध्ये Liquid व्हेरिएबल्स वापरण्याबाबतचे विचार

फिल्टर्स वापरून व्हेरिएबल्स रूपांतरित करण्यापूर्वी, खालील विचारांचे पुनरावलोकन करा:

  • काही फिल्टर्ससाठी उपलब्ध असलेल्या डॉट नोटेशनला Flow सपोर्ट करत नाही. उदाहरणार्थ, Flow {{ order.lineItems | size }} ला सपोर्ट करतो पण {{ order.lineItems.size }} ला नाही.
  • मेटाफील्ड्ससाठी डॉट नोटेशनला Flow सपोर्ट करत नाही. उदाहरणार्थ, तुम्ही {{ order.metafields.custom.hold_note }} वापरू शकत नाही. त्याऐवजी, तुम्ही उदाहरणांमध्ये रूपरेषा दिल्याप्रमाणे मेटाफील्ड्सवर लूप करणे आवश्यक आहे.
  • सूचीमधील आयटम्स अ‍ॅक्सेस करण्यासाठी इंडेक्सेस वापरण्याला Flow सपोर्ट करत नाही. उदाहरणार्थ, तुम्ही {{ order.lineItems[0].title }} वापरू शकत नाही. त्याऐवजी, तुम्ही उदाहरणांमध्ये रूपरेषा दिल्याप्रमाणे लाइन आयटम्सवर लूप करणे आवश्यक आहे.

तारीख फिल्टर्स

प्रमाणित Liquid फिल्टर्स व्यतिरिक्त, शेड्युल केलेली वेळ ट्रिगर आणि डेटा मिळवा या वैशिष्ट्यांना सपोर्ट करण्यासाठी Flow दुसऱ्या तारखेच्या सापेक्ष तारीख मिळवण्यासाठी तारीख फिल्टर्स पुरवतो. ही फिल्टर्स खालीलप्रमाणे आहेत: date_minus आणि date_plus. उदाहरणार्थ:

  • भविष्यातील एक दिवसाची तारीख रिटर्न करण्यासाठी: {{ "now" | date_plus: "1 day" }}
  • मागील एका दिवसाची तारीख रिटर्न करण्यासाठी: {{ "now" | date_minus: "1 day" }}

ही फिल्टर्स second, minute, day, week, month आणि year हे कालावधी एकक म्हणून स्वीकारतात, जे एकवचनी (जसे की second) आणि अनेकवचनी (जसे की seconds) दोन्ही असतात. तुम्ही खालील प्रकारचे कस्टमाइज करण्यायोग्य एकक देखील देऊ शकता:

  • सेकंदांची संख्या दर्शवणारा इंटिजर: {{ "now" | date_minus: 3600 }}, जिथे 3600 हे 1 तासाच्या समतुल्य आहे.
  • ISO8601 कालावधी स्ट्रिंग: {{ "now" | date_minus: "P1Y2D" }}, जिथे P1Y2D म्हणजे 1 वर्ष आणि 2 दिवस.

क्रिप्टोग्राफिक फिल्टर्स

Flow हे हॅशिंग आणि हॅश-आधारित मेसेज प्रमाणीकरण कोड (HMACs) तयार करण्यासाठी क्रिप्टोग्राफिक फिल्टर्स पुरवतो. ही फिल्टर्स युनिक आयडेंटिफायर्स, चेकसम्स तयार करण्यासाठी किंवा विशिष्ट हॅश फॉरमॅट्सची आवश्यकता असलेल्या तृतीय-पक्ष सिस्टीम्ससोबत इंटिग्रेट करण्यासाठी उपयुक्त आहेत.

हॅशिंग फिल्टर्स

Shopify Flow खालील प्रकारच्या हॅशिंग फिल्टर्सना सपोर्ट करतो:

  • blake3 - एक BLAKE3 हॅश तयार करते (सामान्य वापरासाठी शिफारस केलेले).
  • sha256 - एक SHA-256 हॅश तयार करते.
  • sha1 - एक SHA-1 हॅश तयार करते.
  • md5 - एक MD5 हॅश तयार करते.

सामान्य हॅशिंग हेतूंसाठी आणि नवीन अंमलबजावणीसाठी, तुम्ही blake3 वापरले पाहिजे, कारण ते जुन्या अल्गोरिदमच्या तुलनेत अधिक चांगली कामगिरी आणि सुरक्षितता प्रदान करते. तथापि, तृतीय-पक्ष सिस्टीमच्या सुसंगततेसाठी sha256, sha1 आणि md5 उपलब्ध आहेत.

वापराचे उदाहरण: {{ "hello world" | blake3 }} हे "hello world" चा BLAKE3 हॅश परत करते.

HMAC फिल्टर्स

सिक्रेट की सह HMAC तयार करण्यासाठी, खालीलपैकी एक सपोर्टेड फिल्टर वापरा:

वापराचे उदाहरण:

  • Basic: {{ "message" | hmac_sha256: "secret_key" }}
  • सिक्रेट्स सह (शिफारस केलेले): {{ "message" | hmac_sha256: secrets.api_key }}

Shopify Flow मध्ये Liquid सह व्हेरिएबल्स वापरण्याची उदाहरणे

Liquid व्हेरिएबल्स कसे वापरावे हे अधिक चांगल्या प्रकारे समजून घेण्यासाठी, खालील उदाहरणे विचारात घ्या:

संसाधनांसाठी आउटपुट URLs

तुम्हाला वर्कफ्लोमध्ये समाविष्ट असलेले ग्राहक, ऑर्डर आणि उत्पादनासाठी URLs आउटपुट करायचे आहेत.

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

टॅगच्या सूचीला एका मेटाफील्डमध्ये रूपांतरित करा

तुम्हाला टॅगच्या एका सेटला अशा एका मेटाफील्डमध्ये रूपांतरित करायचे आहे, जे सिंगल-लाइन मजकूर फील्डची एक सूची आहे. तुम्ही स्टोअरमध्ये उत्पादन जोडले (Product added to store) हा ट्रिगर वापरून वर्कफ्लो तयार करता आणि उत्पादन मेटाफील्ड अपडेट करा (Update product metafield) कृती वापरता. उत्पादन मेटाफील्ड अपडेट करा कृतीच्या मूल्य (Value) विभागात, तुम्ही खालील लिक्विड कोड जोडता. या उदाहरणात असे गृहीत धरले आहे की उत्पादन तयार केले जाते तेव्हा तुम्हाला फक्त एकदाच मूल्ये सेट करणे आवश्यक आहे आणि उत्पादनाला दोन संबंधित टॅग आहेत: color:red आणि color:orange.

सिंगल-लाइन मजकूर फील्डची सूची सेट करण्यासाठी लिक्विडचे उदाहरण.
इनपुटआउटपुट
{% 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"]

ऑर्डरसाठी डायनॅमिक ईमेल संदेश लिहा

जेव्हा एखादा ग्राहक ऑर्डरवर $500 पेक्षा जास्त खर्च करतो, तेव्हा कर्मचाऱ्याला ईमेल पाठवण्यासाठी तुम्हाला वर्कफ्लो तयार करायचा आहे. तुम्ही ऑर्डर तयार झाली (Order created) ट्रिगर वापरून वर्कफ्लो तयार करता, अशी स्थिती सेट करता जी ऑर्डरची एकूण रक्कम $500 च्या वर असल्यास खरी असते आणि अंतर्गत ईमेल पाठवा (Send internal email) कृती वापरता. अंतर्गत ईमेल पाठवा कृतीच्या संदेश (Message) विभागात, तुम्ही खालील व्हेरिएबल्स वापरता.

ग्राहकाचा तपशील प्रदान करण्यासाठी व्हेरिएबल वापराचे उदाहरण.
इनपुटआउटपुट
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 }}.
कृपया Jeanne Dupont (jeanne@example.com) यांना $763.42 ची ऑर्डर दिल्याबद्दल आभार मानणारी वैयक्तिक नोंद पाठवा.

कमी स्टॉक असलेल्या उत्पादनासाठी डायनॅमिक ईमेल संदेश लिहा

जेव्हा उत्पादनाची इन्व्हेंटरी कमी होत असेल आणि अधिक स्टॉकसाठी ऑर्डर देण्याची आवश्यकता असेल, तेव्हा एका कर्मचाऱ्याला सूचित करणे आवश्यक आहे, असे तुम्ही ठरवता. तुम्ही असा वर्कफ्लो तयार करता, जो इन्व्हेंटरीचे प्रमाण बदलले (Inventory quantity changed) ट्रिगरसह सुरू होतो आणि अशी स्थिती सेट करता जी आधीचे इन्व्हेंटरीचे प्रमाण 10 पेक्षा कमी किंवा त्याच्या इतके असल्यास खरी असते. अंतर्गत ईमेल पाठवा कृतीच्या संदेश विभागात, तुम्ही खालील व्हेरिएबल्स वापरता.

आयटमचा तपशील प्रदान करण्यासाठी व्हेरिएबल वापराचे उदाहरण.
इनपुटआउटपुट
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
कृपया हाय वेस्ट लेगिंग्स - काळ्या रंगासाठी पुन्हा ऑर्डर करा. त्यांना खरेदी ऑर्डर मिळाली असल्याची पडताळणी करण्यासाठी owner@example.com ला ईमेल करा.

फसवणुकीच्या ऑर्डरबद्दल कर्मचाऱ्यांना सूचित करण्यासाठी डायनॅमिक ईमेल संदेश लिहा

तुम्हाला उच्च धोका पातळी असलेल्या ऑर्डर्स रद्द करायच्या आहेत, पण तुमच्या कर्मचाऱ्यांनी त्या ऑर्डर मॅन्युअली रद्द कराव्यात असे तुम्हाला वाटते. तुम्ही असा वर्कफ्लो तयार करता, जो ऑर्डर तयार झाली ट्रिगरसह सुरू होतो आणि अशी स्थिती सेट करता जी ऑर्डरची धोका पातळी 'उच्च (high)' असल्यास खरी असते. अंतर्गत ईमेल पाठवा कृतीच्या संदेश विभागात, तुम्ही खालील व्हेरिएबल्स वापरता.

फसवणुकीच्या ऑर्डरबद्दल माहिती प्रदान करण्यासाठी व्हेरिएबल वापराचे उदाहरण.
इनपुटआउटपुट
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 स्टोअरला फसवणुकीचा उच्च धोका असलेली एक ऑर्डर मिळाली आहे. आम्हाला ही ऑर्डर उत्पादनासाठी पाठवण्यापूर्वी त्वरित रद्द करायची आहे:

#1001
Dupont, Jeanne
jeanne@example.com

कृपया नवीन ऑर्डर स्थितीची पुष्टी करा. धन्यवाद!

फॉर लूप वापरून एका ऑर्डरचे लाइन आयटम्स आउटपुट करा

जेव्हा एखादी ऑर्डर मिळते, तेव्हा ऑर्डर केलेल्या उत्पादनांचा समावेश असलेला संदेश पाठवणे उपयुक्त ठरू शकते. तुम्ही for loop वापरून हे करू शकता, जे वारंवार कोडचा ब्लॉक अंमलात आणते. व्हेरिएबल्सना सपोर्ट करणारी मजकूर फील्ड्स for लूप्स आणि forloop ऑब्जेक्टला देखील सपोर्ट करतात.

उदाहरणार्थ, तुम्हाला असा वर्कफ्लो तयार करायचा आहे, जो ऑर्डरमधील सर्व SKUs आणि प्रमाणांची सूची परत करतो. अंतर्गत ईमेल पाठवा कृतीच्या संदेश विभागात, तुम्ही खालील व्हेरिएबल्स वापरता.

ऑर्डरची माहिती प्रदान करण्यासाठी for लूपच्या वापराचे उदाहरण.
इनपुटआउटपुट
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
ऑर्डरचा सारांश:
8987097979 (50)
8877778887 (3)
888998898B (1)

अतिरिक्त माहितीसह फॉर लूप वापरून एका ऑर्डरचे लाइन आयटम्स आउटपुट करा

तुम्ही ईमेलमध्ये उत्पादनाचे नाव, SKUs, प्रति आयटम किंमत आणि ग्राहकाच्या शिपिंग माहितीसह आणखी माहिती जोडण्याचे ठरवता. अंतर्गत ईमेल पाठवा कृतीच्या संदेश विभागात, तुम्ही खालील व्हेरिएबल्स वापरता.

अधिक विस्तृत ऑर्डर माहिती प्रदान करण्यासाठी for लूप वापरण्याचे उदाहरण.
इनपुटआउटपुट
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
ऑर्डरचा सारांश:
उत्पादन: High Waist Leggings - Black
SKU: 8987097979
किंमत (प्रति युनिट): $8.49
प्रमाण: 5
उत्पादन: Athletic Socks - Blue
SKU: 888998898B
किंमत (प्रति युनिट): $5.61
प्रमाण: 2

for लूप आणि if स्टेटमेंट एकत्रित करून काही लाइन आयटम आउटपुट करा

तुम्हाला विशिष्ट विक्रेत्याने पुरवलेले विक्री झालेले आयटम ट्रॅक करणे आवश्यक आहे. अंतर्गत ईमेल पाठवा कृतीच्या मेसेज विभागामध्ये, तुम्ही खालील व्हेरिएबल्स वापरता आणि तुमच्या for loop मध्ये if स्टेटमेंट समाविष्ट करता.

विशिष्ट विक्रेत्यांसाठी ऑर्डरची माहिती प्रदान करण्यासाठी for लूप आणि if स्टेटमेंट वापरण्याचे उदाहरण.
इनपुटआउटपुट
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Acme उत्पादन विक्री झाले:
उत्पादनाचे नाव: High Waist Leggings - Black
SKU: 8987097979

Shopify Flow मध्ये कॉम्प्लेक्स डेटा ऑब्जेक्ट्स

Flow तुम्हाला GraphQL Admin API मधील जवळपास कोणत्याही डेटावर ॲक्सेस करण्याची अनुमती देतो. यामध्ये लिस्ट आणि ऑब्जेक्ट्ससारख्या कॉम्प्लेक्स डेटा ऑब्जेक्ट्सचा समावेश होतो. तथापि, तुम्ही या ऑब्जेक्ट्ससह काय करू शकता यावर काही मर्यादा आहेत. हा विभाग या मर्यादांची रूपरेषा देतो आणि त्यांच्यासह कसे काम करावे याची उदाहरणे देतो.

लिस्ट आणि ऑब्जेक्ट्सना थेट कॉल करण्याऐवजी, तुम्ही लिस्टवर लूप केले पाहिजे आणि तुम्हाला हवे असलेले फील्ड्सच समाविष्ट केले पाहिजेत.

उदाहरणार्थ, {{ order.lineItems }} ला थेट कॉल करण्याऐवजी, विशिष्ट फील्ड्सना कॉल करण्यासाठी खालील फॉरमॅट वापरा. या उदाहरणांमध्ये सर्व फील्ड्सचा समावेश आहे जे थेट लिस्ट किंवा ऑब्जेक्टला कॉल करून समाविष्ट केले जातील. तुम्हाला आवश्यक असलेले फील्ड्स कॉपी करा आणि पेस्ट करा.

मजकूर
{% 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 %}
]

}