<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Thang Viet To — Writing</title>
    <link>https://thangto.vanilla-ott.com/blog</link>
    <description>9+ years on systems where mistakes cost money: exactly-once event pipelines, multi-tenant commerce SaaS, and a 300,000-product headless storefront. Node.js, TypeScript, PostgreSQL, Redis, AWS.</description>
    <language>en</language>
    <atom:link href="https://thangto.vanilla-ott.com/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Debugging a headless Shopify checkout you don&apos;t own</title>
      <link>https://thangto.vanilla-ott.com/blog/debugging-headless-shopify-checkout</link>
      <guid isPermaLink="true">https://thangto.vanilla-ott.com/blog/debugging-headless-shopify-checkout</guid>
      <description>When a headless checkout hand-off fails, the failing surface belongs to Shopify. Here&apos;s how to tell your bug apart from platform behaviour.</description>
      <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The Storefront API at 300,000 products</title>
      <link>https://thangto.vanilla-ott.com/blog/shopify-storefront-api-at-300k-products</link>
      <guid isPermaLink="true">https://thangto.vanilla-ott.com/blog/shopify-storefront-api-at-300k-products</guid>
      <description>Cursor pagination is fine at 500 products and painful at 300,000. What changes when your catalogue outgrows the happy path.</description>
      <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Idempotency isn&apos;t a safeguard, it&apos;s the design</title>
      <link>https://thangto.vanilla-ott.com/blog/idempotency-is-the-design</link>
      <guid isPermaLink="true">https://thangto.vanilla-ott.com/blog/idempotency-is-the-design</guid>
      <description>Every webhook arrives twice eventually. On money paths, that&apos;s not an edge case to handle later — it&apos;s the shape of the system.</description>
      <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>