Shopify Flow में लिक्विड वैरिएबल का उपयोग करना

लिक्विड वैरिएबल Liquid में परिभाषित प्लेसहोल्डर होते हैं, जिन्हें वर्कफ़्लो चलने पर GraphQL Admin API की वैल्यू से बदल दिया जाता है। वैरिएबल आपके वर्कफ़्लो में शामिल ग्राहकों, ऑर्डर और प्रोडक्ट के गुणों का वर्णन कर सकते हैं, जैसे कि ऑर्डर नंबर, ऑर्डर की कीमत, या ग्राहक का नाम। आपके वर्कफ़्लो में लॉजिक को नियंत्रित करने के लिए या किसी एक्शन से डेटा आउटपुट करने के लिए कंडीशन में वैरिएबल का उपयोग किया जा सकता है।

Liquid का उपयोग करके वर्कफ़्लो में वैरिएबल जोड़ना

आप किसी भी ऐसे टेक्स्ट फ़ील्ड में Liquid का उपयोग करके वैरिएबल जोड़ सकते हैं जिसमें वैरिएबल जोड़ें लिंक होता है। संबंधित फ़ील्ड के नीचे वैरिएबल जोड़ें लिंक पर क्लिक करें और फिर सूची में से कोई वैरिएबल चुनें।

आंतरिक ईमेल भेजें एक्शन के कॉन्फ़िगरेशन पैनल की इमेज, जिसमें विषय फ़ील्ड के नीचे 'वैरिएबल जोड़ें' विकल्प को हाइलाइट किया गया है.

वैरिएबल जोड़ें सूची में वैरिएबल फ़िल्टर किए जाते हैं, ताकि आप केवल उन वैरिएबल का उपयोग करें जो मौजूदा चरण से पहले के चरणों, जैसे ट्रिगर द्वारा लौटाए जाते हैं। उदाहरण के लिए, ऑर्डर बनाया गया ट्रिगर, Admin API से ऑर्डर और शॉप रिसोर्स देता है जिन्हें वैरिएबल के रूप में डाला जा सकता है। सूची से वैरिएबल चुनने के बाद, इसे सही ढंग से फ़ॉर्मेट किए गए Liquid के रूप में टेक्स्ट बॉक्स में जोड़ दिया जाता है।

आप टेक्स्ट फ़ील्ड में सीधे Liquid भी लिख सकते हैं। उदाहरण के लिए, आप Shopify एडमिन से ऑर्डर स्ट्रिंग प्रदर्शित करने के लिए {{ order.name }} वैरिएबल का उपयोग कर सकते हैं, जैसे order-123

चूंकि Flow, Liquid के लिए उपयोग किए गए डेटा को वापस पाने के लिए 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 बनाने के लिए, निम्नलिखित सपोर्टेड फ़िल्टर में से किसी एक का उपयोग करें:

उपयोग का उदाहरण:

  • बेसिक: {{ "message" | hmac_sha256: "secret_key" }}
  • सीक्रेट के साथ (अनुशंसित): {{ "message" | hmac_sha256: secrets.api_key }}

Shopify Flow में Liquid के साथ वैरिएबल का उपयोग करने के उदाहरण.

Liquid वैरिएबल का उपयोग करने का तरीका बेहतर ढंग से समझने के लिए, निम्नलिखित उदाहरणों पर विचार करें:

रिसोर्स के लिए URL आउटपुट करना.

आप किसी वर्कफ़्लो में शामिल ग्राहक, ऑर्डर और प्रोडक्ट के लिए URL आउटपुट करना चाहते हैं।

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

टैग की सूची को मेटाफ़ील्ड में रूपांतरण करना.

आप टैग के एक सेट को ऐसे मेटाफ़ील्ड में रूपांतरण करना चाहते हैं जो सिंगल-लाइन टेक्स्ट फ़ील्ड की एक सूची है। आप स्टोर में प्रोडक्ट जोड़ा गया ट्रिगर का उपयोग करके एक वर्कफ़्लो बनाते हैं और प्रोडक्ट मेटाफ़ील्ड अपडेट करें कार्रवाई का उपयोग करते हैं। प्रोडक्ट मेटाफ़ील्ड अपडेट करें कार्रवाई के वैल्यू सेक्शन में, आप निम्नलिखित लिक्विड कोड जोड़ते हैं। यह उदाहरण मानता है कि आपको प्रोडक्ट बनाए जाने पर केवल एक बार वैल्यू सेट करने की ज़रूरत है और प्रोडक्ट में दो प्रासंगिक टैग हैं: 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 से ज़्यादा खर्च करता है। आप ऑर्डर बनाया गया ट्रिगर का उपयोग करके एक वर्कफ़्लो बनाते हैं, एक शर्त सेट करते हैं जो ऑर्डर का कुल योग $500 से ज़्यादा होने पर सही होती है और आंतरिक ईमेल भेजें कार्रवाई का उपयोग करते हैं। आंतरिक ईमेल भेजें कार्रवाई के मैसेज सेक्शन में, आप निम्नलिखित वैरिएबल का उपयोग करते हैं।

ग्राहक का विवरण देने के लिए वैरिएबल के उपयोग का उदाहरण.
इनपुट.आउटपुट.
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 का ऑर्डर देने के लिए एक व्यक्तिगत धन्यवाद नोट भेजें।

कम स्टॉक वाले प्रोडक्ट के लिए डायनेमिक ईमेल मैसेज लिखना.

आप तय करते हैं कि जब प्रोडक्ट की इन्वेंट्री कम हो रही हो और ज़्यादा स्टॉक के लिए ऑर्डर देने की ज़रूरत हो, तो आपको स्टाफ़ सदस्य को सूचित करना होगा। आप एक वर्कफ़्लो बनाते हैं जो इन्वेंट्री की मात्रा बदली गई ट्रिगर से शुरू होता है और एक शर्त सेट करते हैं जो तब सही होती है, जब पहले की इन्वेंट्री मात्रा 10 या उससे कम हो। आंतरिक ईमेल भेजें कार्रवाई के मैसेज सेक्शन में, आप निम्नलिखित वैरिएबल का उपयोग करते हैं।

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

धोखाधड़ी वाले ऑर्डर के बारे में स्टाफ़ को सूचित करने के लिए डायनेमिक ईमेल मैसेज लिखना.

आप उन ऑर्डर को कैंसिल करना चाहते हैं, जिनका जोखिम स्तर ज़्यादा है, लेकिन चाहते हैं कि आपका स्टाफ़ मैन्युअल रूप से ऑर्डर कैंसिल करे। आप एक वर्कफ़्लो बनाते हैं जो ऑर्डर बनाया गया ट्रिगर से शुरू होता है और एक शर्त सेट करते हैं जो तब सही होती है, जब ऑर्डर का जोखिम स्तर 'उच्च' के बराबर हो। आंतरिक ईमेल भेजें कार्रवाई के मैसेज सेक्शन में, आप निम्नलिखित वैरिएबल का उपयोग करते हैं।

धोखाधड़ी वाले ऑर्डर पर जानकारी देने के लिए वैरिएबल के उपयोग का उदाहरण.
इनपुट.आउटपुट.
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 लूप का उपयोग करके ऑर्डर के लिए लाइन आइटम आउटपुट करना.

जब कोई ऑर्डर मिलता है, तो ऑर्डर किए गए प्रोडक्ट वाला एक मैसेज भेजना उपयोगी हो सकता है। आप for loop का उपयोग करके ऐसा कर सकते हैं, जो कोड के एक ब्लॉक को बार-बार एक्ज़ीक्यूट करता है। वैरिएबल को सपोर्ट करने वाले टेक्स्ट फ़ील्ड भी for लूप और forloop ऑब्जेक्ट को सपोर्ट करते हैं।

उदाहरण के लिए, आप एक ऐसा वर्कफ़्लो बनाना चाहते हैं जो किसी ऑर्डर में सभी SKU और मात्राओं की सूची देता है. Send internal email एक्शन के Message सेक्शन में, आप नीचे दिए गए वेरिएबल का इस्तेमाल करते हैं.

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

अतिरिक्त जानकारी के साथ for लूप का इस्तेमाल करके किसी ऑर्डर के लिए लाइन आइटम आउटपुट करें

आप ईमेल में और जानकारी जोड़ने का फ़ैसला करते हैं, जिसमें प्रोडक्ट का नाम, SKU, प्रति आइटम कीमत और ग्राहक की शिपिंग जानकारी शामिल है. Send internal email एक्शन के Message सेक्शन में, आप नीचे दिए गए वेरिएबल का इस्तेमाल करते हैं.

ऑर्डर की ज़्यादा विस्तृत जानकारी देने के लिए 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

if स्टेटमेंट के साथ for लूप को मिलाकर कुछ लाइन आइटम आउटपुट करें

आपको किसी खास वेंडर द्वारा सप्लाई किए गए बेचे गए आइटम को ट्रैक करना होगा. Send internal email एक्शन के Message सेक्शन में, आप नीचे दिए गए वेरिएबल का इस्तेमाल करते हैं और अपने 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 %}
]

}