<?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>Tho Duong | Qilin.Cloud</title>
	<atom:link href="https://qilin.cloud/author/t-duong/feed/" rel="self" type="application/rss+xml" />
	<link>https://qilin.cloud</link>
	<description>Technology Platform for composable e-commerce</description>
	<lastBuildDate>Wed, 25 Mar 2026 15:04:41 +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>Tho Duong | Qilin.Cloud</title>
	<link>https://qilin.cloud</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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[<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>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_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_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='#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_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_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>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_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_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>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_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>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_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>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_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>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_12  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_13  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>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>
		<item>
		<title>Filter Predicates: Routing Data with Rules You Can Version</title>
		<link>https://qilin.cloud/filter-predicates-routing-data-with-versionable-rules/</link>
		
		<dc:creator><![CDATA[Tho Duong]]></dc:creator>
		<pubDate>Thu, 31 Oct 2024 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[data quality]]></category>
		<category><![CDATA[filtering]]></category>
		<category><![CDATA[pipelines]]></category>
		<category><![CDATA[policy]]></category>
		<category><![CDATA[routing]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3556</guid>

					<description><![CDATA[<p>The post <a rel="nofollow" href="https://qilin.cloud/filter-predicates-routing-data-with-versionable-rules/">Filter Predicates: Routing Data with Rules You Can Version</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>Every integration team has a &#8220;box of rules&#8221;.</p>
<p>If the order is from marketplace X → do Y. <br />If the product is missing a price → stop. <br />If the customer is under 18 and in region Z → don’t send it.</p>
<p>Traditionally, those rules live in scattered places: code, scripts, ETL tools, half-remembered Slack messages, and the occasional Post-it note stuck to a monitor (an ancient and powerful artifact).</p>
<p>In October, we’ve been pushing a simple idea hard:</p>
<p><strong>Rules should be data. Not code.</strong></p>
<p>That’s what <strong>Filter Predicates</strong> are in Qilin.Cloud: a compact, JSON-friendly way to express &#8220;should this object go down this path?&#8221;—and to reuse the same logic across filtering, routing, and conditional execution.</p></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_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='#WhatisaFilterPredicate' data-hl='2'></span><a href='#WhatisaFilterPredicate' id='WhatisaFilterPredicate_toc_headding'>What is a Filter Predicate?</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#FromsinglepredicatestoreallogicANDORtrees' data-hl='2'></span><a href='#FromsinglepredicatestoreallogicANDORtrees' id='FromsinglepredicatestoreallogicANDORtrees_toc_headding'>From single predicates to real logic: AND / OR trees</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#ApracticalexampleOnlysyncactiveEUofferswithstock' data-hl='2'></span><a href='#ApracticalexampleOnlysyncactiveEUofferswithstock' id='ApracticalexampleOnlysyncactiveEUofferswithstock_toc_headding'>A practical example: "Only sync active EU offers with stock"</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WherepredicatesshowupinQilinCloud' data-hl='2'></span><a href='#WherepredicatesshowupinQilinCloud' id='WherepredicatesshowupinQilinCloud_toc_headding'>Where predicates show up in Qilin.Cloud</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whythismattersalittlemorethanyouthink' data-hl='2'></span><a href='#Whythismattersalittlemorethanyouthink' id='Whythismattersalittlemorethanyouthink_toc_headding'>Why this matters (a little more than you think)</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='#Readytobuildsmarterpipelines' data-hl='2'></span><a href='#Readytobuildsmarterpipelines' id='Readytobuildsmarterpipelines_toc_headding'>Ready to build smarter pipelines?</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_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>What is a Filter Predicate?</span></h2>
						<div class="et_pb_blurb_description"><p>A <strong>Filter Predicate</strong> is a structured condition that can evaluate a value inside your pipeline’s execution context.</p>
<p>At the core, it’s three things:</p>
<ul>
<li><strong>operator</strong>: what comparison to perform</li>
<li><strong>path</strong>: where to read the value from (JSONPath)</li>
<li><strong>value</strong>: what to compare against (raw value or another path)</li>
</ul>
<p>Supported operators include:</p>
<p>`<em>eq</em>`, `<em>ne</em>`, `<em>gt</em>`, `<em>gte</em>`, `<em>lt</em>`, `<em>lte</em>`, `<em>contains</em>`, `<em>startsWith</em>`, `<em>endsWith</em>`, `<em>in</em>`, `<em>nin</em>`, `<em>exists</em>`</p>
<p>So yes—this is the battle-tested stuff you’ve been writing by hand for years, made explicit and portable.</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_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>From single predicates to real logic: AND / OR trees</span></h2>
						<div class="et_pb_blurb_description"><p>Most real-world rules aren’t a single comparison; they’re combinations.</p>
<p>That’s why Qilin predicates can be composed via a <strong>PredicateContainer</strong> that supports:</p>
<ul>
<li><strong>AND</strong>: all sub-predicates must match</li>
<li><strong>OR</strong>: at least one sub-predicate must match</li>
</ul>
<p>That gives you readable, versionable logic without building a tiny programming language in your own codebase (because nobody deserves that fate twice).</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>A practical example: "Only sync active EU offers with stock"</span></h2>
						<div class="et_pb_blurb_description"><p>Let’s say you only want to sync offers that are:</p>
<ul>
<li>active</li>
<li>in the EU region</li>
<li>stock &gt; 0</li>
</ul>
<p>A predicate container could look like this:</p>
<pre><code class="language-json">{
  "operator": "and",
  "subPredicates": [
    { "operator": "eq", "path": "$.FlowObjectContents.entry.status", "value": { "raw": "active" } },
    { "operator": "in", "path": "$.FlowObjectContents.entry.region", "value": { "raw": ["DE", "AT", "NL", "BE"] } },
    { "operator": "gt", "path": "$.FlowObjectContents.entry.stock", "value": { "raw": 0 } }
  ]
}</code></pre>
<p>Now that rule can power multiple things:</p>
<ul>
<li>a filtering processor (“stop the branch if it doesn’t match”)</li>
<li>a condition processor (“route to path A if true, B if false”)</li>
<li>a switch-case processor (“route to the first matching case, or default”)</li>
</ul>
<p>Same rule. Different execution semantics. Less duplication.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_24  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 predicates show up in Qilin.Cloud</span></h2>
						<div class="et_pb_blurb_description"><h3>1) Qilin Object Filtering Processor</h3>
<p>This processor filters based on the <strong>FlowObjectContent</strong> and a configured object type path. If the predicate fails, the branch stops &#8211; cleanly.</p>
<p>Example (simplified):</p>
<pre>{<br /> "type": "Qilin.QilinObjectFiltering",<br /> "config": {<br />  "rules": {<br />   "order": {<br />    "name": "Only orders from Shopee",<br />    "predicate": {<br />     "operator": "contains",<br />     "path": "$.marketplaceName.en-GB",<br />     "value": { "raw": "Shopee" }<br />    }<br />   }<br />  },<br />  "ObjectTypePath": "$.FlowObjectAttributes.entry.objectType"<br /> }<br />}</p>
</pre>
<h3>2) Condition Processor</h3>
<p>Same predicate idea, but different behavior: it doesn’t &#8220;stop&#8221;; it <strong>directs</strong> flow. Connections out of the processor declare what they expect (`true` or `false`), and Qilin activates the matching paths.</p>
<h3>3) Switch-Case Processor</h3>
<p>This is routing for grown-ups.</p>
<p>Each connection can contain a predicate condition, and Qilin will activate the matching case &#8211; plus a default connection when nothing matches.</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.</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_25  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 (a little more than you think)</span></h2>
						<div class="et_pb_blurb_description"><h3>For developers</h3>
<ul>
<li><strong>No more hard-coded routing rules</strong> in one-off services.</li>
<li><strong>Rules become configuration</strong> you can store, diff, review, and roll back.</li>
<li><strong>JSONPath gives you power</strong> without forcing you to write custom selectors.</li>
<li><strong>Shared logic across processors</strong> means fewer subtle inconsistencies.</li>
</ul>
<h3>For businesses (merchants + agencies)</h3>
<ul>
<li>Filtering rules are visible and explainable.</li>
<li>Agencies can build reusable “policy packs” for clients (e.g., compliance, pricing strategy, catalog hygiene).</li>
<li>Merchants get safer automations: fewer accidental pushes of incomplete or forbidden data.</li>
</ul>
<h3>For investors</h3>
<p>This is the kind of &#8220;boring feature&#8221; that scales revenue: it reduces implementation cost per customer and makes the platform more composable.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_26  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>Rules are only half the story.</p>
<p>Next month, we’ll talk about something just as foundational: <strong>secure access</strong>. Specifically, how Qilin.Cloud is evolving API keys, roles, and permissions so teams can collaborate without handing out “master keys” to everything.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_27  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 build smarter pipelines?</span></h2>
						<div class="et_pb_blurb_description"><p>If you’ve ever said &#8220;just add another if-statement&#8221; &#8211; and then regretted it six months later &#8211; Filter Predicates are your new best friend.</p>
<p>They keep your logic explicit, reusable, and tame.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>
<p>The post <a rel="nofollow" href="https://qilin.cloud/filter-predicates-routing-data-with-versionable-rules/">Filter Predicates: Routing Data with Rules You Can Version</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
