<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Suganth</title>
    <description>The latest articles on DEV Community by Suganth (@suganth_g).</description>
    <link>https://dev.to/suganth_g</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3913496%2Fdf46f684-6803-466e-a9f6-af836cb3fdde.png</url>
      <title>DEV Community: Suganth</title>
      <link>https://dev.to/suganth_g</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suganth_g"/>
    <language>en</language>
    <item>
      <title>How a Small Product Sync Automation Changed Onboarding at Scale</title>
      <dc:creator>Suganth</dc:creator>
      <pubDate>Sun, 31 May 2026 15:35:34 +0000</pubDate>
      <link>https://dev.to/suganth_g/how-a-small-product-sync-automation-changed-onboarding-at-scale-57de</link>
      <guid>https://dev.to/suganth_g/how-a-small-product-sync-automation-changed-onboarding-at-scale-57de</guid>
      <description>&lt;h1&gt;
  
  
  How a Product Sync Automation Project Transformed Customer Onboarding
&lt;/h1&gt;

&lt;p&gt;When people think about impactful engineering work, they often imagine distributed systems, high-scale infrastructure, or complex algorithms.&lt;/p&gt;

&lt;p&gt;One of the most impactful projects I worked on wasn't any of those.&lt;/p&gt;

&lt;p&gt;It was solving a seemingly simple problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keeping product data in sync across multiple retail systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Years later, our CEO still remembers how much smoother customer onboarding became after this project.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Context: What is Commerce Connect?
&lt;/h1&gt;

&lt;p&gt;At Casa Retail AI, we have an internal platform called &lt;strong&gt;Commerce Connect (CC)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Commerce Connect acts as the central &lt;strong&gt;Product Information Management (PIM)&lt;/strong&gt; system and serves as the &lt;strong&gt;source of truth&lt;/strong&gt; for product information.&lt;/p&gt;

&lt;p&gt;Under the hood, it is built on top of a customized version of the open-source e-commerce platform &lt;strong&gt;Spree Commerce&lt;/strong&gt;, extended with multi-vendor and multi-tenant capabilities.&lt;/p&gt;

&lt;p&gt;Its primary responsibility is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Collect product information from multiple retail ecosystems and distribute it to every Casa product that needs it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once product data enters Commerce Connect, it is synchronized to multiple downstream systems.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Product Data Matters
&lt;/h1&gt;

&lt;p&gt;Many applications inside Casa depend on product information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product Consumers
&lt;/h2&gt;

&lt;p&gt;Once product data enters Commerce Connect, it is distributed to multiple systems across the Casa ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer-Facing Applications
&lt;/h3&gt;

&lt;p&gt;Several products rely on product information to provide context and improve customer experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lead management applications use product information during customer interactions.&lt;/li&gt;
&lt;li&gt;Ticket management systems link customer issues to specific products.&lt;/li&gt;
&lt;li&gt;Digital receipts display product names, images, and related details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Analytics &amp;amp; Reporting
&lt;/h3&gt;

&lt;p&gt;Product data powers business dashboards and reports, helping retailers answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which categories perform best?&lt;/li&gt;
&lt;li&gt;Which products attract the most attention?&lt;/li&gt;
&lt;li&gt;Which products generate the most complaints?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is also used for filtering and segmentation across various dashboards.&lt;/p&gt;

&lt;h3&gt;
  
  
  External Integrations
&lt;/h3&gt;

&lt;p&gt;Some tenants require product synchronization with external platforms, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;B2B applications&lt;/li&gt;
&lt;li&gt;E-commerce experiences&lt;/li&gt;
&lt;li&gt;Digital catalog/flipbook solutions&lt;/li&gt;
&lt;li&gt;Custom third-party integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because multiple systems depend on the same product catalog, maintaining a single source of truth is critical.&lt;/p&gt;

&lt;p&gt;This ensures every system across the ecosystem works with consistent and up-to-date product information.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Original Process
&lt;/h1&gt;

&lt;p&gt;Whenever a new tenant was onboarded, the first challenge was importing their entire product catalog.&lt;/p&gt;

&lt;p&gt;Most retailers maintained product data in POS systems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SAP&lt;/li&gt;
&lt;li&gt;Wondersoft&lt;/li&gt;
&lt;li&gt;APX&lt;/li&gt;
&lt;li&gt;Other proprietary retail platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The onboarding process looked like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer Success (CS) teams collected product exports from the tenant.&lt;/li&gt;
&lt;li&gt;The tenant provided CSV files containing product information.&lt;/li&gt;
&lt;li&gt;CS teams manually mapped CSV columns to Commerce Connect fields.&lt;/li&gt;
&lt;li&gt;The CSV was uploaded into Commerce Connect.&lt;/li&gt;
&lt;li&gt;Each upload created a batch task.&lt;/li&gt;
&lt;li&gt;Background workers processed the batch and created products inside Commerce Connect.&lt;/li&gt;
&lt;li&gt;After products were created, additional synchronization jobs were triggered for:

&lt;ul&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;ClickHouse&lt;/li&gt;
&lt;li&gt;B2B applications&lt;/li&gt;
&lt;li&gt;Other enabled integrations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Visually, the flow looked something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POS Export
    ↓
CSV File
    ↓
Manual Mapping
    ↓
Commerce Connect
    ↓
Batch Processing
    ↓
PG / ClickHouse / B2B Sync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, this seemed reasonable.&lt;/p&gt;

&lt;p&gt;But as the business scaled, the cracks started to show.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Problems We Started Seeing
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Product Data Became a Bottleneck
&lt;/h2&gt;

&lt;p&gt;A tenant could not fully use the platform until their product catalog was available.&lt;/p&gt;

&lt;p&gt;This meant onboarding timelines were heavily dependent on receiving CSV files from the customer.&lt;/p&gt;

&lt;p&gt;Sometimes the customer took days to provide them.&lt;/p&gt;

&lt;p&gt;Sometimes the files were incomplete.&lt;/p&gt;

&lt;p&gt;Sometimes they contained incorrect mappings.&lt;/p&gt;

&lt;p&gt;Engineering wasn't the bottleneck.&lt;/p&gt;

&lt;p&gt;Product data was.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Keeping Products Updated Was Painful
&lt;/h2&gt;

&lt;p&gt;Product catalogs constantly change.&lt;/p&gt;

&lt;p&gt;New products get added.&lt;/p&gt;

&lt;p&gt;Existing products get updated.&lt;/p&gt;

&lt;p&gt;Products become inactive.&lt;/p&gt;

&lt;p&gt;All of these changes happen in the retailer's POS system.&lt;/p&gt;

&lt;p&gt;Whenever a tenant changed something in their POS, Customer Success teams had to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request updated exports.&lt;/li&gt;
&lt;li&gt;Receive new CSV files.&lt;/li&gt;
&lt;li&gt;Upload them again.&lt;/li&gt;
&lt;li&gt;Reprocess the entire catalog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping thousands of products synchronized through spreadsheets quickly became operationally expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Every Tenant Required Manual Configuration
&lt;/h2&gt;

&lt;p&gt;Different POS providers generated different CSV formats.&lt;/p&gt;

&lt;p&gt;The Customer Success team had to repeatedly configure mappings for every upload.&lt;/p&gt;

&lt;p&gt;The process was repetitive, error-prone, and difficult to scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Key Observation
&lt;/h2&gt;

&lt;p&gt;The product data already existed inside the POS systems.&lt;/p&gt;

&lt;p&gt;Why were we asking humans to manually export and upload it?&lt;/p&gt;

&lt;p&gt;Why not fetch it directly from the source?&lt;/p&gt;




&lt;h1&gt;
  
  
  The Solution: Pull Products Directly From POS Providers
&lt;/h1&gt;

&lt;p&gt;SAP was the first provider that offered APIs for product retrieval.&lt;/p&gt;

&lt;p&gt;Instead of waiting for CSV exports, we integrated directly with their APIs and automatically imported products into Commerce Connect.&lt;/p&gt;

&lt;p&gt;The result was immediate.&lt;/p&gt;

&lt;p&gt;No spreadsheets.&lt;/p&gt;

&lt;p&gt;No manual exports.&lt;/p&gt;

&lt;p&gt;No repeated uploads.&lt;/p&gt;

&lt;p&gt;Just product synchronization directly from the source system.&lt;/p&gt;

&lt;p&gt;After the success of the SAP integration, we expanded the same approach to other POS providers.&lt;/p&gt;




&lt;h1&gt;
  
  
  Designing for Scale
&lt;/h1&gt;

&lt;p&gt;One requirement was clear:&lt;/p&gt;

&lt;p&gt;We didn't want to rewrite the entire synchronization pipeline every time a new POS provider was added.&lt;/p&gt;

&lt;p&gt;So we introduced a provider abstraction using a Factory Pattern.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"sap_iplanet"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The factory dynamically resolves and instantiates the appropriate provider implementation.&lt;/p&gt;

&lt;p&gt;Each provider only needs to answer a few questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to authenticate?&lt;/li&gt;
&lt;li&gt;How to fetch products?&lt;/li&gt;
&lt;li&gt;How to transform data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else remains shared.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POS Provider
      ↓
Provider Adapter
      ↓
Commerce Connect
      ↓
Existing Sync Pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gave us a huge advantage.&lt;/p&gt;

&lt;p&gt;Adding a new POS integration became as simple as creating a new provider class.&lt;/p&gt;

&lt;p&gt;The provider automatically inherited:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batch processing&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Task creation&lt;/li&gt;
&lt;li&gt;Product synchronization&lt;/li&gt;
&lt;li&gt;PostgreSQL sync&lt;/li&gt;
&lt;li&gt;ClickHouse sync&lt;/li&gt;
&lt;li&gt;B2B integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The integration surface became dramatically smaller.&lt;/p&gt;




&lt;h1&gt;
  
  
  Eliminating Repetitive Mapping Work
&lt;/h1&gt;

&lt;p&gt;The old CSV process required Customer Success teams to repeatedly map columns.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CSV Column          → Casa Field

item_code           → SKU
item_name           → Product Name
dept_name           → Category
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every upload carried the risk of mapping mistakes.&lt;/p&gt;

&lt;p&gt;With APIs, we could see the complete product schema exposed by the provider.&lt;/p&gt;

&lt;p&gt;The mapping became a one-time configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Provider Field      → Casa Field

item_code           → SKU
item_name           → Product Name
dept_name           → Category
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After configuration, all future synchronizations happened automatically.&lt;/p&gt;

&lt;p&gt;This significantly reduced operational effort.&lt;/p&gt;




&lt;h1&gt;
  
  
  More Control Over Synchronization
&lt;/h1&gt;

&lt;p&gt;The CSV approach only supported full catalog uploads.&lt;/p&gt;

&lt;p&gt;Whether one product changed or ten thousand products changed, the entire file was processed again.&lt;/p&gt;

&lt;p&gt;With API-based synchronization, we gained much more control.&lt;/p&gt;

&lt;p&gt;We could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull products on a schedule.&lt;/li&gt;
&lt;li&gt;Fetch only relevant updates.&lt;/li&gt;
&lt;li&gt;Track synchronization status.&lt;/li&gt;
&lt;li&gt;Improve error visibility.&lt;/li&gt;
&lt;li&gt;Retry failed imports independently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The synchronization process became far more predictable and manageable.&lt;/p&gt;




&lt;h1&gt;
  
  
  Solving the "I Can't Wait Until Tomorrow" Problem
&lt;/h1&gt;

&lt;p&gt;While nightly synchronization worked for most tenants, some businesses needed updates immediately.&lt;/p&gt;

&lt;p&gt;Waiting until the next scheduled pull was not acceptable.&lt;/p&gt;

&lt;p&gt;To solve this, we introduced a product upsert API.&lt;/p&gt;

&lt;p&gt;Now tenants had two options:&lt;/p&gt;

&lt;h3&gt;
  
  
  Pull Model
&lt;/h3&gt;

&lt;p&gt;Commerce Connect fetches products from the provider daily.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Provider → Commerce Connect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Push Model
&lt;/h3&gt;

&lt;p&gt;External systems push product updates directly into Commerce Connect whenever changes occur.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Provider → Product API → Commerce Connect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This hybrid model gave tenants the flexibility they needed while preserving a single source of truth.&lt;/p&gt;




&lt;h1&gt;
  
  
  Operational Reliability and Monitoring
&lt;/h1&gt;

&lt;p&gt;Automation is only valuable if it is reliable.&lt;/p&gt;

&lt;p&gt;Once product synchronization became dependent on external POS APIs, we had to account for situations outside our control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API credentials changed&lt;/li&gt;
&lt;li&gt;Access tokens expired&lt;/li&gt;
&lt;li&gt;Provider endpoints became unavailable&lt;/li&gt;
&lt;li&gt;Network failures occurred&lt;/li&gt;
&lt;li&gt;Providers returned unexpected response formats&lt;/li&gt;
&lt;li&gt;Product payload validation failures happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To ensure synchronization issues never went unnoticed, we built proactive monitoring and alerting into the pipeline.&lt;/p&gt;

&lt;p&gt;Whenever a synchronization task encountered unexpected failures, automated Discord alerts were triggered with relevant diagnostic information, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tenant name&lt;/li&gt;
&lt;li&gt;Provider name&lt;/li&gt;
&lt;li&gt;Failure reason&lt;/li&gt;
&lt;li&gt;API response details&lt;/li&gt;
&lt;li&gt;Task identifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allowed the Customer Success team to immediately investigate whether the issue was caused by invalid credentials, provider-side outages, configuration changes, or data quality problems.&lt;/p&gt;

&lt;p&gt;Instead of discovering synchronization failures days later through customer complaints, the team could identify and resolve issues proactively.&lt;/p&gt;

&lt;p&gt;The result was a much more reliable synchronization platform and significantly reduced operational risk as the number of integrated tenants continued to grow.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Business Impact
&lt;/h1&gt;

&lt;p&gt;From a technical perspective, this wasn't the most complex system I've built.&lt;/p&gt;

&lt;p&gt;There were no distributed consensus algorithms.&lt;/p&gt;

&lt;p&gt;No cutting-edge infrastructure.&lt;/p&gt;

&lt;p&gt;No massive scale challenges.&lt;/p&gt;

&lt;p&gt;But the impact was real.&lt;/p&gt;

&lt;p&gt;Customer onboarding became significantly smoother.&lt;/p&gt;

&lt;p&gt;Customer Success teams no longer spent hours chasing spreadsheets.&lt;/p&gt;

&lt;p&gt;Product synchronization became reliable and automated.&lt;/p&gt;

&lt;p&gt;New POS integrations became faster to implement.&lt;/p&gt;

&lt;p&gt;Operational effort reduced dramatically.&lt;/p&gt;

&lt;p&gt;Most importantly, the business could scale without product data becoming a bottleneck.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwncbsrhnz7eoz3eqhoi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwncbsrhnz7eoz3eqhoi.png" alt=" " width="800" height="923"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What I Learned
&lt;/h1&gt;

&lt;p&gt;One lesson has stayed with me throughout my career:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The most valuable engineering work is not always the most technically sophisticated work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the highest-leverage solution is simply removing friction from a process people repeat every day.&lt;/p&gt;

&lt;p&gt;At the time, this felt like a small automation project.&lt;/p&gt;

&lt;p&gt;Today, many of the people using the platform don't even realize the problem it solved.&lt;/p&gt;

&lt;p&gt;That's probably the best outcome an engineering solution can have.&lt;/p&gt;

&lt;p&gt;When a process becomes so smooth that people forget it was ever difficult.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>data</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
