
  <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
      <title>ROXL&#39;s Blog - Random Online eXperiment Lab</title>
      <link>https://roxl.net/blog</link>
      <description>Automating. Saving time. Making the world better.</description>
      <language>en-us</language>
      <managingEditor>therawlex@gmail.com (Artem Krivoshchekov)</managingEditor>
      <webMaster>therawlex@gmail.com (Artem Krivoshchekov)</webMaster>
      <lastBuildDate>Sat, 08 Aug 2026 00:00:00 GMT</lastBuildDate>
      <atom:link href="https://roxl.net/tags/cactusplay-marketplace/feed.xml" rel="self" type="application/rss+xml"/>
      
  <item>
    <guid>https://roxl.net/blog/backend/analytics-counters-should-not-live-in-theme-files</guid>
    <title>Analytics counters do not belong in theme files</title>
    <link>https://roxl.net/blog/backend/analytics-counters-should-not-live-in-theme-files</link>
    <description>A tracking snippet pasted into a template disappears with the next theme update, competes with the page for the browser, and double-counts when someone pastes it twice. All three have the same fix.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>wordpress</category><category>php</category><category>javascript</category><category>analytics</category><category>performance</category><category>privacy</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/backend/delivery-as-a-consequence-of-payment</guid>
    <title>Make delivery a consequence of payment, not a task someone performs</title>
    <link>https://roxl.net/blog/backend/delivery-as-a-consequence-of-payment</link>
    <description>Digital goods delivered by hand are limited by working hours and protected only by attention. Moving delivery onto order events changes what the system guarantees, and the API is what stops a second channel becoming a second implementation.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>woocommerce</category><category>wordpress</category><category>php</category><category>automation</category><category>rest-api</category><category>e-commerce</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/backend/derived-queue-resumable-email-campaigns</guid>
    <title>Derive the queue, do not store it: resumable email campaigns</title>
    <link>https://roxl.net/blog/backend/derived-queue-resumable-email-campaigns</link>
    <description>A bulk email run that crashes halfway is either restarted from the beginning, mailing everyone twice, or tracked with a cursor that goes stale. There is a third option: compute who still needs the message instead of recording it.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>wordpress</category><category>mysql</category><category>sql</category><category>cron</category><category>email</category><category>queues</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/backend/pricing-a-catalogue-against-an-upstream-store</guid>
    <title>Pricing a catalogue against a store you do not control</title>
    <link>https://roxl.net/blog/backend/pricing-a-catalogue-against-an-upstream-store</link>
    <description>Reselling means your prices depend on someone else changing theirs. Fetching on page load takes your shop down with theirs; a nightly export goes stale. The middle path is a cache with a pricing strategy behind it.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>woocommerce</category><category>wordpress</category><category>php</category><category>caching</category><category>pricing</category><category>api</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/backend/support-widget-that-knows-who-it-is-talking-to</guid>
    <title>A support widget that already knows who it is talking to</title>
    <link>https://roxl.net/blog/backend/support-widget-that-knows-who-it-is-talking-to</link>
    <description>Pasting a chat widget into a theme template works until the theme updates, the settings need changing, or the widget adds a database query to every page. Three small decisions fix all of it.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>wordpress</category><category>woocommerce</category><category>php</category><category>caching</category><category>support</category><category>freescout</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/backend/taking-payment-through-someone-elses-gateway</guid>
    <title>Taking payment through a gateway that belongs to another site</title>
    <link>https://roxl.net/blog/backend/taking-payment-through-someone-elses-gateway</link>
    <description>When the payment gateway is contracted to a different site, the buyer leaves and you have to learn the outcome somehow. The two ways this integration usually fails are an unauthenticated callback and two order records that drift apart.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>woocommerce</category><category>wordpress</category><category>php</category><category>payments</category><category>hmac</category><category>webhooks</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/cybersecurity/social-login-duplicate-accounts-race-condition</guid>
    <title>Why social login creates duplicate accounts, and how a lock table fixes it</title>
    <link>https://roxl.net/blog/cybersecurity/social-login-duplicate-accounts-race-condition</link>
    <description>An OAuth callback can fire twice for one sign-in, and a naive handler creates two accounts for one person. Here is why it happens, why checking for an existing user does not fix it, and how claiming the auth code in a lock table does.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>wordpress</category><category>oauth</category><category>openid</category><category>authentication</category><category>woocommerce</category><category>race-condition</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/cybersecurity/two-factor-codes-for-shared-accounts-woocommerce</guid>
    <title>Serving rotating 2FA codes to a shop without leaking the secret</title>
    <link>https://roxl.net/blog/cybersecurity/two-factor-codes-for-shared-accounts-woocommerce</link>
    <description>When fulfilment depends on a code that changes every thirty seconds, reading it off a phone does not scale. How to expose current codes to a shop and its operators without spreading the TOTP secret across the system.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>woocommerce</category><category>wordpress</category><category>totp</category><category>two-factor</category><category>rest-api</category><category>security</category><category>cactusplay-marketplace</category>
  </item>

  <item>
    <guid>https://roxl.net/blog/cybersecurity/wordpress-plugin-dependency-conflicts-php-scoper</guid>
    <title>Two plugins, one library, one broken site: namespacing bundled dependencies</title>
    <link>https://roxl.net/blog/cybersecurity/wordpress-plugin-dependency-conflicts-php-scoper</link>
    <description>WordPress plugins ship their own vendor directories, and PHP loads whichever version was registered first. Why that breaks the other plugin, and why build-time namespacing is the only fix that survives contact with a real site.</description>
    <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    <author>therawlex@gmail.com (Artem Krivoshchekov)</author>
    <category>wordpress</category><category>php</category><category>composer</category><category>php-scoper</category><category>captcha</category><category>plugin-development</category><category>cactusplay-marketplace</category>
  </item>

    </channel>
  </rss>
