<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Qilin.Cloud</title>
	<atom:link href="https://qilin.cloud/feed/" rel="self" type="application/rss+xml" />
	<link>https://qilin.cloud</link>
	<description>Technology Platform for composable e-commerce</description>
	<lastBuildDate>Thu, 26 Mar 2026 11:08:59 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://qilin.cloud/wp-content/uploads/2023/08/cropped-QilinCloud-Logo-32x32.png</url>
	<title>Qilin.Cloud</title>
	<link>https://qilin.cloud</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AI-Native Commerce Ops: Treating Qilin Like a Coworker (Not a Chat Widget)</title>
		<link>https://qilin.cloud/ai-native-commerce-ops-qilin-strategy/</link>
		
		<dc:creator><![CDATA[Thien Trinh Duc]]></dc:creator>
		<pubDate>Sun, 31 May 2026 08:00:00 +0000</pubDate>
				<category><![CDATA[Engineering Deep Dives]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[commerce ops]]></category>
		<category><![CDATA[governance]]></category>
		<category><![CDATA[roadmap]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3778</guid>

					<description><![CDATA[<p>A practical preview of our AI direction: AI as the primary interface for commerce operations—permissioned, auditable, and grounded in real execution data.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/ai-native-commerce-ops-qilin-strategy/">AI-Native Commerce Ops: Treating Qilin Like a Coworker (Not a Chat Widget)</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="et_pb_section et_pb_section_0 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_0">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_0  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_0  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>Most “AI features” today fall into one of two categories:</p>
<ol>
<li><strong>A chat widget taped onto the side of a product</strong></li>
<li><strong>A content generator that writes… more content</strong></li>
</ol>
<p>Useful sometimes. <br />Rarely operational.</p>
<p>Commerce operations are a different beast. They’re messy, time-sensitive, and full of edge cases. If AI is going to matter here, it has to do more than talk.</p>
<p>This May post is a practical preview of our direction:</p>
<p><strong>Qilin.Cloud as an AI-native operations coworker.</strong></p>
<p>Not a mascot. Not a gimmick. Not “AI bolted-on”.</p>
<p>An assistant that can help you <em>run</em> commerce flows.</p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_1">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_1  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_0">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#ThenorthstarQilinisanemployeenotatool' data-hl='2'></span><a href='#ThenorthstarQilinisanemployeenotatool' id='ThenorthstarQilinisanemployeenotatool_toc_headding'>The north star: “Qilin is an employee, not a tool”</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whythisisevenpossible' data-hl='2'></span><a href='#Whythisisevenpossible' id='Whythisisevenpossible_toc_headding'>Why this is even possible</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WhatAInativecouldlooklikerealexamples' data-hl='2'></span><a href='#WhatAInativecouldlooklikerealexamples' id='WhatAInativecouldlooklikerealexamples_toc_headding'>What “AI-native” could look like (real examples)</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Explainfailuresinbusinesslanguage' data-hl='3'></span><a href='#Explainfailuresinbusinesslanguage' id='Explainfailuresinbusinesslanguage_toc_headding'>Explain failures in business language</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Suggestpipelineimprovementswithevidence' data-hl='3'></span><a href='#Suggestpipelineimprovementswithevidence' id='Suggestpipelineimprovementswithevidence_toc_headding'>Suggest pipeline improvements (with evidence)</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Detectanomaliesbeforehumansnotice' data-hl='3'></span><a href='#Detectanomaliesbeforehumansnotice' id='Detectanomaliesbeforehumansnotice_toc_headding'>Detect anomalies before humans notice</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Thepartpeopleforgettrustandguardrails' data-hl='2'></span><a href='#Thepartpeopleforgettrustandguardrails' id='Thepartpeopleforgettrustandguardrails_toc_headding'>The part people forget: trust and guardrails</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Permissionsfirst' data-hl='3'></span><a href='#Permissionsfirst' id='Permissionsfirst_toc_headding'>Permissions first</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Auditabilityalways' data-hl='3'></span><a href='#Auditabilityalways' id='Auditabilityalways_toc_headding'>Auditability always</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Noblackboxoperations' data-hl='3'></span><a href='#Noblackboxoperations' id='Noblackboxoperations_toc_headding'>No black box operations</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whythismattersdependingonwhoyouare' data-hl='2'></span><a href='#Whythismattersdependingonwhoyouare' id='Whythismattersdependingonwhoyouare_toc_headding'>Why this matters (depending on who you are)</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Developers' data-hl='3'></span><a href='#Developers' id='Developers_toc_headding'>Developers</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Agenciesintegrators' data-hl='3'></span><a href='#Agenciesintegrators' id='Agenciesintegrators_toc_headding'>Agencies &amp; integrators</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Merchants' data-hl='3'></span><a href='#Merchants' id='Merchants_toc_headding'>Merchants</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Investors' data-hl='3'></span><a href='#Investors' id='Investors_toc_headding'>Investors</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Agroundedpromise' data-hl='2'></span><a href='#Agroundedpromise' id='Agroundedpromise_toc_headding'>A grounded promise</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_6">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_6  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_6  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The north star: “Qilin is an employee, not a tool”</span></h2>
						<div class="et_pb_blurb_description"><p>Tools wait for clicks.</p>
<p>Employees:</p>
<ul>
<li>listen for intent</li>
<li>propose actions</li>
<li>execute within permissions</li>
<li>keep watch</li>
<li>and escalate only when needed</li>
</ul>
<p>That’s the experience we’re aiming for.</p>
<p>The portal remains important (visualization and control matter), but the long-term center of gravity becomes:</p>
<blockquote>
<p><em><strong>&gt; “Tell Qilin what outcome you want,” not “find the right menu item.”</strong></em></p>
</blockquote></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_7">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_7  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_7  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why this is even possible</span></h2>
						<div class="et_pb_blurb_description"><p>Because Qilin.Cloud already has the ingredients that most “AI products” lack:</p>
<ul>
<li><strong>Structured execution data</strong> (Data Flow Tracking)</li>
<li><strong>Reliable status and idempotency</strong> (Transfer Status Engine)</li>
<li><strong>Process-level telemetry</strong> (think process mining data)</li>
<li><strong>A modular pipeline model</strong> (processors and connectors)</li>
<li><strong>Permissions and roles</strong> (so “automation” doesn’t become “chaos”)</li>
</ul>
<p>In other words: the system is observable and controllable enough for AI to act responsibly.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_8  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What “AI-native” could look like (real examples)</span></h2>
						<div class="et_pb_blurb_description"><p>Here are examples of <em>outcome-based</em> interactions that become possible when AI is tied to the operational model:</p>
<h3>Explain failures in business language</h3>
<blockquote>
<p><em><strong>&gt; “Why did today’s Kaufland updates fail?”</strong></em></p>
</blockquote>
<p>Qilin can translate:</p>
<ul>
<li>which offers failed</li>
<li>which condition caused mismatch (e.g., EAN/condition/storefront)</li>
<li>what to fix in the source data</li>
<li>whether a retry would succeed or just waste time</li>
</ul>
<h3>Suggest pipeline improvements (with evidence)</h3>
<blockquote>
<p><em><strong>&gt; “How can we reduce cost on this pipeline by 20%?”</strong></em></p>
</blockquote>
<p>Qilin can look at execution telemetry and propose:</p>
<ul>
<li>buffer bursts to reduce connector retries</li>
<li>move non-critical enrichments to slower speed</li>
<li>batch outputs where the marketplace allows it</li>
<li>tighten timeouts on known-bad endpoints</li>
</ul>
<h3>Detect anomalies before humans notice</h3>
<blockquote>
<p><em><strong>&gt; “Alert me if stock updates exceed 10 minutes latency.”</strong></em></p>
</blockquote>
<p>That’s not a chat feature. That’s operational guardrails.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_1">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_1  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.

&nbsp;
<h4><strong>Share your Qilin.Cloud Success Story</strong>
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_9  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The part people forget: trust and guardrails</span></h2>
						<div class="et_pb_blurb_description"><p>AI in commerce ops is useless if it can’t be trusted.</p>
<p>So the AI-native direction has non-negotiables:</p>
<h3>Permissions first</h3>
<p>AI actions must respect:</p>
<ul>
<li>roles</li>
<li>API key scopes</li>
<li>tenant boundaries</li>
<li>approval workflows (where needed)</li>
</ul>
<h3>Auditability always</h3>
<p>If AI changes something, it must leave a trail:</p>
<ul>
<li>what was changed</li>
<li>why it was changed</li>
<li>who authorized it</li>
<li>which data triggered it</li>
</ul>
<h3>No black box operations</h3>
<p>You should be able to ask:</p>
<ul>
<li>“What evidence led to that recommendation?”</li>
<li>“What would happen if we don’t do it?”</li>
<li>“Show me the DFT blocks that support this.”</li>
</ul>
<p>The goal is not “magic”. <br />The goal is <strong>reliable leverage</strong>.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_10  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why this matters (depending on who you are)</span></h2>
						<div class="et_pb_blurb_description"><h3>Developers</h3>
<p>Less firefighting. More engineering. <br />AI should reduce the time spent chasing ghosts in distributed systems.</p>
<h3>Agencies &amp; integrators</h3>
<p>Faster onboarding and fewer handover headaches. <br />If Qilin can explain the system, your delivery becomes more repeatable.</p>
<h3>Merchants</h3>
<p>Better uptime and fewer penalties. <br />The best incident is the one that never happens.</p>
<h3>Investors</h3>
<p>AI-native operations is a moat when it’s tied to real platform primitives:</p>
<ul>
<li>telemetry</li>
<li>workflows</li>
<li>permissions</li>
<li>automation hooks</li>
</ul>
<p>That combination is hard to copy quickly.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_11  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>A grounded promise</span></h2>
						<div class="et_pb_blurb_description"><p>We’re not claiming “the AI commerce OS is finished.”</p>
<p>We are claiming:</p>
<ul>
<li>the direction is clear</li>
<li>the foundation is being built the right way</li>
<li>and we’ll share progress as it becomes production-grade</li>
</ul>
<p>AI is exciting. <br />But boring reliability is what makes it real.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>
<p>The post <a rel="nofollow" href="https://qilin.cloud/ai-native-commerce-ops-qilin-strategy/">AI-Native Commerce Ops: Treating Qilin Like a Coworker (Not a Chat Widget)</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Process Mining Data: Turning Pipeline Runs into Cost &#038; Optimization Insights</title>
		<link>https://qilin.cloud/process-mining-data-cost-optimization/</link>
		
		<dc:creator><![CDATA[Dinh Vo]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 08:00:00 +0000</pubDate>
				<category><![CDATA[Engineering Deep Dives]]></category>
		<category><![CDATA[cost optimization]]></category>
		<category><![CDATA[data flow tracking]]></category>
		<category><![CDATA[pipelines]]></category>
		<category><![CDATA[process mining]]></category>
		<category><![CDATA[telemetry]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3770</guid>

					<description><![CDATA[<p>Process Mining Data enriches pipeline telemetry with cost and trigger context—so you can optimize throughput, reliability, and unit economics with evidence.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/process-mining-data-cost-optimization/">Process Mining Data: Turning Pipeline Runs into Cost &amp; Optimization Insights</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="et_pb_section et_pb_section_1 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_8">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_8  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_2  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>A commerce integration is basically a factory line.</p>
<ul>
<li>products enter the line</li>
<li>rules, transforms, enrichments happen</li>
<li>results leave the line</li>
<li>every once in a while something catches fire</li>
</ul>
<p>In the “classic” world, factories get optimized with time studies: where do workers wait, where do machines idle, where do bottlenecks form?</p>
<p><strong>Process mining</strong> is the digital version of that. <br />And Qilin.Cloud is built to make it practical &#8211; not theoretical.</p>
<p>This April deep dive is about <strong>Process Mining Data (PMD)</strong>: a structured set of metadata that turns pipeline executions into analyzable process events &#8211; so you can optimize for:</p>
<ul>
<li>speed</li>
<li>reliability</li>
<li>and (crucially) cost</li>
</ul></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_9">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_9  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_1">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Processminingdatatheshortdefinition' data-hl='2'></span><a href='#Processminingdatatheshortdefinition' id='Processminingdatatheshortdefinition_toc_headding'>Process mining data: the short definition</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WherePMDlivesinQilinCloud' data-hl='2'></span><a href='#WherePMDlivesinQilinCloud' id='WherePMDlivesinQilinCloud_toc_headding'>Where PMD lives in Qilin.Cloud</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WhatPMDcapturestheusefulbits' data-hl='2'></span><a href='#WhatPMDcapturestheusefulbits' id='WhatPMDcapturestheusefulbits_toc_headding'>What PMD captures (the useful bits)</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Costsignalsblocklevel' data-hl='3'></span><a href='#Costsignalsblocklevel' id='Costsignalsblocklevel_toc_headding'>Cost signals (block-level)</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Triggercontexttransactionlevel' data-hl='3'></span><a href='#Triggercontexttransactionlevel' id='Triggercontexttransactionlevel_toc_headding'>Trigger context (transaction-level)</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Customheaderstransactionlevel' data-hl='3'></span><a href='#Customheaderstransactionlevel' id='Customheaderstransactionlevel_toc_headding'>Custom headers (transaction-level)</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Processingspeedblocklevel' data-hl='3'></span><a href='#Processingspeedblocklevel' id='Processingspeedblocklevel_toc_headding'>Processing speed (block-level)</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Atinyexampleturningapipelineintoanalyzableevents' data-hl='2'></span><a href='#Atinyexampleturningapipelineintoanalyzableevents' id='Atinyexampleturningapipelineintoanalyzableevents_toc_headding'>A tiny example: turning a pipeline into analyzable events</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whythismattersdependingonwhoyouare' data-hl='2'></span><a href='#Whythismattersdependingonwhoyouare' id='Whythismattersdependingonwhoyouare_toc_headding'>Why this matters (depending on who you are)</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Developers' data-hl='3'></span><a href='#Developers' id='Developers_toc_headding'>Developers</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Agenciesintegrators' data-hl='3'></span><a href='#Agenciesintegrators' id='Agenciesintegrators_toc_headding'>Agencies &amp; integrators</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Merchants' data-hl='3'></span><a href='#Merchants' id='Merchants_toc_headding'>Merchants</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Investors' data-hl='3'></span><a href='#Investors' id='Investors_toc_headding'>Investors</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Theoldwisdomupgraded' data-hl='2'></span><a href='#Theoldwisdomupgraded' id='Theoldwisdomupgraded_toc_headding'>The old wisdom, upgraded</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_14">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_14  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_18  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Process mining data: the short definition</span></h2>
						<div class="et_pb_blurb_description"><p><strong>Process Mining Data (PMD)</strong> is information we attach to pipeline execution logs so you can answer questions like:</p>
<ul>
<li>Which processors are the most expensive per event?</li>
<li>Where do we spend time waiting (queues, retries, merges)?</li>
<li>Which triggers create the biggest bursts (cronjob vs user vs system)?</li>
<li>What’s the cost impact of switching from “Normal” to “Fast” processing?</li>
</ul>
<p>In other words: PMD helps you turn “a pipeline run” into “a measurable business process”.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_15">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_15  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_19  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Where PMD lives in Qilin.Cloud</span></h2>
						<div class="et_pb_blurb_description"><p>Qilin.Cloud already gives you <strong>Data Flow Tracking (DFT)</strong>: object-level and block-level visibility into what happened.</p>
<p>PMD is designed to fit into that same model:</p>
<ul>
<li><strong>Transaction-level fields</strong>: describe <em>who triggered the run</em> and with what context</li>
<li><strong>Block-level fields</strong>: describe <em>time and cost behavior</em> of individual execution steps</li>
</ul>
<p>That means you don’t need a second observability system just to do process mining. <br />You start with the telemetry you already have.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_20  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What PMD captures (the useful bits)</span></h2>
						<div class="et_pb_blurb_description"><p>Here are examples of PMD-style fields (conceptually):</p>
<h3>Cost signals (block-level)</h3>
<ul>
<li><strong>CostPerEvent</strong>: how expensive is it to process one object in this step?</li>
<li><strong>CostPerSecond</strong>: how expensive is time spent in this step?</li>
</ul>
<p>You can model cost in a way that matches your reality:</p>
<ul>
<li>compute cost (CPU-heavy transforms)</li>
<li>third-party API cost (paid endpoints)</li>
<li>operational cost (human attention, if you want to be cheeky)</li>
</ul>
<h3>Trigger context (transaction-level)</h3>
<ul>
<li><strong>TriggerAgent</strong>: who/what started this run?</li>
<li>system automation</li>
<li>a scheduled job</li>
<li>a user action</li>
</ul>
<p>This helps you spot patterns like:</p>
<ul>
<li>cronjobs cause predictable load</li>
<li>users cause chaotic bursts</li>
<li>system events create “silent storms”</li>
</ul>
<h3>Custom headers (transaction-level)</h3>
<p>This is the “attach context” feature.</p>
<p>If you trigger pipelines via HTTP, you can pass non-standard headers that become part of the execution record (excluding standard/protected headers). That enables things like:</p>
<ul>
<li>“this run is for customer X”</li>
<li>“this run is part of incident Y”</li>
<li>“this run is part of campaign Z”</li>
</ul>
<h3>Processing speed (block-level)</h3>
<p>Processing speed isn’t just “faster/slower”. It’s a <strong>resource policy</strong>.</p>
<p>Capturing the speed choice in telemetry lets you answer:</p>
<ul>
<li>how often do we use “Fast”?</li>
<li>what does it cost?</li>
<li>what does it prevent (e.g., overselling penalties)?</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_3">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_3  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.

&nbsp;
<h4><strong>Share your Qilin.Cloud Success Story</strong>
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_21  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>A tiny example: turning a pipeline into analyzable events</span></h2>
						<div class="et_pb_blurb_description"><p>Imagine a pipeline like:</p>
<ol>
<li>Buffer (smooth bursts)</li>
<li>Filter (policy)</li>
<li>Enrich (attributes)</li>
<li>Output connector (marketplace API)</li>
</ol>
<p>A PMD-enriched execution log could <em>conceptually</em> look like:</p>
<pre>{
  "transactionId": "dft_tx_123",
  "triggerAgent": "Cronjob",
  "customHeaders": { "tenant": "acme", "campaign": "spring-sale" },
  "blocks": [
    { "type": "BufferEntry", "durationMs": 120000, "costPerSecond": 0.01 },
    { "type": "Filter", "durationMs": 8000, "costPerEvent": 0.0002 },
    { "type": "Enrich", "durationMs": 22000, "costPerEvent": 0.0005 },
    { "type": "OutputConnectorByBatch", "durationMs": 60000, "costPerEvent": 0.001 }
  ]
}
</pre>
<p>Now you can compute things like:</p>
<ul>
<li>cost per pipeline run</li>
<li>cost per object</li>
<li>time spent waiting vs working</li>
<li>which step dominates both cost and latency</li>
</ul>
<p>That’s not just observability. That’s <strong>operational finance</strong>.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_22  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why this matters (depending on who you are)</span></h2>
						<div class="et_pb_blurb_description"><h3>Developers</h3>
<p>You get a quantitative feedback loop. Instead of arguing about performance, you measure and optimize.</p>
<h3>Agencies &amp; integrators</h3>
<p>You can give clients something rare: transparency. <br />“Here’s exactly why your sync costs X and takes Y.”</p>
<h3>Merchants</h3>
<p>You can tie technical choices to business outcomes:</p>
<ul>
<li>pay for speed where it prevents penalties</li>
<li>save money where delays don’t hurt revenue</li>
</ul>
<h3>Investors</h3>
<p>PMD makes unit economics visible:</p>
<ul>
<li>cost per synced offer</li>
<li>cost per marketplace update</li>
<li>cost of reliability under load</li>
</ul>
<p>Platforms that can measure cost can <em>improve margins</em>. That’s the game.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_23  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The old wisdom, upgraded</span></h2>
						<div class="et_pb_blurb_description"><p>People have always optimized processes. <br />We just used to do it with clipboards.</p>
<p>PMD is the modern clipboard, built into the pipeline.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>
<p>The post <a rel="nofollow" href="https://qilin.cloud/process-mining-data-cost-optimization/">Process Mining Data: Turning Pipeline Runs into Cost &amp; Optimization Insights</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Distributed Tracing: Debugging Commerce Pipelines Like a Detective (Not a Psychic)</title>
		<link>https://qilin.cloud/distributed-tracing-debugging-commerce-pipelines/</link>
		
		<dc:creator><![CDATA[Nhi Ngo]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 08:00:00 +0000</pubDate>
				<category><![CDATA[Engineering Deep Dives]]></category>
		<category><![CDATA[commerce ops]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[distributed tracing]]></category>
		<category><![CDATA[observability]]></category>
		<category><![CDATA[pipelines]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3759</guid>

					<description><![CDATA[<p>Trace IDs, correlation, and end-to-end visibility—how Qilin.Cloud makes cross-service commerce flows debuggable, measurable, and cheaper to operate.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/distributed-tracing-debugging-commerce-pipelines/">Distributed Tracing: Debugging Commerce Pipelines Like a Detective (Not a Psychic)</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="et_pb_section et_pb_section_2 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_16">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_16  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_4  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>You know the classic debugging ritual:</p>
<ol>
<li>Something breaks on a marketplace at 02:00.</li>
<li>You open logs.</li>
<li>You search for an order ID.</li>
<li>You find five different “order IDs” because *everything* uses a different identifier.</li>
<li>You start guessing.</li>
</ol>
<p>It’s a proud tradition. It’s also… not a strategy.</p>
<p><strong>Distributed tracing</strong> is what happens when we stop being psychics and start being detectives.</p>
<p>In this March deep dive, we’ll look at how Qilin.Cloud approaches <strong>end-to-end traceability</strong> across APIs, workflows, pipelines, and connectors &#8211; so you can answer questions like:</p>
<ul>
<li><em>Where did the latency come from?</em></li>
<li><em>Which processor slowed things down?</em></li>
<li><em>Did the connector call fail, retry, or time out?</em></li>
<li><em>Is the issue “our platform”, “their API”, or “the data”?</em></li>
</ul></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_17">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_17  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_2">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WhatdistributedtracingreallymeansinplainEnglish' data-hl='2'></span><a href='#WhatdistributedtracingreallymeansinplainEnglish' id='WhatdistributedtracingreallymeansinplainEnglish_toc_headding'>What “distributed tracing” really means (in plain English)</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#HowtracingfitsintoQilinCloudsarchitecture' data-hl='2'></span><a href='#HowtracingfitsintoQilinCloudsarchitecture' id='HowtracingfitsintoQilinCloudsarchitecture_toc_headding'>How tracing fits into Qilin.Cloud’s architecture</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatwetrace' data-hl='2'></span><a href='#Whatwetrace' id='Whatwetrace_toc_headding'>What we trace</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Apracticalexampletracingastockupdate' data-hl='2'></span><a href='#Apracticalexampletracingastockupdate' id='Apracticalexampletracingastockupdate_toc_headding'>A practical example: tracing a stock update</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatdeveloperscandowiththistoday' data-hl='2'></span><a href='#Whatdeveloperscandowiththistoday' id='Whatdeveloperscandowiththistoday_toc_headding'>What developers can do with this today</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#1CorrelateAPIrequestswithpipelineruns' data-hl='3'></span><a href='#1CorrelateAPIrequestswithpipelineruns' id='1CorrelateAPIrequestswithpipelineruns_toc_headding'>1) Correlate API requests with pipeline runs</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#2Makeretriesobservablenotjustautomatic' data-hl='3'></span><a href='#2Makeretriesobservablenotjustautomatic' id='2Makeretriesobservablenotjustautomatic_toc_headding'>2) Make retries *observable* (not just automatic)</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#3Turndebuggingintoafeedbackloop' data-hl='3'></span><a href='#3Turndebuggingintoafeedbackloop' id='3Turndebuggingintoafeedbackloop_toc_headding'>3) Turn debugging into a feedback loop</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whythismattersdependingonwhoyouare' data-hl='2'></span><a href='#Whythismattersdependingonwhoyouare' id='Whythismattersdependingonwhoyouare_toc_headding'>Why this matters (depending on who you are)</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Developers' data-hl='3'></span><a href='#Developers' id='Developers_toc_headding'>Developers</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Agenciesintegrators' data-hl='3'></span><a href='#Agenciesintegrators' id='Agenciesintegrators_toc_headding'>Agencies &amp; integrators</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Merchantsoperators' data-hl='3'></span><a href='#Merchantsoperators' id='Merchantsoperators_toc_headding'>Merchants &amp; operators</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Investors' data-hl='3'></span><a href='#Investors' id='Investors_toc_headding'>Investors</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Theclassiclessonstilltrue' data-hl='2'></span><a href='#Theclassiclessonstilltrue' id='Theclassiclessonstilltrue_toc_headding'>The classic lesson (still true)</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_22">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_22  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_31  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What “distributed tracing” really means (in plain English)</span></h2>
						<div class="et_pb_blurb_description"><p>A modern commerce sync is rarely one program.</p>
<p>It’s a chain of services:</p>
<ul>
<li>an API receives an update</li>
<li>a workflow validates and normalizes it</li>
<li>the orchestrator triggers a pipeline</li>
<li>processors enrich / filter / transform data</li>
<li>an output connector calls a third-party API</li>
<li>status and telemetry are recorded</li>
</ul>
<p><strong>Tracing</strong> ties all of that together with one idea:</p>
<blockquote>
<p><em><strong>&gt; Every request gets a unique “case file”, and every step in the system writes notes into it.</strong></em></p>
</blockquote>
<p>In practice, that means:</p>
<p>&#8211; a <strong>trace ID</strong> that stays the same across services<br />&#8211; <strong>spans</strong> (timed steps) for each meaningful operation<br />&#8211; <strong>correlation</strong> so logs, metrics, and errors all point to the same story</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_23">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_23  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_32  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>How tracing fits into Qilin.Cloud’s architecture</span></h2>
						<div class="et_pb_blurb_description"><p>Qilin.Cloud is built around the idea that <em>pipelines are operational assets</em>, not just “integration code”.</p>
<p>That’s why we treat observability as a first-class capability:</p>
<p>&#8211; <strong>Data Flow Tracking (DFT)</strong> gives you object-level delivery status and block-level execution details<br />&#8211; <strong>Transfer Status Engine (TSE)</strong> protects idempotency and prevents duplicate transfers<br />&#8211; <strong>Distributed tracing</strong> connects the dots between “API call”, “pipeline run”, and “connector request”</p>
<p>So the question changes from:</p>
<blockquote>
<p><em><strong>&gt; “Why is the sync slow?”</strong></em></p>
</blockquote>
<p>to</p>
<blockquote>
<p><em><strong>&gt; “Which span dominates latency, and what’s the cheapest fix?”</strong></em></p>
</blockquote></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_33  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What we trace</span></h2>
						<div class="et_pb_blurb_description"><p>A useful tracing strategy is opinionated. You don’t want “everything everywhere all at once”. You want the events that matter.</p>
<p>In Qilin.Cloud we focus on spans like:</p>
<ul>
<li>request received (API gateway / ingestion)</li>
<li>validation and schema checks</li>
<li>hashing / version comparison (change detection)</li>
<li>queuing / scheduling delays (buffering, backpressure)</li>
<li>processor execution (filter/enrich/transform/merge)</li>
<li>connector calls (outbound requests + retries)</li>
<li>persistence and audit logging (DFT/TSE updates)</li>
</ul>
<p>That’s the critical path: the stuff that explains <strong>time</strong>, <strong>cost</strong>, and <strong>failures</strong>.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_34  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>A practical example: tracing a stock update</span></h2>
						<div class="et_pb_blurb_description"><p>Let’s say you push a stock update for 20,000 offers.</p>
<p>Without tracing, you’ll typically see:</p>
<ul>
<li>“Accepted”</li>
<li>later: “Some items failed”</li>
<li>somewhere: “429 Too Many Requests”</li>
</ul>
<p>With tracing + DFT you can break the run down into:</p>
<ul>
<li>queue time (did we buffer the burst?)</li>
<li>processing time (CPU work in processors)</li>
<li>connector time (external API latency + rate limits)</li>
<li>retries / backoff time (how many attempts and why)</li>
</ul>
<p>A “slow run” becomes a measurable composition of spans.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_5">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_5  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.

&nbsp;
<h4><strong>Share your Qilin.Cloud Success Story</strong>
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_35  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What developers can do with this today</span></h2>
						<div class="et_pb_blurb_description"><h3>1) Correlate API requests with pipeline runs</h3>
<p>When you make API calls to Qilin.Cloud (or trigger pipelines from a webhook), attach a correlation header.</p>
<p>Example (illustrative):</p>
<pre>curl -X POST "https://api.qilin.cloud/&lt;resource&gt;" \
-H "Authorization: Bearer &lt;token&gt;" \
-H "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" \
-H "x-qilin-processing-speed: fast" \
-d @payload.json
</pre>
<p>Now your “case file” follows the object through the system. If something fails, you don’t hunt. You follow the trace.</p>
<h3>2) Make retries *observable* (not just automatic)</h3>
<p>Retries are a double-edged sword:</p>
<ul>
<li>they increase reliability</li>
<li>they can also hide instability and raise costs</li>
</ul>
<p>Tracing makes retries explicit:</p>
<ul>
<li>which calls retry</li>
<li>how often</li>
<li>how long backoff takes</li>
<li>whether we end up timing out anyway</li>
</ul>
<h3>3) Turn debugging into a feedback loop</h3>
<p>Once traces exist, you can optimize systematically:</p>
<ul>
<li>find the slow processor and refine it</li>
<li>split a pipeline into different speeds (critical vs routine)</li>
<li>introduce buffering for bursty endpoints</li>
<li>tighten timeouts and improve fallbacks</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_36  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why this matters (depending on who you are)</span></h2>
						<div class="et_pb_blurb_description"><h3>Developers</h3>
<p>You get reproducible debugging. No more “works on my machine” when the machine is a distributed system.</p>
<h3>Agencies &amp; integrators</h3>
<p>You can deliver faster because you can <em>prove</em> where time goes. This is a huge advantage when clients ask, “Why does this take so long?”</p>
<h3>Merchants &amp; operators</h3>
<p>You get fewer incidents and faster resolution. The “why is my marketplace out of sync?” conversation becomes short and factual.</p>
<h3>Investors</h3>
<p>Tracing reduces MTTR (mean time to repair) and supports scalable operations. That’s the difference between “a promising prototype” and “a platform you can run profitably.”</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_37  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The classic lesson (still true)</span></h2>
						<div class="et_pb_blurb_description"><p>Good operations isn’t magic. It’s instrumentation.</p>
<p>Distributed tracing is the modern version of what we always wanted:</p>
<ul>
<li>one identifier</li>
<li>one timeline</li>
<li>one story</li>
</ul></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>
<p>The post <a rel="nofollow" href="https://qilin.cloud/distributed-tracing-debugging-commerce-pipelines/">Distributed Tracing: Debugging Commerce Pipelines Like a Detective (Not a Psychic)</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Operational Control: Queue Storage, Credentials, and Advanced Routing in the Portal UI</title>
		<link>https://qilin.cloud/operational-control-queue-storage-credentials-advanced-routing-portal/</link>
		
		<dc:creator><![CDATA[Marc Costea]]></dc:creator>
		<pubDate>Sat, 28 Feb 2026 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[credentials]]></category>
		<category><![CDATA[operations]]></category>
		<category><![CDATA[portal]]></category>
		<category><![CDATA[queue storage]]></category>
		<category><![CDATA[routing]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3751</guid>

					<description><![CDATA[<p>February’s update focuses on operational control: manage queue storages and credentials in the Portal UI, and configure advanced routing/processing primitives with more confidence and less JSON spelunking.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/operational-control-queue-storage-credentials-advanced-routing-portal/">Operational Control: Queue Storage, Credentials, and Advanced Routing in the Portal UI</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_3 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_24">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_24  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_6  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>A platform reaches a certain point where “features” aren’t the bottleneck anymore.</p>
<p>Operations is.</p>
<p>You can have the best pipeline logic in the world, but if teams can’t:</p>
<ul>
<li>manage credentials safely</li>
<li>inspect and control queue storages</li>
<li>configure routing logic without fear</li>
<li>iterate on pipelines without breaking running executions</li>
</ul>
<p>…then the platform becomes a black box again.</p>
<p>February’s update is about <strong>operational control &#8211; </strong>the unglamorous superpower that makes complex integrations run calmly for months.</p>
<p>This month we focused on expanding Portal UI capabilities around:</p>
<ul>
<li><strong>Queue Storage management</strong></li>
<li><strong>Credential management</strong></li>
<li><strong>Advanced processor configuration (switch-case, filtering, merge, loop, enrichment)</strong></li>
</ul>
<p>In other words: more knobs, fewer prayers.</p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_25">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_25  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_3">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#QueueStorageManagementbufferingyoucanoperatenotjustconfigure' data-hl='2'></span><a href='#QueueStorageManagementbufferingyoucanoperatenotjustconfigure' id='QueueStorageManagementbufferingyoucanoperatenotjustconfigure_toc_headding'>Queue Storage Management: buffering you can operate, not just configure</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#CredentialManagementstoptreatingsecretslikepipelinecode' data-hl='2'></span><a href='#CredentialManagementstoptreatingsecretslikepipelinecode' id='CredentialManagementstoptreatingsecretslikepipelinecode_toc_headding'>Credential Management: stop treating secrets like pipeline code</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#AdvancedroutingandtransformationnowUIfriendly' data-hl='2'></span><a href='#AdvancedroutingandtransformationnowUIfriendly' id='AdvancedroutingandtransformationnowUIfriendly_toc_headding'>Advanced routing and transformation—now UI-friendly</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Fordevelopers' data-hl='2'></span><a href='#Fordevelopers' id='Fordevelopers_toc_headding'>For developers</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Formerchantsagenciesandinvestors' data-hl='2'></span><a href='#Formerchantsagenciesandinvestors' id='Formerchantsagenciesandinvestors_toc_headding'>For merchants, agencies, and investors</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Thedirectionisclear' data-hl='2'></span><a href='#Thedirectionisclear' id='Thedirectionisclear_toc_headding'>The direction is clear</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Readytorunintegrationswithoutthedrama' data-hl='2'></span><a href='#Readytorunintegrationswithoutthedrama' id='Readytorunintegrationswithoutthedrama_toc_headding'>Ready to run integrations without the drama?</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_30">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_30  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_45  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Queue Storage Management: buffering you can operate, not just configure</span></h2>
						<div class="et_pb_blurb_description"><p>Queue Storage (QQS) is powerful, but only if you can manage it confidently.</p>
<p>Operational teams need to answer:</p>
<ul>
<li>Which queue storages exist for this subscription?</li>
<li>What are their durations and schedules?</li>
<li>Are items piling up?</li>
<li>Are batches being released as expected?</li>
<li>Can we adjust thresholds without breaking pipelines?</li>
</ul>
<p>Bringing QQS management into the Portal UI turns buffering from “a clever config” into “an operational tool”.</p>
<p>That matters a lot when you’re running high-volume offer or catalog syncs across multiple channels.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_31">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_31  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_46  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Credential Management: stop treating secrets like pipeline code</span></h2>
						<div class="et_pb_blurb_description"><p>Credentials are not pipeline logic.</p>
<p>They’re security artifacts.</p>
<p>So the platform experience is moving toward a cleaner separation:</p>
<ul>
<li>pipeline definitions reference credentials by ID</li>
<li>credentials are managed centrally (create/update/rotate)</li>
<li>permissions control who can access or modify what</li>
</ul>
<p>When credential management is visible and structured, teams can:</p>
<ul>
<li>rotate keys without redeploying pipelines</li>
<li>separate agency responsibilities from merchant ownership</li>
<li>reduce “who still has the production token?” moments (which should not exist)</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_7">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_7  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.</p>
<p>&nbsp;</p>
<h4><strong>Share your Qilin.Cloud Success Story</strong><br />
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_47  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Advanced routing and transformation—now UI-friendly</span></h2>
						<div class="et_pb_blurb_description"><p>As pipelines grow, they stop being linear.</p>
<p>They become decision trees:</p>
<ul>
<li>filter out invalid objects</li>
<li>route based on marketplace/storefront</li>
<li>switch-case based on complex conditions</li>
<li>merge parallel branches</li>
<li>loop through collections when needed</li>
<li>enrich objects with rule-based actions</li>
</ul>
<p>Qilin.Cloud has been building these primitives for a while.</p>
<p>February’s focus has been making them easier to configure and operate through the Portal UI, so teams can:</p>
<ul>
<li>build complex routing without hand-editing JSON</li>
<li>review logic visually</li>
<li>reduce configuration mistakes</li>
<li>onboard new team members faster</li>
</ul>
<p>This is how a platform stays usable as it gets more powerful.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_48  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For developers</span></h2>
						<div class="et_pb_blurb_description"><p>Operational UI work might sound “non-technical”, but it’s actually developer leverage:</p>
<ul>
<li>fewer support tickets</li>
<li>fewer manual interventions</li>
<li>fewer misconfigurations</li>
<li>faster iteration cycles</li>
</ul>
<p>You spend less time being the “human control plane”.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_49  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For merchants, agencies, and investors</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li><strong>Merchants:</strong> more transparency and safer operation of pipelines in production.</li>
<li><strong>Agencies:</strong> easier delivery and maintenance; clearer boundaries of responsibility.</li>
<li><strong>Investors:</strong> this is maturity. Operational features reduce costs and unlock bigger customers with higher requirements.</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_50  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The direction is clear</span></h2>
						<div class="et_pb_blurb_description"><p>The story from the past 18 months has been consistent:</p>
<ul>
<li>build strong pipeline primitives (filtering, enrichment, merge, buffering)</li>
<li>make them observable (tracking and status)</li>
<li>make them operable (UI control and safe recovery)</li>
</ul>
<p>That’s how platforms earn trust.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_51  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Ready to run integrations without the drama?</span></h2>
						<div class="et_pb_blurb_description"><p>Complex commerce workflows will always have complexity.</p>
<p>The goal isn’t to pretend it’s simple.</p>
<p>The goal is to make complexity manageable &#8211; predictable, observable, and controllable.</p>
<p>That’s what February’s work is about. And it’s where Qilin.Cloud is heading.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/operational-control-queue-storage-credentials-advanced-routing-portal/">Operational Control: Queue Storage, Credentials, and Advanced Routing in the Portal UI</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pipeline Testing Mode: Pinned Data and Deterministic Debugging for Integrations</title>
		<link>https://qilin.cloud/pipeline-testing-mode-pinned-data-deterministic-debugging/</link>
		
		<dc:creator><![CDATA[Dinh Vo]]></dc:creator>
		<pubDate>Sat, 31 Jan 2026 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[deterministic]]></category>
		<category><![CDATA[developer experience]]></category>
		<category><![CDATA[pipelines]]></category>
		<category><![CDATA[testing]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3744</guid>

					<description><![CDATA[<p>January’s update introduces Testing Mode in the Pipeline Builder: run deterministic tests with pinned data, replay processors with historical context, and debug integrations without poking production systems.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/pipeline-testing-mode-pinned-data-deterministic-debugging/">Pipeline Testing Mode: Pinned Data and Deterministic Debugging for Integrations</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_4 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_32">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_32  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_8  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>Every integration engineer has done this dance:</p>
<ul>
<li>change a mapping</li>
<li>run the pipeline</li>
<li>wait</li>
<li>see a failure</li>
<li>change a field</li>
<li>run again</li>
<li>wait again</li>
<li>discover the failure is in a completely different step</li>
</ul>
<p>It’s not that we love it. It’s just how pipelines have traditionally been tested: <em>in production-like conditions, with real dependencies, and a lot of luck.</em></p>
<p>January’s update is about replacing luck with something more respectable:</p>
<p><strong>Testing Mode in the Pipeline Builder</strong> — powered by <strong>Pinned Data</strong>.</p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_33">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_33  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_4">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WhatisTestingMode' data-hl='2'></span><a href='#WhatisTestingMode' id='WhatisTestingMode_toc_headding'>What is Testing Mode?</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#PinnedDatatheconceptsimpleandpowerful' data-hl='2'></span><a href='#PinnedDatatheconceptsimpleandpowerful' id='PinnedDatatheconceptsimpleandpowerful_toc_headding'>Pinned Data: the concept (simple and powerful)</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Threetestingscenariossoyoucantestlikeagrownup' data-hl='2'></span><a href='#Threetestingscenariossoyoucantestlikeagrownup' id='Threetestingscenariossoyoucantestlikeagrownup_toc_headding'>Three testing scenarios (so you can test like a grown-up)</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#1Testthefullpipelineendtoendwithpinnedentrydata' data-hl='3'></span><a href='#1Testthefullpipelineendtoendwithpinnedentrydata' id='1Testthefullpipelineendtoendwithpinnedentrydata_toc_headding'>1) Test the full pipeline end-to-end (with pinned entry data)</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#2Testasingleprocessorusingrealhistoricalcontext' data-hl='3'></span><a href='#2Testasingleprocessorusingrealhistoricalcontext' id='2Testasingleprocessorusingrealhistoricalcontext_toc_headding'>2) Test a single processor using real historical context</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#3Testaprocessorinisolationnohistoricalcontextneeded' data-hl='3'></span><a href='#3Testaprocessorinisolationnohistoricalcontextneeded' id='3Testaprocessorinisolationnohistoricalcontextneeded_toc_headding'>3) Test a processor in isolation (no historical context needed)</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#AveryrealusecasetestenrichmentwithoutcallingthepricingAPI' data-hl='2'></span><a href='#AveryrealusecasetestenrichmentwithoutcallingthepricingAPI' id='AveryrealusecasetestenrichmentwithoutcallingthepricingAPI_toc_headding'>A very real use case: “test enrichment without calling the pricing API”</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whythismattersespeciallytoagencies' data-hl='2'></span><a href='#Whythismattersespeciallytoagencies' id='Whythismattersespeciallytoagencies_toc_headding'>Why this matters (especially to agencies)</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Fordevelopers' data-hl='2'></span><a href='#Fordevelopers' id='Fordevelopers_toc_headding'>For developers</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Formerchantsandinvestors' data-hl='2'></span><a href='#Formerchantsandinvestors' id='Formerchantsandinvestors_toc_headding'>For merchants and investors</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatsnext' data-hl='2'></span><a href='#Whatsnext' id='Whatsnext_toc_headding'>What’s next</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Testingshouldntrequirebravery' data-hl='2'></span><a href='#Testingshouldntrequirebravery' id='Testingshouldntrequirebravery_toc_headding'>Testing shouldn’t require bravery</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_38">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_38  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_61  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What is Testing Mode?</span></h2>
						<div class="et_pb_blurb_description"><p>Testing Mode lets you run pipeline logic <strong>without affecting actual pipeline execution</strong>.</p>
<p>That means you can validate:</p>
<ul>
<li>routing</li>
<li>filtering</li>
<li>enrichment</li>
<li>merge behavior</li>
<li>connector payload structure</li>
</ul>
<p>…without accidentally pushing real updates to a marketplace or polluting production logs with “test objects”.</p>
<p>The results are still observable (tracked like normal executions), but they’re flagged as test runs.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_39">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_39  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_62  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Pinned Data: the concept (simple and powerful)</span></h2>
						<div class="et_pb_blurb_description"><p>Pinned Data is a mechanism that replaces the live output of a processor with fixed mock data.</p>
<p>In normal runs:</p>
<ul>
<li>a processor does its real job (HTTP call, connector sync, etc.)</li>
<li>output depends on external systems, network, timing</li>
</ul>
<p>In test runs with pinned data:</p>
<ul>
<li>the processor’s real work is skipped</li>
<li>the output becomes deterministic</li>
<li>downstream steps can be tested with certainty</li>
</ul>
<p>This is the classic integration engineer’s dream:</p>
<blockquote>
<p><em><strong>&gt; “Let me test the next steps, even if the external API is flaky today.”</strong></em></p>
</blockquote></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_63  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Three testing scenarios (so you can test like a grown-up)</span></h2>
						<div class="et_pb_blurb_description"><h3>1) Test the full pipeline end-to-end (with pinned entry data)</h3>
<p>You provide pinned data for the entry processor, simulating the trigger object.</p>
<p>Result: the pipeline runs end-to-end on a controlled input, producing deterministic outputs.</p>
<h3>2) Test a single processor using real historical context</h3>
<p>You provide a previous Pipeline Execution ID.</p>
<p>Qilin loads the execution context from that run and re-executes only the processor you’re testing.</p>
<p>This is perfect when:</p>
<ul>
<li>you changed an enrichment rule</li>
<li>you adjusted a filter predicate</li>
<li>you want to replay one step against real production-like data</li>
</ul>
<h3>3) Test a processor in isolation (no historical context needed)</h3>
<p>You provide pinned input directly for the processor.</p>
<p>Result: fast, isolated, great for validating configs and behavior without waiting for upstream steps.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_9">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_9  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.</p>
<p>&nbsp;</p>
<h4><strong>Share your Qilin.Cloud Success Story</strong><br />
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_64  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>A very real use case: “test enrichment without calling the pricing API”</span></h2>
						<div class="et_pb_blurb_description"><p>You want to verify enrichment logic that depends on a pricing service.</p>
<p>But the pricing API is unstable today.</p>
<p>Pinned data lets you fake the pricing output so you can test:</p>
<ul>
<li>calculations</li>
<li>mapping</li>
<li>downstream connector payloads</li>
</ul>
<p>No external dependency. No waiting. No chaos.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_65  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why this matters (especially to agencies)</span></h2>
						<div class="et_pb_blurb_description"><p>Agencies live and die by delivery speed and reliability.</p>
<p>Testing Mode enables a cleaner workflow:</p>
<ul>
<li>build pipeline logic</li>
<li>test with pinned scenarios</li>
<li>validate edge cases</li>
<li>only then turn on live execution</li>
</ul>
<p>That’s how you reduce go-live risk without multiplying custom tooling.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_66  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For developers</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>deterministic tests for pipeline logic</li>
<li>faster iteration loops</li>
<li>easier debugging (“same input, same output”)</li>
<li>safer experimentation with advanced processors (merge, switch-case, enrichment, http calls)</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_67  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For merchants and investors</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>fewer production incidents caused by “untested config changes”</li>
<li>faster onboarding because pipelines can be validated before real data flows</li>
<li>stronger platform trust: changes are intentional and verifiable</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_68  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What’s next</span></h2>
						<div class="et_pb_blurb_description"><p>February will continue the “operational control” theme:</p>
<ul>
<li>expanded UI management for queue storage and credentials</li>
<li>more advanced routing and processor configuration in the portal</li>
</ul>
<p>Because once pipelines grow, operations needs knobs &#8211; not prayers.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_69  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Testing shouldn’t require bravery</span></h2>
						<div class="et_pb_blurb_description"><p>The traditional way of testing pipelines is stressful because it mixes two activities:</p>
<ul>
<li>validating logic</li>
<li>operating production</li>
</ul>
<p>Testing Mode separates them.</p>
<p>And honestly? That’s long overdue.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/pipeline-testing-mode-pinned-data-deterministic-debugging/">Pipeline Testing Mode: Pinned Data and Deterministic Debugging for Integrations</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Kaufland Offer Sync (Update-Only): The Safe Way to Keep Price and Stock Fresh</title>
		<link>https://qilin.cloud/kaufland-offer-sync-update-only-safe-price-stock/</link>
		
		<dc:creator><![CDATA[Tuyen Nguyen]]></dc:creator>
		<pubDate>Wed, 31 Dec 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[kaufland]]></category>
		<category><![CDATA[marketplace]]></category>
		<category><![CDATA[offer sync]]></category>
		<category><![CDATA[price]]></category>
		<category><![CDATA[stock]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3738</guid>

					<description><![CDATA[<p>December’s connector milestone: update-only Kaufland offer sync. Clean identification (EAN + condition + storefront), safe updates for price/stock/handling time, and batch exports for real-world volume.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/kaufland-offer-sync-update-only-safe-price-stock/">Kaufland Offer Sync (Update-Only): The Safe Way to Keep Price and Stock Fresh</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_5 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_40">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_40  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_10  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>Commerce marketplaces are not playgrounds.</p>
<p>If you’ve integrated with them long enough, you learn a cautious habit:</p>
<p><strong>Never create or overwrite things by accident.</strong></p>
<p>December’s connector work embraces that cautious, battle-earned mindset with an important milestone:</p>
<p><strong>Kaufland Connector (Update-Only Offer Sync)</strong></p>
<p>At this stage, the connector focuses on the safest and most operationally valuable capability first:</p>
<ul>
<li>updating existing offers (units) for:
<ul>
<li><strong>price</strong></li>
<li><strong>stock</strong></li>
<li><strong>handling time</strong></li>
</ul>
</li>
</ul>
<p>No surprise creations. No accidental duplication. Just clean, controlled updates.</p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_41">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_41  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_5">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whyupdateonlyisafeaturenotalimitation' data-hl='2'></span><a href='#Whyupdateonlyisafeaturenotalimitation' id='Whyupdateonlyisafeaturenotalimitation_toc_headding'>Why “update-only” is a feature, not a limitation</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#HowQilinidentifiesanexistingKauflandoffer' data-hl='2'></span><a href='#HowQilinidentifiesanexistingKauflandoffer' id='HowQilinidentifiesanexistingKauflandoffer_toc_headding'>How Qilin identifies an existing Kaufland offer</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Behavior' data-hl='3'></span><a href='#Behavior' id='Behavior_toc_headding'> Behavior</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Howtopushofferssinglevsbatch' data-hl='2'></span><a href='#Howtopushofferssinglevsbatch' id='Howtopushofferssinglevsbatch_toc_headding'>How to push offers: single vs batch</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Bestpracticesthedonthateyourselflateredition' data-hl='2'></span><a href='#Bestpracticesthedonthateyourselflateredition' id='Bestpracticesthedonthateyourselflateredition_toc_headding'>Best practices (the “don’t hate yourself later” edition)</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whobenefits' data-hl='2'></span><a href='#Whobenefits' id='Whobenefits_toc_headding'>Who benefits?</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Developers' data-hl='3'></span><a href='#Developers' id='Developers_toc_headding'>Developers</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Merchants' data-hl='3'></span><a href='#Merchants' id='Merchants_toc_headding'>Merchants</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Agencies' data-hl='3'></span><a href='#Agencies' id='Agencies_toc_headding'>Agencies</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#Investors' data-hl='3'></span><a href='#Investors' id='Investors_toc_headding'>Investors</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatsnext' data-hl='2'></span><a href='#Whatsnext' id='Whatsnext_toc_headding'>What’s next</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Marketplaceintegrationsrewardcaution' data-hl='2'></span><a href='#Marketplaceintegrationsrewardcaution' id='Marketplaceintegrationsrewardcaution_toc_headding'>Marketplace integrations reward caution</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_46">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_46  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_77  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why “update-only” is a feature, not a limitation</span></h2>
						<div class="et_pb_blurb_description"><p>In marketplaces, “create” is risky.</p>
<p>It’s easy to create the wrong offer with:</p>
<ul>
<li>the wrong condition</li>
<li>the wrong storefront</li>
<li>missing compliance fields</li>
<li>the wrong EAN mapping</li>
<li>inconsistent identifiers</li>
</ul>
<p>Those mistakes can be expensive.</p>
<p>So update-only sync is the disciplined, traditional approach:</p>
<p><em><strong>&gt; First, prove you can update reliably. Then expand scope.</strong></em></p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_47">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_47  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_78  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>How Qilin identifies an existing Kaufland offer</span></h2>
						<div class="et_pb_blurb_description"><p>In Kaufland, an offer (unit) is uniquely identified by the combination:</p>
<p><strong>**EAN + Condition + Storefront**</strong></p>
<p>That means the connector looks at these three pieces of information to locate the existing unit.</p>
<h3> Behavior</h3>
<ul>
<li><strong>If a matching unit is found</strong> → update price/stock/handling time</li>
<li><strong>If no matching unit is found</strong> → mark the sync as failed with:
<ul>
<li>`Cannot find existing offer`</li>
</ul>
</li>
</ul>
<p>This is the correct kind of strictness. It prevents “phantom offers” from appearing because a mapping was wrong.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_11">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_11  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.</p>
<p>&nbsp;</p>
<h4><strong>Share your Qilin.Cloud Success Story</strong><br />
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_79  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>How to push offers: single vs batch</span></h2>
						<div class="et_pb_blurb_description"><p>You can export offers using either:</p>
<ul>
<li>`OutputConnector` (single item)</li>
<li>`OutputConnectorByBatch` (bulk)</li>
</ul>
<p>Batch mode supports up to <strong>150 offers per batch</strong>, which is ideal for real-world offer volume and helps reduce request overhead.</p>
<p>A high-level flow looks like:</p>
<ol>
<li>build a pipeline that produces Offer objects</li>
<li>add an output processor (single or batch)</li>
<li>configure a `targetId` that represents the Kaufland storefront destination</li>
<li>onboard the channel using that same `targetId` so the connector knows where to send updates</li>
</ol>
<p>This keeps the pipeline definition and the channel onboarding aligned &#8211; no hidden mapping magic.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_80  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Best practices (the “don’t hate yourself later” edition)</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>Always include valid <strong>EAN</strong> and <strong>Condition</strong> on offers. They’re mandatory for correct unit matching.</li>
<li>Treat `targetId` as a stable contract. If it changes, your connector routing changes.</li>
<li>Prefer batch export for high-volume updates. It’s cheaper, faster, and friendlier to APIs.</li>
<li>Use Data Flow Tracking to monitor failures and spot “offer not found” patterns early &#8211; those usually indicate mapping issues.</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_81  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Who benefits?</span></h2>
						<div class="et_pb_blurb_description"><h3>Developers</h3>
<ul>
<li>clear identification logic (less ambiguity)</li>
<li>safer connector behavior (less risk during rollout)</li>
<li>batch export for operational throughput</li>
</ul>
<h3>Merchants</h3>
<ul>
<li>safer price/stock updates without accidental new offers</li>
<li>predictable behavior under load</li>
<li>cleaner error signals when something isn’t mapped correctly</li>
</ul>
<h3>Agencies</h3>
<ul>
<li>easier rollout strategy: start with updates, validate matching logic, then scale</li>
<li>fewer marketplace “oops moments” during go-live</li>
</ul>
<h3>Investors</h3>
<p>Connector depth expands addressable value. Update-only is a reliable first step toward full lifecycle sync while keeping risk low.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_82  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What’s next</span></h2>
						<div class="et_pb_blurb_description"><p>January will focus on the developer and operations experience again:</p>
<p><strong>pipeline testing mode</strong> and expanded UI capabilities &#8211; so teams can validate flows safely before turning them loose on production channels.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_83  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Marketplace integrations reward caution</span></h2>
						<div class="et_pb_blurb_description"><p>Fast and reckless breaks things.</p>
<p>Slow and deliberate builds trust.</p>
<p>Qilin.Cloud is taking the deliberate path &#8211; because that’s how integrations survive in the real world.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/kaufland-offer-sync-update-only-safe-price-stock/">Kaufland Offer Sync (Update-Only): The Safe Way to Keep Price and Stock Fresh</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Error Handling &#038; Manual Retry: Recovering from Failures Like a Grown-Up Platform</title>
		<link>https://qilin.cloud/error-handling-manual-retry-recover-like-grown-up-platform/</link>
		
		<dc:creator><![CDATA[Man T. Huu]]></dc:creator>
		<pubDate>Sun, 30 Nov 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[data flow tracking]]></category>
		<category><![CDATA[error handling]]></category>
		<category><![CDATA[manual retry]]></category>
		<category><![CDATA[operations]]></category>
		<category><![CDATA[resilience]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3730</guid>

					<description><![CDATA[<p>November’s update strengthens operational maturity: nuanced error statuses, continue/stop policies, manual retry for executions, and reproducibility safeguards so recovery is controlled—not chaotic.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/error-handling-manual-retry-recover-like-grown-up-platform/">Error Handling &amp; Manual Retry: Recovering from Failures Like a Grown-Up Platform</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_6 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_48">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_48  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_12  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>Every integration platform eventually faces the same moment.</p>
<p>A pipeline fails in production.</p>
<p>Not in a “dev environment” way. <br />In a “customers are waiting and the marketplace clock is ticking” way.</p>
<p>At that moment, the platform needs two qualities:</p>
<ol>
<li><strong>Honest error handling</strong> (clear status, not vague mystery states)</li>
<li><strong>Clean recovery</strong> (retry without rebuilding the whole world)</li>
</ol>
<p>November’s work has been about exactly that: giving Qilin.Cloud pipelines a more mature operational posture through:</p>
<ul>
<li><strong>advanced error handling settings</strong></li>
<li><strong>manual retry for pipeline and processor executions</strong></li>
<li><strong>reproducibility safeguards (locking definitions while running)</strong></li>
</ul>
<p>This is where platform trust is earned.</p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_49">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_49  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_6">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Theoldworlditfailedsowereruneverything' data-hl='2'></span><a href='#Theoldworlditfailedsowereruneverything' id='Theoldworlditfailedsowereruneverything_toc_headding'>The old world: “it failed, so we rerun everything”</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#ErrorhandlingthatmatchesrealityIgnoredvsWarningvsFailed' data-hl='2'></span><a href='#ErrorhandlingthatmatchesrealityIgnoredvsWarningvsFailed' id='ErrorhandlingthatmatchesrealityIgnoredvsWarningvsFailed_toc_headding'>Error handling that matches reality: Ignored vs Warning vs Failed</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Manualretrywhentheproblemisfixedtheworkshouldntbelost' data-hl='2'></span><a href='#Manualretrywhentheproblemisfixedtheworkshouldntbelost' id='Manualretrywhentheproblemisfixedtheworkshouldntbelost_toc_headding'>Manual retry: when the problem is fixed, the work shouldn’t be lost</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whydefinitionlockingmatters' data-hl='2'></span><a href='#Whydefinitionlockingmatters' id='Whydefinitionlockingmatters_toc_headding'>Why definition locking matters</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Fordevelopers' data-hl='2'></span><a href='#Fordevelopers' id='Fordevelopers_toc_headding'>For developers</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Formerchantsandagencies' data-hl='2'></span><a href='#Formerchantsandagencies' id='Formerchantsandagencies_toc_headding'>For merchants and agencies</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Forinvestors' data-hl='2'></span><a href='#Forinvestors' id='Forinvestors_toc_headding'>For investors</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatsnext' data-hl='2'></span><a href='#Whatsnext' id='Whatsnext_toc_headding'>What’s next</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Thegoalfailhonestlyrecovercleanly' data-hl='2'></span><a href='#Thegoalfailhonestlyrecovercleanly' id='Thegoalfailhonestlyrecovercleanly_toc_headding'>The goal: fail honestly, recover cleanly</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_54">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_54  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_93  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The old world: “it failed, so we rerun everything”</span></h2>
						<div class="et_pb_blurb_description"><p>Traditional integration recovery often looks like:</p>
<ul>
<li>re-run the whole job</li>
<li>hope duplicates don’t happen</li>
<li>manually reconcile partial updates</li>
<li>dig through logs to guess what happened</li>
</ul>
<p>It’s expensive, risky, and it doesn’t scale as you add more pipelines.</p>
<p>So Qilin.Cloud is moving toward a cleaner model:</p>
<p><em><strong>&gt; Treat executions as trackable artifacts you can inspect, classify, and retry.</strong></em></p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_55">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_55  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_94  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Error handling that matches reality: Ignored vs Warning vs Failed</span></h2>
						<div class="et_pb_blurb_description"><p>Not every error deserves the same response.</p>
<p>Sometimes:</p>
<ul>
<li>a product is missing a non-critical field → warn and continue</li>
<li>one optional enrichment service times out → warn and continue</li>
<li>the output connector rejects the object → fail the object (or the pipeline) depending on policy</li>
<li>a validation error occurs → stop, because continuing would produce bad data</li>
</ul>
<p>So processors can be configured with settings like:</p>
<ul>
<li><strong>continue on error</strong> (do we proceed downstream?)</li>
<li><strong>custom error status</strong> (how should this failure be classified?)</li>
</ul>
<p>This allows a pipeline to finish with nuance:</p>
<ul>
<li><strong>Completed</strong> (all good)</li>
<li><strong>Completed with warnings</strong> (action required, but business kept moving)</li>
<li><strong>Failed</strong> (hard stop)</li>
</ul>
<p>That is exactly how experienced operations teams think.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_95  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Manual retry: when the problem is fixed, the work shouldn’t be lost</span></h2>
						<div class="et_pb_blurb_description"><p>Sometimes failure isn’t caused by your data or your pipeline logic.</p>
<p>Sometimes it’s just the world:</p>
<ul>
<li>an external API is down</li>
<li>a token expired</li>
<li>a marketplace has a temporary outage</li>
<li>a partner system returns 500 for 20 minutes and then “recovers”</li>
</ul>
<p>In those cases, the right response is often:</p>
<p><strong>retry the execution once the dependency is healthy again.</strong></p>
<p>Qilin.Cloud now supports manual retry of:</p>
<ul>
<li>a <strong>pipeline execution</strong></li>
<li>a <strong>processor execution</strong></li>
</ul>
<p>based on execution identifiers from Data Flow Tracking.</p>
<p>This turns recovery into a controlled operation:</p>
<ul>
<li>inspect what failed</li>
<li>fix the root cause (credentials, upstream system, connectivity)</li>
<li>retry <em>only the relevant execution</em>, without replaying everything blindly</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_13">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_13  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.</p>
<p>&nbsp;</p>
<h4><strong>Share your Qilin.Cloud Success Story</strong><br />
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_96  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why definition locking matters</span></h2>
						<div class="et_pb_blurb_description"><p>Retries are only trustworthy when they’re reproducible.</p>
<p>If a pipeline definition changes while an execution is running, you get an ugly question:</p>
<p><em><strong>&gt; “Which version actually ran?”</strong></em></p>
<p>So one of the operational safeguards is making pipeline definitions effectively <strong>stable during execution</strong>. That way, when you retry an execution, you’re retrying the same logic &#8211; unless you intentionally deploy a new version.</p>
<p>This is the kind of “boring correctness” that makes debugging and audits sane.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_97  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For developers</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>explicit error semantics reduce debugging time</li>
<li>retries become controlled operations, not guesswork</li>
<li>execution identity becomes a first-class tool (“retry execution X”)</li>
<li>fewer custom “recovery scripts” and manual reconciliations</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_98  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For merchants and agencies</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>faster incident recovery</li>
<li>fewer duplicate updates</li>
<li>better transparency into what happened and what was retried</li>
<li>easier operations handover (“here’s the execution ID and the status story”)</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_99  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For investors</span></h2>
						<div class="et_pb_blurb_description"><p>Operational maturity is revenue maturity:</p>
<ul>
<li>fewer support escalations</li>
<li>higher trust from larger customers</li>
<li>more complex use cases become feasible</li>
<li>lower cost of operating at scale</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_100  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What’s next</span></h2>
						<div class="et_pb_blurb_description"><p>In December we’ll zoom into a very concrete connector milestone:</p>
<p><strong>Kaufland offer sync improvements &#8211; </strong>with a focus on update-only strategies that merchants can trust and agencies can implement cleanly.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_101  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The goal: fail honestly, recover cleanly</span></h2>
						<div class="et_pb_blurb_description"><p>Failures will happen.</p>
<p>The platform’s job isn’t to pretend they won’t.</p>
<p>The platform’s job is to make failure:</p>
<ul>
<li>observable</li>
<li>classifiable</li>
<li>recoverable</li>
</ul>
<p>That’s the direction Qilin.Cloud is heading—so operations feel less like firefighting and more like engineering.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/error-handling-manual-retry-recover-like-grown-up-platform/">Error Handling &amp; Manual Retry: Recovering from Failures Like a Grown-Up Platform</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Claim Check Pattern: Moving Files Through Pipelines Without Melting Them</title>
		<link>https://qilin.cloud/claim-check-pattern-moving-files-without-melting-pipelines/</link>
		
		<dc:creator><![CDATA[Carina Müller]]></dc:creator>
		<pubDate>Fri, 31 Oct 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[binary]]></category>
		<category><![CDATA[claim check pattern]]></category>
		<category><![CDATA[files]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[pipelines]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3723</guid>

					<description><![CDATA[<p>October’s update: support for the Claim Check pattern in Qilin.Cloud pipelines. Store binary data once, pass blob references through the flow, and handle uploads without memory pain.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/claim-check-pattern-moving-files-without-melting-pipelines/">The Claim Check Pattern: Moving Files Through Pipelines Without Melting Them</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_7 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_56">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_56  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_14  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>There’s a reason airports don’t hand you your suitcase and say: “Please carry this through every checkpoint yourself.”</p>
<p>They give you a <strong>claim ticket</strong>.</p>
<p>That’s the essence of the <strong>Claim Check pattern</strong> &#8211; a classic enterprise integration trick that becomes increasingly important in modern commerce, where “data” isn’t just JSON anymore:</p>
<ul>
<li>product images</li>
<li>PDFs (manuals, invoices, labels)</li>
<li>CSV exports</li>
<li>media assets for marketplaces</li>
</ul>
<p>October’s work has been about making Qilin.Cloud pipelines handle binary data in a way that’s sane, scalable, and operationally friendly:</p>
<p><strong>Store the file once. Pass references through the pipeline.</strong></p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_57">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_57  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_7">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Theproblemwithjustincludethebytes' data-hl='2'></span><a href='#Theproblemwithjustincludethebytes' id='Theproblemwithjustincludethebytes_toc_headding'>The problem with “just include the bytes”</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#BlobReferencesfilesasfirstclasscitizenswithoutthebytes' data-hl='2'></span><a href='#BlobReferencesfilesasfirstclasscitizenswithoutthebytes' id='BlobReferencesfilesasfirstclasscitizenswithoutthebytes_toc_headding'>Blob References: files as first-class citizens (without the bytes)</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WheretheClaimCheckpatternshines' data-hl='2'></span><a href='#WheretheClaimCheckpatternshines' id='WheretheClaimCheckpatternshines_toc_headding'>Where the Claim Check pattern shines</a></div></li><ul class="pac_dtoc_heading_level_3" role="group" ><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#1Productimagepipelines' data-hl='3'></span><a href='#1Productimagepipelines' id='1Productimagepipelines_toc_headding'>1) Product image pipelines</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#2Invoicelabelworkflows' data-hl='3'></span><a href='#2Invoicelabelworkflows' id='2Invoicelabelworkflows_toc_headding'>2) Invoice / label workflows</a></div></li><li class="pac_dtoc_li_heading_level_3" role="treeitem" ><div role="presentation" ><span data-href='#3Bulkcatalogexports' data-hl='3'></span><a href='#3Bulkcatalogexports' id='3Bulkcatalogexports_toc_headding'>3) Bulk catalog exports</a></div></li></ul><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#HTTPRequestProcessormultipartuploadswithoutmemorypain' data-hl='2'></span><a href='#HTTPRequestProcessormultipartuploadswithoutmemorypain' id='HTTPRequestProcessormultipartuploadswithoutmemorypain_toc_headding'>HTTP Request Processor: multipart uploads without memory pain</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Anoteforengineersthisisoldwisdomformodernpayloads' data-hl='2'></span><a href='#Anoteforengineersthisisoldwisdomformodernpayloads' id='Anoteforengineersthisisoldwisdomformodernpayloads_toc_headding'>A note for engineers: this is “old wisdom” for modern payloads</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Formerchantsagenciesandinvestors' data-hl='2'></span><a href='#Formerchantsagenciesandinvestors' id='Formerchantsagenciesandinvestors_toc_headding'>For merchants, agencies, and investors</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatsnext' data-hl='2'></span><a href='#Whatsnext' id='Whatsnext_toc_headding'>What’s next</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Dontcarrysuitcasesthroughthewholeairport' data-hl='2'></span><a href='#Dontcarrysuitcasesthroughthewholeairport' id='Dontcarrysuitcasesthroughthewholeairport_toc_headding'>Don’t carry suitcases through the whole airport</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_62">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_62  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_110  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The problem with “just include the bytes”</span></h2>
						<div class="et_pb_blurb_description"><p>If you try to push binary payloads through every pipeline step, a few things go wrong fast:</p>
<ul>
<li>memory spikes</li>
<li>request sizes explode</li>
<li>retries become expensive</li>
<li>logging and tracking become noisy (or impossible)</li>
<li>transformations become unsafe (“did we accidentally re-encode it?”)</li>
</ul>
<p>It’s the same lesson we learned years ago with large messages in messaging systems:</p>
<p><em><strong>&gt; Large payloads don’t belong in the pipe. They belong beside the pipe.</strong></em></p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_63">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_63  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_111  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Blob References: files as first-class citizens (without the bytes)</span></h2>
						<div class="et_pb_blurb_description"><p>In Qilin.Cloud, binary content can be represented as a <strong>BlobReference</strong> object.</p>
<p>Instead of carrying raw bytes, a pipeline can carry metadata like:</p>
<p>&#8211; blob name / container name<br />&#8211; public or internal URL<br />&#8211; content type<br />&#8211; size<br />&#8211; optional tags<br />&#8211; original filename</p>
<p>So a flow object might include something like:</p>
<pre>{
  "contentType": "image/jpeg",
  "fileName": "product_123.jpg",
  "size": 482193,
  "publicUrl": "https://…/product_123.jpg",
  "containerName": "assets"
}
</pre>
<p>Now every step downstream can refer to “the file” without transporting it.</p>
<p>That makes retries cheap, tracking clear, and throughput predictable.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_112  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Where the Claim Check pattern shines</span></h2>
						<div class="et_pb_blurb_description"><h3>1) Product image pipelines</h3>
<ul>
<li>ingest images from a DAM or PIM</li>
<li>store once</li>
<li>publish to multiple destinations (Shopware, marketplaces, feeds)</li>
</ul>
<h3>2) Invoice / label workflows</h3>
<ul>
<li>generate PDFs</li>
<li>store references</li>
<li>send links or forward to systems that fetch on demand</li>
</ul>
<h3>3) Bulk catalog exports</h3>
<ul>
<li>assemble big files</li>
<li>store as blobs</li>
<li>send references to partners instead of pushing megabytes through APIs repeatedly</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_113  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>HTTP Request Processor: multipart uploads without memory pain</span></h2>
						<div class="et_pb_blurb_description"><p>The HTTP Request Processor can handle multipart form uploads where the “file” is sourced from a URL (for example, a blob public URL).</p>
<p>That means you can build flows like:</p>
<ol>
<li>receive an image URL from a webhook</li>
<li>store it as a blob (or reference it)</li>
<li>upload it to a destination API via multipart</li>
<li>continue processing with tracking intact</li>
</ol>
<p>The pipeline stays stream-friendly and predictable.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_15">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_15  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.</p>
<p>&nbsp;</p>
<h4><strong>Share your Qilin.Cloud Success Story</strong><br />
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_114  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>A note for engineers: this is “old wisdom” for modern payloads</span></h2>
						<div class="et_pb_blurb_description"><p>Claim Check isn’t a new invention.</p>
<p>It’s one of those patterns seasoned integration engineers used long before “cloud native” became a phrase.</p>
<p>What’s new is that modern commerce workflows need it constantly &#8211; because media, documents, and binaries are now part of everyday commerce data.</p>
<p>Qilin.Cloud is making the pattern pipeline-native.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_115  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For merchants, agencies, and investors</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li><strong>Merchants:</strong> fewer failures when syncing images or documents; better reliability for catalog publishing.</li>
<li><strong>Agencies:</strong> cleaner implementations (no custom file-handling services), easier scaling across clients.</li>
<li><strong>Investors:</strong> binary handling is a capability multiplier—more workflows, bigger customers, less operational strain.</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_116  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What’s next</span></h2>
						<div class="et_pb_blurb_description"><p>In November, we’ll zoom into the moment every integration fears:</p>
<p><strong>something failed. Now what?</strong></p>
<p>We’ll cover improvements around error handling, reproducibility, and manual retries—so operations teams can recover cleanly without rebuilding history from scratch.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_117  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Don’t carry suitcases through the whole airport</span></h2>
						<div class="et_pb_blurb_description"><p>Carry a claim ticket.</p>
<p>That’s what Qilin.Cloud is bringing to binary data workflows: clean references, clean tracking, and pipelines that don’t melt under file payloads.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/claim-check-pattern-moving-files-without-melting-pipelines/">The Claim Check Pattern: Moving Files Through Pipelines Without Melting Them</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Time Entry &#038; Email: Scheduling and Notifications Built into Your Pipelines</title>
		<link>https://qilin.cloud/time-entry-email-scheduling-notifications-pipelines/</link>
		
		<dc:creator><![CDATA[Levent Yaman]]></dc:creator>
		<pubDate>Tue, 30 Sep 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[notifications]]></category>
		<category><![CDATA[pipelines]]></category>
		<category><![CDATA[scheduling]]></category>
		<category><![CDATA[time entry]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3716</guid>

					<description><![CDATA[<p>September’s update adds Time Entry scheduling and Email notifications to Qilin.Cloud pipelines—classic operational rhythms, now observable and configurable as first-class processors.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/time-entry-email-scheduling-notifications-pipelines/">Time Entry &amp; Email: Scheduling and Notifications Built into Your Pipelines</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_8 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_64">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_64  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_16  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>The oldest automation tool in the world is… time.</p>
<p>Before servers, before cron, before CI/CD, we had:</p>
<ul>
<li>“do this every day”</li>
<li>“run this every 15 minutes”</li>
<li>“send a report on Monday morning”</li>
<li>“wake me up if something breaks”</li>
</ul>
<p>Commerce operations still run on those rhythms.</p>
<p>So September’s update brings two classic, practical primitives directly into Qilin.Cloud pipelines:</p>
<ul>
<li><strong>Time Entry Processor</strong> &#8211; trigger flows on schedules (intervals or cron)</li>
<li><strong>Email Processor</strong> &#8211; send notifications (dynamic, templated, permissioned)</li>
</ul>
<p>This is the “boring” stuff that makes systems usable in production.</p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_65">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_65  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_8">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#TimeEntryProcessorcronjobsbutpipelinenative' data-hl='2'></span><a href='#TimeEntryProcessorcronjobsbutpipelinenative' id='TimeEntryProcessorcronjobsbutpipelinenative_toc_headding'>Time Entry Processor: cron jobs, but pipeline-native</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Apracticalscheduleexamplecron' data-hl='2'></span><a href='#Apracticalscheduleexamplecron' id='Apracticalscheduleexamplecron_toc_headding'>A practical schedule example (cron)</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#EmailProcessornotificationswithoutcustomservices' data-hl='2'></span><a href='#EmailProcessornotificationswithoutcustomservices' id='EmailProcessornotificationswithoutcustomservices_toc_headding'>Email Processor: notifications without custom services</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Examplesendanalertwhensomethingfails' data-hl='2'></span><a href='#Examplesendanalertwhensomethingfails' id='Examplesendanalertwhensomethingfails_toc_headding'>Example: send an alert when something fails</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whyschedulenotificationsbelongtogether' data-hl='2'></span><a href='#Whyschedulenotificationsbelongtogether' id='Whyschedulenotificationsbelongtogether_toc_headding'>Why schedule + notifications belong together</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Fordevelopers' data-hl='2'></span><a href='#Fordevelopers' id='Fordevelopers_toc_headding'>For developers</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Formerchantsagenciesandinvestors' data-hl='2'></span><a href='#Formerchantsagenciesandinvestors' id='Formerchantsagenciesandinvestors_toc_headding'>For merchants, agencies, and investors</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatsnext' data-hl='2'></span><a href='#Whatsnext' id='Whatsnext_toc_headding'>What’s next</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#AutomationisntmagicItsrhythm' data-hl='2'></span><a href='#AutomationisntmagicItsrhythm' id='AutomationisntmagicItsrhythm_toc_headding'>Automation isn’t magic. It’s rhythm.</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_70">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_70  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_127  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Time Entry Processor: cron jobs, but pipeline-native</span></h2>
						<div class="et_pb_blurb_description"><p>Time Entry is an entry processor that starts a pipeline based on time.</p>
<p>It supports common scheduling styles:</p>
<ul>
<li><strong>simple intervals</strong> (e.g., every 15 minutes)</li>
<li><strong>cron expressions</strong> (e.g., “every weekday at 08:00”)</li>
<li><strong>time zones</strong> (because commerce does not run on UTC feelings)</li>
</ul>
<p>If you’ve been building scheduled integrations for years, you already know why this matters:</p>
<ul>
<li>fewer external schedulers</li>
<li>fewer scattered jobs across servers</li>
<li>schedules live with the pipeline definition</li>
<li>everything is trackable and observable in one place</li>
</ul></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_71">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_71  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_128  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>A practical schedule example (cron)</span></h2>
						<div class="et_pb_blurb_description"><pre>{
  "id": "time_entry",
  "type": "Qilin.TimeEntry",
  "config": {
    "scheduleType": "Cronjob",
    "cronExpression": "0 */15 * ? * *",
    "timeZone": "Europe/Berlin"
  }
}
</pre>
<p>That’s “every 15 minutes” in a predictable time zone.</p>
<p>No separate infrastructure. No mystery scheduler running on an old VM “because it always worked”.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_129  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Email Processor: notifications without custom services</span></h2>
						<div class="et_pb_blurb_description"><p>The Email Processor does what it says:</p>
<ul>
<li>sends email to one or more recipients</li>
<li>supports To / CC / BCC</li>
<li>allows dynamic values from pipeline execution context</li>
<li>supports templates via Scriban (so emails can be personalized and structured)</li>
<li>uses stored credentials (so you don’t paste SMTP passwords into configs)</li>
</ul>
<p>This becomes useful immediately for:</p>
<ul>
<li>failure alerts</li>
<li>daily/weekly summaries</li>
<li>“import finished” notifications</li>
<li>“data quality issue detected” reports</li>
<li>agency handover and operational transparency</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_130  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Example: send an alert when something fails</span></h2>
						<div class="et_pb_blurb_description"><p>A simplified config:</p>
<pre>{
  "EmailProviderName": "CustomSmtpProvider",
  "credentialId": "credential-guid",
  "Receivers": { "raw": ["<span 
                data-original-string='DjkPSD4R05HKq834WwF+4A==4aaHKuicWF3Lfh/5h39Pv36xrCtBisvNGxvsVjuPHpfdv0='
                class='apbct-email-encoder'
                title='This contact has been encoded by Anti-Spam by CleanTalk. Click to decode. To finish the decoding make sure that JavaScript is enabled in your browser.'>op<span class="apbct-blur">*</span>@<span class="apbct-blur">*********</span>ny.com</span>"] },
  "From": { "raw": "<span 
                data-original-string='VWkgjLjWEt3hpkckwnUS5w==4aaTQgxM+/d/Xc4HJuPgd+TmAqfVZ5pIH1GbNFUEAqV7+A='
                class='apbct-email-encoder'
                title='This contact has been encoded by Anti-Spam by CleanTalk. Click to decode. To finish the decoding make sure that JavaScript is enabled in your browser.'>qi<span class="apbct-blur">**********</span>@<span class="apbct-blur">*********</span>ny.com</span>" },
  "Subject": "Qilin pipeline alert",
  "BodyContent": "Pipeline {{ FlowObjectAttributes.entry.pipelineId }} reported {{ FlowObjectAttributes.entry.status }}",
  "IsBodyHtml": false
}
</pre>
<p>You can also use templating to include richer context:</p>
<ul>
<li>object IDs</li>
<li>execution IDs</li>
<li>counts (how many items processed / failed)</li>
<li>links to tracking pages</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_17">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_17  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.</p>
<p>&nbsp;</p>
<h4><strong>Share your Qilin.Cloud Success Story</strong><br />
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_131  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why schedule + notifications belong together</span></h2>
						<div class="et_pb_blurb_description"><p>A scheduled pipeline without notifications is a silent machine.</p>
<p>A notification system without scheduling becomes reactive chaos.</p>
<p>Together, they enable a very traditional &#8211; but very effective &#8211; operational pattern:</p>
<ol>
<li>run predictable jobs on predictable rhythms</li>
<li>surface exceptions immediately</li>
<li>let humans focus on decisions, not polling dashboards</li>
</ol></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_132  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For developers</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>scheduling lives with the pipeline definition</li>
<li>templates are versionable, testable, and dynamic</li>
<li>credentials are managed centrally and permissioned</li>
<li>fewer “sidecar services” just to send emails or run cron</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_133  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For merchants, agencies, and investors</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li><strong>Merchants:</strong> get operational transparency without extra tooling</li>
<li><strong>Agencies:</strong> deliver “managed integrations” with built-in reporting and alerts</li>
<li><strong>Investors:</strong> these are features that reduce support cost and increase platform stickiness</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_134  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What’s next</span></h2>
						<div class="et_pb_blurb_description"><p>In October we’ll tackle a very modern problem with a very classic pattern:</p>
<p><strong>moving large binary data through pipelines without moving it through pipelines.</strong></p>
<p>(Yes, that sentence is weird. It will make sense.)</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_135  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Automation isn’t magic. It’s rhythm.</span></h2>
						<div class="et_pb_blurb_description"><p>Some of the best engineering work is turning “how we always did it” into platform primitives.</p>
<p>Time Entry and Email are exactly that: practical tools for real operations, baked into Qilin.Cloud.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/time-entry-email-scheduling-notifications-pipelines/">Time Entry &amp; Email: Scheduling and Notifications Built into Your Pipelines</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Batch Output + Switch-Case: Shipping Pallets and Making Smart Routing Decisions</title>
		<link>https://qilin.cloud/batch-output-switch-case-smart-routing/</link>
		
		<dc:creator><![CDATA[Tho Duong]]></dc:creator>
		<pubDate>Sun, 31 Aug 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[batch output]]></category>
		<category><![CDATA[pipelines]]></category>
		<category><![CDATA[routing]]></category>
		<category><![CDATA[switch-case]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3709</guid>

					<description><![CDATA[<p>August’s update: Batch Output Connector for efficient bulk delivery and Switch-Case routing with multi-conditions—so pipelines can scale in volume and intelligence without turning into code spaghetti.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/batch-output-switch-case-smart-routing/">Batch Output + Switch-Case: Shipping Pallets and Making Smart Routing Decisions</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_9 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_72">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_72  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_18  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>Batches are great.</p>
<p>But once you start batching, you immediately meet two new questions:</p>
<ol>
<li><strong>How do we ship the batch efficiently to a connector?</strong></li>
<li><strong>How do we route different items (or batches) differently without writing custom code?</strong></li>
</ol>
<p>August’s work tackles both with two powerful building blocks:</p>
<ul>
<li><strong>Batch Output Connector Processor</strong></li>
<li><strong>Switch-Case Processor (multi-conditions)</strong></li>
</ul>
<p>This is where pipelines start feeling less like “ETL flows” and more like programmable integration systems &#8211; without becoming an unmaintainable codebase.</p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_73">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_73  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_with_border et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_9">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#BatchOutputConnectorshippingpalletsnotsingleparcels' data-hl='2'></span><a href='#BatchOutputConnectorshippingpalletsnotsingleparcels' id='BatchOutputConnectorshippingpalletsnotsingleparcels_toc_headding'>Batch Output Connector: shipping pallets, not single parcels</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#SwitchCaseProcessorroutinglogicthatscales' data-hl='2'></span><a href='#SwitchCaseProcessorroutinglogicthatscales' id='SwitchCaseProcessorroutinglogicthatscales_toc_headding'>Switch-Case Processor: routing logic that scales</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whymulticonditionsmatter' data-hl='2'></span><a href='#Whymulticonditionsmatter' id='Whymulticonditionsmatter_toc_headding'>Why multi-conditions matter</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Fordevelopers' data-hl='2'></span><a href='#Fordevelopers' id='Fordevelopers_toc_headding'>For developers</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Formerchantsagenciesandinvestors' data-hl='2'></span><a href='#Formerchantsagenciesandinvestors' id='Formerchantsagenciesandinvestors_toc_headding'>For merchants, agencies, and investors</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatsnext' data-hl='2'></span><a href='#Whatsnext' id='Whatsnext_toc_headding'>What’s next</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Commercerunsondecisionsanddecisionsrunondata' data-hl='2'></span><a href='#Commercerunsondecisionsanddecisionsrunondata' id='Commercerunsondecisionsanddecisionsrunondata_toc_headding'>Commerce runs on decisions (and decisions run on data)</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_78">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_78  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_143  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Batch Output Connector: shipping pallets, not single parcels</span></h2>
						<div class="et_pb_blurb_description"><p>If QQS + Buffer Entry is the “warehouse staging area”, the Batch Output Connector is the “truck”.</p>
<p>Instead of calling a connector once per object, it can:</p>
<ul>
<li>take a list of objects</li>
<li>package them into a connector request</li>
<li>send them in one call</li>
<li>handle a response that contains success/error per item</li>
</ul>
<p>A typical config looks like:</p>
<pre>{
  "id": "batch_out",
  "type": "Qilin.BatchOutputConnector",
  "config": {
    "outputConnectorId": "connector-guid",
    "domainName": "Offer",
    "objectTypePath": "$.FlowObjectContents.entry.objectType",
    "objectIdsPath": "$.FlowObjectContents.entry.objectIds",
    "objectBodiesPath": "$.FlowObjectContents.entry.objectData"
  }
}
</pre>
<p>When paired with buffering, this gives you classic enterprise integration behavior:</p>
<ul>
<li>fewer HTTP calls</li>
<li>better throughput control</li>
<li>reduced connector overhead</li>
<li>easier handling of platform quotas and rate limits</li>
</ul></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_79">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_79  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_144  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Switch-Case Processor: routing logic that scales</span></h2>
						<div class="et_pb_blurb_description"><p>The next problem: not every object should go to the same place.</p>
<p>You might need to route by:</p>
<ul>
<li>marketplace</li>
<li>storefront</li>
<li>country</li>
<li>product category</li>
<li>pricing strategy</li>
<li>stock availability</li>
<li>compliance rules</li>
</ul>
<p>In the old world, routing becomes a pile of nested if-statements.</p>
<p>In Qilin, the Switch-Case Processor gives you a structured approach:</p>
<ul>
<li>each outgoing connection can define a condition (Filter Predicate)</li>
<li>Qilin activates the first matching case</li>
<li>a default route can catch everything else</li>
</ul>
<p>A simplified mental model:</p>
<ul>
<li>if case A matches → follow path A</li>
<li>else if case B matches → follow path B</li>
<li>else → follow default</li>
</ul>
<p>This is the “switch statement” you already know &#8211; adapted to pipeline routing.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_145  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why multi-conditions matter</span></h2>
						<div class="et_pb_blurb_description"><p>Multi-conditions are the difference between:</p>
<ul>
<li>“we can build a demo”</li>
<li>and “we can build policies”</li>
</ul>
<p>Because real routing often looks like:</p>
<ul>
<li>If it’s a hazardous material AND destination is EU → route to compliance enrichment</li>
<li>If it’s a luxury brand AND price is missing → stop and alert</li>
<li>If it’s marketplace X AND stock &lt; 5 → route to low-stock strategy</li>
</ul>
<p>Switch-case lets you express this cleanly, reuse it, and review it.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_146  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For developers</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>batching reduces connector chatter and failure surfaces</li>
<li>switch-case reduces custom code and makes routing auditable</li>
<li>both are pipeline-native, meaning you get tracking, logs, and consistent error behavior</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_147  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For merchants, agencies, and investors</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li><strong>Merchants:</strong> faster, more stable syncs—especially for high-volume catalog/offer updates</li>
<li><strong>Agencies:</strong> cleaner architectures and reusable routing templates across clients</li>
<li><strong>Investors:</strong> this is platform maturity that increases addressable use cases and lowers delivery cost</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_148  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What’s next</span></h2>
						<div class="et_pb_blurb_description"><p>In September, we’ll shift from routing and batching into a different kind of control:</p>
<p><strong>time.</strong></p>
<p>Scheduling is a core part of integration work, and Qilin is adding pipeline primitives for time-based triggering and notifications.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_149  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Commerce runs on decisions (and decisions run on data)</span></h2>
						<div class="et_pb_blurb_description"><p>Batches make shipping efficient.</p>
<p>Switch-case makes shipping intelligent.</p>
<p>Qilin.Cloud is building both—so your integrations can grow in volume and complexity without growing in chaos.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/batch-output-switch-case-smart-routing/">Batch Output + Switch-Case: Shipping Pallets and Making Smart Routing Decisions</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
