<?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: toshihiro shishido</title>
    <description>The latest articles on DEV Community by toshihiro shishido (@toshihiro_shishido).</description>
    <link>https://dev.to/toshihiro_shishido</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3893127%2Fbaadba28-a505-4439-861a-eaa87da02418.JPG</url>
      <title>DEV Community: toshihiro shishido</title>
      <link>https://dev.to/toshihiro_shishido</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toshihiro_shishido"/>
    <language>en</language>
    <item>
      <title>Running Ads But Can't Tell Which Ones Actually Sell? Fix This First 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Sat, 06 Jun 2026 01:47:15 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/running-ads-but-cant-tell-which-ones-actually-sell-fix-this-first-2026-4g4</link>
      <guid>https://dev.to/toshihiro_shishido/running-ads-but-cant-tell-which-ones-actually-sell-fix-this-first-2026-4g4</guid>
      <description>&lt;p&gt;You spend on ads every month. You're getting clicks. But asked "which ads actually drove sales?", you can't answer clearly. That happens at a lot of online stores — and it's rarely a skill problem. It's usually a missing measurement foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ad effectiveness is whether ads drove *sales&lt;/strong&gt;* — not clicks or impressions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can't tell which ads worked because the foundation is missing&lt;/strong&gt; — no conversion tracking, no UTM tags, no link between ads and revenue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform dashboards stop at "what happened"&lt;/strong&gt; — your real revenue and whether buyers were new aren't there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The fix is small&lt;/strong&gt; — UTM tags, revenue per channel, split new vs returning&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Two views of the same ad
&lt;/h2&gt;

&lt;p&gt;The same ad tells you different things depending on where you read the numbers. There's the platform dashboard, and there's your own revenue.&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%2Fl56048yezwp97qo4wr1u.jpg" 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%2Fl56048yezwp97qo4wr1u.jpg" alt="A comparison table: the platform dashboard shows what happened, your own revenue shows what actually sold and to whom" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard records clicks, impressions, and self-reported conversions — what happened. Your own revenue shows how much actually sold, and whether the buyer was new or a returning regular. Real measurement is reconciling the two: which ad truly created sales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the numbers swing
&lt;/h2&gt;

&lt;p&gt;Without conversion tracking and UTM tags, you simply can't connect ads to sales. The symptom: clicks come in, but cost per lead swings 3–4x month to month.&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%2Foxo8mk3j6m9aeriongoy.jpg" 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%2Foxo8mk3j6m9aeriongoy.jpg" alt="Without a measurement foundation, clicks come in yet cost per lead swings wildly month to month" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When numbers swing like this, the reflex is "adjust the bids." But the real cause isn't bidding — it's the missing foundation. Running for months with no conversion tracking, spending budget without knowing which ad produced leads, is more common than you'd think. You feel like you're optimizing while running blindfolded. And the platform alone won't save you: Google Ads can say "this keyword converted," but not whether that lead was any good in the CRM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three steps that fix it
&lt;/h2&gt;

&lt;p&gt;You don't need a perfect model. You need to realign your own revenue by "which ad it came from."&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%2Fsevb3ulyr9stbtizu4dl.jpg" 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%2Fsevb3ulyr9stbtizu4dl.jpg" alt="Three steps to tell which ads worked using your own revenue: UTM tags, total revenue by channel, split new vs returning" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add UTM tags&lt;/strong&gt; so each visit carries which ad it came from&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total real revenue by channel and ad&lt;/strong&gt; — your confirmed numbers, not each platform's self-report&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split new vs returning&lt;/strong&gt; — platforms optimize toward the cheapest converters, which skews to existing regulars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one matters most. A channel with great-looking numbers may just be counting regulars' repeat visits, while a channel that looks unremarkable is quietly bringing in the most new customers. Splitting new from returning is what tells them apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;"Which ads work" isn't a mystery you solve with a fancier dashboard. It's a foundation you build: UTM tags, revenue per channel, new vs returning. Align those three and the ad that looked unremarkable but was actually winning new customers tends to show up.&lt;/p&gt;

&lt;p&gt;How do you currently tell whether an ad drove &lt;em&gt;new&lt;/em&gt; sales versus just reactivating people who'd have come back anyway? Curious what's working for others running lean.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>businessintelligence</category>
    </item>
    <item>
      <title>Cutting a Channel on Last-Click Once Doubled Their CPA — Read Attribution Right 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Fri, 05 Jun 2026 00:41:32 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/cutting-a-channel-on-last-click-once-doubled-their-cpa-read-attribution-right-2026-1bac</link>
      <guid>https://dev.to/toshihiro_shishido/cutting-a-channel-on-last-click-once-doubled-their-cpa-read-attribution-right-2026-1bac</guid>
      <description>&lt;p&gt;"This channel isn't driving conversions." You trust the dashboard, cut its budget — and total revenue quietly falls. The usual culprit is last-click: it assigns the whole sale to the final touch and counts everything upstream as zero. Easy to report, easy to explain to finance — and easy to mislead your budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Last-click credits only the final touch&lt;/strong&gt; — everything that created demand earlier counts as zero&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cutting upstream drops downstream too&lt;/strong&gt; — kill awareness and the later "search and buy" shrinks with it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Criticism without a move is noise&lt;/strong&gt; — keep a simple, revenue-first alternative&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask buyers directly&lt;/strong&gt; — a one-question survey catches touches clicks never see&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How last-click hides the journey
&lt;/h2&gt;

&lt;p&gt;Customers don't search and buy from nowhere. They see something, get curious, then search and convert. Last-click gives 100% of that sale to the last click and zero to the social ad or podcast that started it.&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%2Fzwv2f0yw1g84v076fa7n.jpg" 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%2Fzwv2f0yw1g84v076fa7n.jpg" alt="Last-click gives all revenue to the final touch and counts upstream as zero" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the touches that build demand look like dead weight on the report — even when they're doing the real work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cut that backfired
&lt;/h2&gt;

&lt;p&gt;A real one: a brand spent $40K/month on podcast ads showing just 1.8% of revenue in last-click, so they paused them. Two months later CPA went from $85 to $160 — almost double. The awareness those ads created had vanished, and fewer people searched and bought.&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%2Fsffkjx3z010rkvgaoa5f.jpg" 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%2Fsffkjx3z010rkvgaoa5f.jpg" alt="Cut the touch that creates demand, and later search purchases drop with it" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The touch that looked like zero was the front door for the whole funnel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Act, don't just criticize
&lt;/h2&gt;

&lt;p&gt;"Last-click is bad" solves nothing — the common gripe is that critics never say what to use instead, and fancy causal models are expensive and hard to run. So keep it simple:&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%2Frvf1gjtlmcv260xyuno1.jpg" 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%2Frvf1gjtlmcv260xyuno1.jpg" alt="Combining revenue-first and buyer voice with last-click makes mistakes less likely" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rank channels by your own real revenue&lt;/strong&gt;, not platform self-reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split new vs returning&lt;/strong&gt; so you don't cut a real acquisition channel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask "how did you hear about us?"&lt;/strong&gt; at checkout — self-reported attribution catches AI-search and review-site touches that never register as clicks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need perfect measurement. Add one more angle to the last-click number and the risk of cutting the wrong channel drops fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Last-click writes off the demand-creators upstream. Move budget on it alone and you can dry up the source of your visible conversions. Rank channels by real revenue, split new from returning, and ask buyers directly — then review your main channels from an angle other than last-click.&lt;/p&gt;

&lt;p&gt;When a channel shows weak last-click numbers, how do you decide whether it's truly dead weight or an upstream demand-creator? Curious how others avoid cutting the wrong one.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>businessintelligence</category>
    </item>
    <item>
      <title>Your Best-ROAS Channel Might Be Your Worst: Split New vs Returning 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Fri, 05 Jun 2026 00:40:52 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/your-best-roas-channel-might-be-your-worst-split-new-vs-returning-2026-dpl</link>
      <guid>https://dev.to/toshihiro_shishido/your-best-roas-channel-might-be-your-worst-split-new-vs-returning-2026-dpl</guid>
      <description>&lt;p&gt;I'll admit a bad habit of mine: when I shifted budget between channels, I stopped at the dashboard's ROAS and CPA and almost never reconciled it to actual revenue on my own side. The problem is that pouring more into the "best ROAS" channel can quietly backfire — because a high ROAS often means the channel is re-engaging people who would have bought anyway, not winning anyone new.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;High-ROAS channels skew to returning buyers&lt;/strong&gt; — platforms optimize toward the cheapest converters, who are usually existing customers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split new vs returning with two numbers&lt;/strong&gt; — total orders and first-time orders; the gap is re-engagement volume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contribution margin flips the ranking&lt;/strong&gt; — same ROAS, different product margin, very different profit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judge new-customer channels on a separate yardstick&lt;/strong&gt; — harvesting demand ≠ creating it&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why a high ROAS can be a trap
&lt;/h2&gt;

&lt;p&gt;ROAS is a channel's attributed revenue ÷ its spend. It looks clean, but it can't tell you whether that revenue is new or returning. Delivery algorithms chase whoever converts cheapest, and the cheapest converter is usually someone who already knows you and would have come back anyway. So retargeting and brand-search tend to post high ROAS — they harvest demand that already exists.&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%2F6l3rko6rlf5vffzintkl.jpg" 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%2F6l3rko6rlf5vffzintkl.jpg" alt="Higher-ROAS channels tend to carry a larger share of returning customers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cut the "low ROAS" channel and you may be closing the front door for the new customers who'd become tomorrow's repeat buyers. One brand killed its podcast ads for low ROAS — and watched search-driven revenue fall the next quarter, because those ads were creating the demand people later searched for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two numbers that do the splitting
&lt;/h2&gt;

&lt;p&gt;You don't need a fancy tool. Per channel, pull &lt;strong&gt;total orders&lt;/strong&gt; and &lt;strong&gt;first-time orders&lt;/strong&gt;. The difference is the volume of returning-customer re-engagement.&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%2Fj4i977x9t36tz8zj2wjg.jpg" 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%2Fj4i977x9t36tz8zj2wjg.jpg" alt="Placing total orders next to first-time orders shows which channel brings new buyers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A channel with 320 total but only 40 first-time orders isn't acquiring — it's reactivating. A plainer channel with a small gap is doing the real new-customer work. Notice how this can flip the ROAS verdict entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read profit, not revenue
&lt;/h2&gt;

&lt;p&gt;ROAS measures revenue, not what you keep. Contribution profit = revenue − (COGS + shipping + fees + ad spend). Two channels, ¥500K spend each:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Meta&lt;/strong&gt;: ROAS 3x, 40% margin → ¥1.5M revenue → ¥100K profit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google&lt;/strong&gt;: ROAS 2x, 70% margin → ¥1.0M revenue → ¥200K profit&lt;/li&gt;
&lt;/ul&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%2Fkwiwv5fmdfyt9w4wqwog.jpg" 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%2Fkwiwv5fmdfyt9w4wqwog.jpg" alt="Lower-ROAS but higher-margin Google leaves more contribution profit than higher-ROAS Meta" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meta wins on ROAS and loses on profit. Revenue is vanity, margin is sanity — translate ROAS into profit before you rank channels, and the order changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;A high ROAS can be re-engagement in disguise. Split each channel's total vs first-time orders to see who actually brings new buyers, and convert ROAS into contribution profit before deciding where to scale. Take three numbers — total orders, first-time orders, rough contribution profit — for your main channels, and the channel truly worth protecting stops hiding.&lt;/p&gt;

&lt;p&gt;When you move budget, do you reconcile platform ROAS back to your own revenue and split new vs returning — or mostly trust the dashboards? Curious how others handle it.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>businessintelligence</category>
    </item>
    <item>
      <title>Summing Platform ROAS Overstates Your Ad Results — Use MER Instead 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Thu, 04 Jun 2026 06:32:13 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/summing-platform-roas-overstates-your-ad-results-use-mer-instead-2026-4ilb</link>
      <guid>https://dev.to/toshihiro_shishido/summing-platform-roas-overstates-your-ad-results-use-mer-instead-2026-4ilb</guid>
      <description>&lt;p&gt;Google Ads reports ROAS 400%. Meta reports 350%. On each dashboard, both look great. But add the two numbers together to judge "overall ad efficiency" and you're looking at more revenue than actually exists — because each platform counts the same purchase as its own win. That gap quietly inflates how well you think your advertising is doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Platform ROAS gets inflated per channel&lt;/strong&gt; — each platform counts the same purchase, so summing ROAS exceeds your actual ad-driven revenue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MER = total revenue ÷ total ad spend&lt;/strong&gt; — one number for whole-business efficiency, immune to cross-platform double-counting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ROAS for per-channel tuning, MER for budget decisions&lt;/strong&gt; — and watch MER when you scale spend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MER alone still can't tell new from returning&lt;/strong&gt; — high apparent ROAS often skews to returning buyers who'd have come back anyway&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why summing platform ROAS overstates results
&lt;/h2&gt;

&lt;p&gt;ROAS is a platform's ad-driven revenue ÷ its ad spend. The catch: one customer often touches several ads before buying. See a Meta ad, search on Google, then buy — and both Meta and Google count "that purchase was mine." That's attribution double-counting.&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%2Frp1mvt197gejvrya7362.jpg" 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%2Frp1mvt197gejvrya7362.jpg" alt="Summing each platform's ROAS revenue overstates actual ad-driven sales" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a store spending ¥1M total (Google ¥500K, Meta ¥500K): Google claims ¥2.0M, Meta claims ¥1.75M — ¥3.75M of claims against ¥3.0M of actual ad-driven revenue. The ¥750K gap is the same purchases counted twice. Summing per-platform ROAS overstates your result by 25%.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MER is
&lt;/h2&gt;

&lt;p&gt;MER (Marketing Efficiency Ratio) is whole-business total revenue ÷ total ad spend. For that same store, ¥5M total revenue against ¥1M ad spend is MER 500%. Because MER never assigns revenue to a platform, there's no double-counting.&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%2F5lgw12sz65zt2j90nu4a.jpg" 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%2F5lgw12sz65zt2j90nu4a.jpg" alt="Platform ROAS values can't be summed, but MER shows the whole in one bar" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's a second benefit: non-ad revenue sits in the numerator too. Double your ad spend and if MER drops, that added spend is lowering overall efficiency — a move per-platform ROAS tends to hide, because each platform keeps reporting healthy attributed numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use which
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;ROAS&lt;/strong&gt; for per-channel campaign tuning and creative comparison — it's the daily, actionable number. Use &lt;strong&gt;MER&lt;/strong&gt; to set how much total budget goes where, and to check whether total revenue actually grew when you raised spend.&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%2F9couk5d8tjwq4wi67rkj.jpg" 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%2F9couk5d8tjwq4wi67rkj.jpg" alt="ROAS suits per-channel tuning, MER suits whole-efficiency decisions" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refine inside channels with ROAS; decide total spend with MER. Chase per-platform ROAS alone and you miss the state where overall efficiency is falling while every platform still looks fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MER still hides: new vs returning
&lt;/h2&gt;

&lt;p&gt;MER blends everything into one number, so it erases whether revenue came from new or returning customers. Ad platforms push delivery toward whoever buys cheapest — usually returning customers who'd have come back anyway. So channels skewed to returning buyers show high apparent ROAS, while channels reaching genuinely new customers look weak on the spot.&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%2F1c8lytbuzhcszbh7040h.jpg" 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%2F1c8lytbuzhcszbh7040h.jpg" alt="Channels with high apparent ROAS are often skewed toward returning buyers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cut a new-customer channel because its ROAS is low, and you close off the entry point for future repeat buyers. A search channel that harvests existing demand and a social channel that creates new demand shouldn't be judged on the same revenue yardstick. Confirm overall efficiency with MER, but evaluate new-customer contribution separately — by channel, and by new vs returning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Per-platform ROAS double-counts, so summing it overstates your ad results. MER measures whole-business efficiency in one number and sidesteps that. Refine channels with ROAS, set total spend with MER — and split new from returning so you protect the right channels when budgets tighten.&lt;/p&gt;

&lt;p&gt;How does your team handle the platform-ROAS-vs-blended question — do you track MER, or still report channel ROAS separately? Curious how others draw the line.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>businessintelligence</category>
    </item>
    <item>
      <title>ROAS vs ROI — The Metric Confusion That Quietly Costs EC Operators Money 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Thu, 04 Jun 2026 04:53:00 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/roas-vs-roi-the-metric-confusion-that-quietly-costs-ec-operators-money-2026-53pn</link>
      <guid>https://dev.to/toshihiro_shishido/roas-vs-roi-the-metric-confusion-that-quietly-costs-ec-operators-money-2026-53pn</guid>
      <description>&lt;p&gt;Last month a founder I advise told me their "ad ROI was 300%." I had to stop and ask: do you mean ROAS, or actual profit-based ROI? At a 30% gross margin those two numbers tell opposite stories — one looks healthy, the other is a loss. The formulas look so similar that they get swapped silently in the same meeting, and budget decisions quietly go backwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ROAS = ad revenue ÷ ad spend × 100.&lt;/strong&gt; &lt;strong&gt;ROI = profit ÷ total investment × 100.&lt;/strong&gt; The numerator — revenue vs profit — is the whole difference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At 30% gross margin, ROAS 300% is a loss&lt;/strong&gt; — profit ROI lands around −11%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ROAS is for daily ad optimization, ROI is for total-investment decisions&lt;/strong&gt; including labor and production costs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When someone says "ROI 300%," ask for the definition&lt;/strong&gt; before acting on it&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The formula difference
&lt;/h2&gt;

&lt;p&gt;Both metrics measure "how much came back," but the numerator is different. ROAS uses &lt;strong&gt;revenue&lt;/strong&gt; (before costs). ROI uses &lt;strong&gt;profit&lt;/strong&gt; (after costs). ROAS also covers ad spend only, while ROI can cover the full investment — labor, production, tools.&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%2Fidejtqdudvv55evoyiz3.jpg" 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%2Fidejtqdudvv55evoyiz3.jpg" alt="ROAS vs ROI formula comparison — revenue or profit as the numerator" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ad platforms auto-report ROAS in real time, so it becomes the default for daily operations. ROI needs internal profit data, so it fits quarterly budget calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  ROAS 300% can still be a loss
&lt;/h2&gt;

&lt;p&gt;Here's the trap. At 30% gross margin, ¥100K of ad spend driving ¥300K of revenue (ROAS 300%) means ¥210K cost of goods plus ¥100K ad spend — ¥310K total against ¥300K revenue. That's a ¥10K loss. Profit ROI is roughly −11%.&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%2F4m3d2hftz51o5k8x9qy2.jpg" 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%2F4m3d2hftz51o5k8x9qy2.jpg" alt="At ROAS 300%, ROI can be positive or negative depending on gross margin" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Treat ROAS as ROI and you'll pour more budget into a campaign that's actually bleeding. The fix is a breakeven ROAS reference: 1 ÷ gross margin × 100. At 30% margin that's 333%, so ROAS 300% is below the line.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use which
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;ROAS&lt;/strong&gt; for campaign-level PDCA and channel comparison — it's auto-reported and easy to act on daily. Use &lt;strong&gt;ROI&lt;/strong&gt; when the decision involves costs ad platforms don't see: people, creative, new channels like events or influencers. A practical order: stabilize ad efficiency with ROAS first, then layer in ROI to judge total investment.&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%2Ffupyr5k6r7gtl3s8rxqm.jpg" 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%2Ffupyr5k6r7gtl3s8rxqm.jpg" alt="When to use ROAS vs ROI — choosing by decision context" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways they get mixed up
&lt;/h2&gt;

&lt;p&gt;In practice the confusion shows up in three recurring shapes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calling the ad-platform number "ROI."&lt;/strong&gt; When Google Ads reports "cost efficiency," that's ROAS — it ignores gross margin and labor. Relabeling it ROI means deciding budget on a number that doesn't account for either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ROAS and ROI side by side in one report.&lt;/strong&gt; "ROAS 350% / ROI 25%" have different denominators and numerators. The bigger number isn't the better one, and reading them as comparable misrepresents real profitability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setting only a ROAS target.&lt;/strong&gt; "Hold ROAS 300%" works until margin shifts — then the same ROAS means a different profit. Pair the target with a breakeven ROAS so the gap to actual ROI stays visible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One thing worth being honest about
&lt;/h2&gt;

&lt;p&gt;ROAS only ever sees paid advertising. Organic search, direct, and social organic efficiency are invisible to it. What I'm building with &lt;a href="https://www.revenuescope.jp/en/news/roas-roi-difference?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=daily-set-54" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; tracks revenue-per-session across &lt;em&gt;all&lt;/em&gt; channels in real time — the part ROAS structurally can't show — so you can see which channels actually contribute before you reallocate budget. It's the step after ROAS, not a replacement for it.&lt;/p&gt;

&lt;p&gt;Most operators don't need a perfect cross-channel ROI on day one. They need to stop confusing the ad-platform number with profit.&lt;/p&gt;




&lt;p&gt;What's the worst ROAS-vs-ROI mix-up you've seen survive a budget meeting?&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>businessintelligence</category>
    </item>
    <item>
      <title>Why Your EC Revenue Quietly Shrinks Even When New Customers Keep Coming 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Thu, 04 Jun 2026 03:13:32 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/why-your-ec-revenue-quietly-shrinks-even-when-new-customers-keep-coming-2026-2j73</link>
      <guid>https://dev.to/toshihiro_shishido/why-your-ec-revenue-quietly-shrinks-even-when-new-customers-keep-coming-2026-2j73</guid>
      <description>&lt;p&gt;Last quarter I kept hearing "traffic looks fine, new customers look fine" from an EC operator I was advising. Revenue still drifted down month after month. No one could explain it until we split the revenue line in two: new customers versus repeat customers. The repeat line was falling. Churn was eating the business quietly, and new acquisitions were papering over the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Churn rate&lt;/strong&gt; = the share of customers who stop buying in a given period — not just subscription cancellations, but EC repeat buyers who quietly disappear&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New customers offset the loss&lt;/strong&gt;, so total customer count stays flat while the quality degrades inside&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two types with different fixes&lt;/strong&gt; — voluntary churn (customers leave by choice) vs. payment-failure churn (card expired, nobody noticed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three reasons it's hard to see&lt;/strong&gt; — averages dilute the signal, there's a time lag, and failed payments are silent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First move&lt;/strong&gt; — track repeat-customer revenue separately over time; if the total is flat but the repeat line is falling, that's the signal&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why new customers hide the problem
&lt;/h2&gt;

&lt;p&gt;When new inflow equals outflow, customer count stays flat. The leaky-bucket intuition is real: you can keep pouring water and the level never moves. What changes is the &lt;em&gt;composition&lt;/em&gt;. Long-term repeat buyers — who buy more often and spend more per order — get replaced by brand-new buyers who've only ordered once.&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%2Fujw80y1geed38fqpmw8g.jpg" 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%2Fujw80y1geed38fqpmw8g.jpg" alt="Total revenue is flat, but repeat-customer revenue is silently declining" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acquiring a new customer costs more than retaining an existing one, so the swap is doubly expensive: you pay more for a customer who buys less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Voluntary churn vs. payment-failure churn
&lt;/h2&gt;

&lt;p&gt;These two look the same in your revenue report but need opposite responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voluntary churn&lt;/strong&gt; is intentional: the customer decided to leave. Fixing it means improving your product, pricing, or loyalty loop — real work on the underlying experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment-failure churn&lt;/strong&gt; is accidental: the customer's card expired or hit its limit. They didn't decide to leave. A simple notification — "update your card" — brings many of them back. No product changes needed.&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%2Fabnky9x6817rmus117f2.jpg" 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%2Fabnky9x6817rmus117f2.jpg" alt="Voluntary churn vs. payment-failure churn — intent and fix differ completely" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mixing the two wastes effort. Sending loyalty re-engagement offers to people whose card just expired changes nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three reasons churn stays invisible
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Averages smooth it out.&lt;/strong&gt; "Average purchase count" blends your loyal high-frequency buyers with churned customers who bought once. The loyal buyers carry the average. By the time the average dips, the damage is already months old.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time lag.&lt;/strong&gt; Customers don't announce they're leaving. They drift away. The revenue impact shows up three to six months after the behavior change — by which point the gap is large.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment failures are silent.&lt;/strong&gt; A failed charge doesn't appear in your revenue report as "lost revenue." It just doesn't appear at all. Unless you actively check the payment-failure list, you won't know it's accumulating.&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%2F834l6u184kmavhducot3.jpg" 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%2F834l6u184kmavhducot3.jpg" alt="Actions ranked by impact and ease for catching quiet churn" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three moves in order of priority
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Split repeat-customer revenue over time.&lt;/strong&gt; Don't wait for the total to fall. Watch the repeat-only line month by month. If it bends down while total is flat, you have a churn problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull the at-risk segment.&lt;/strong&gt; RFM analysis surfaces customers who used to buy regularly but haven't recently. Flag them early, before the recency gap widens into permanent departure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check payment failures weekly.&lt;/strong&gt; Pull the list, send the update-card email. This is the fastest ROI move in churn management.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  One thing to be honest about
&lt;/h2&gt;

&lt;p&gt;I should be clear: churn &lt;em&gt;rate&lt;/em&gt; as a precise number — down to the decimal — requires a CRM-level model per customer. What I'm building with &lt;a href="https://www.revenuescope.jp/en/news/churn-rate-toha?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=daily-set-53" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; isn't that. It shows revenue split by new vs. repeat customers, by channel, over time — enough to catch the &lt;em&gt;signal&lt;/em&gt; early, before the precise diagnosis is needed.&lt;/p&gt;

&lt;p&gt;Most EC operators don't need the decimal first. They need to know whether repeat revenue is bending down or not. That's the thing to fix before optimizing anything else.&lt;/p&gt;




&lt;p&gt;What's the earliest signal you've found for catching churn before it shows in the revenue line?&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>marketing</category>
      <category>retention</category>
    </item>
    <item>
      <title>Why Bot Traffic Quietly Wrecks Your Channel Evaluation (and Your Budget)</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Wed, 03 Jun 2026 13:54:16 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/why-bot-traffic-quietly-wrecks-your-channel-evaluation-and-your-budget-4l7h</link>
      <guid>https://dev.to/toshihiro_shishido/why-bot-traffic-quietly-wrecks-your-channel-evaluation-and-your-budget-4l7h</guid>
      <description>&lt;p&gt;A few days after launching my own site, I opened the analytics and saw one channel jump out: traffic from a video platform had become the single biggest source on a per-day basis. My first reaction was the obvious one — "great, that channel is working, let me lean into it."&lt;/p&gt;

&lt;p&gt;It wasn't working. None of those visits were human. They were bots reading the URL I'd pasted into a video description, and I was about to pour effort into a channel that produced exactly zero people. This post is about why bots slip into your channel reports, what kinds of bots actually show up, the expensive misjudgment they cause, and the one simple lens — visits times dwell time — that I now use to catch them.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bots are 53% of all web traffic — they've passed humans.&lt;/strong&gt; Thales's (formerly Imperva) report found 53% of all internet traffic was automated in 2025, surpassing human visits (47%) for the second year running — bad bots at 40%, good bots at 13% [1]. With generative AI, automated traffic keeps climbing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GA4 only auto-removes the &lt;em&gt;known&lt;/em&gt; bots.&lt;/strong&gt; It filters out bots and spiders on the IAB-managed blocklist (the known-bot list), but anything not on that blocklist — including bots that fake a browser user agent — passes straight through. You can't even see how much was excluded [2].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The real loss hits both ad budget and SEO.&lt;/strong&gt; A path full of 0-second bot sessions can look like your "fastest-growing channel." Believe it and you fund a dead ad path while underrating the boring channel that's actually making money — and on the SEO side, crawler-inflated pages pull effort toward keywords that produce nothing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What bot traffic is, and why it lands in your channel reports
&lt;/h2&gt;

&lt;p&gt;A bot is simply an automated program opening a page instead of a human. Search engines, social networks, link-preview tools, monitoring services — they all run them. Thales's (formerly Imperva) study put automated traffic at 53% of the entire internet in 2025, with humans at only 47% — the second year running that bots have outnumbered people [1].&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%2F3w1v1wvb072n4kfp7j6l.jpg" 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%2F3w1v1wvb072n4kfp7j6l.jpg" alt="In 2025, bots reached 53% of web traffic, surpassing humans (47%)" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason bots end up &lt;em&gt;inside your channel breakdown&lt;/em&gt; is that many of them get recorded as traffic with a referrer. Paste your site's URL into a social post or a video description, and a bot opens the page to build the preview card. To your analytics, that looks like "a visit from that social or video platform." So a brand-new channel appears to light up — even though no human ever arrived.&lt;/p&gt;

&lt;h2&gt;
  
  
  The kinds of bots that show up in your data
&lt;/h2&gt;

&lt;p&gt;Not all bots are equal. Some are easy to filter, others blend right into your referral traffic.&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%2Fxspt4ey0fin0876dtugc.jpg" 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%2Fxspt4ey0fin0876dtugc.jpg" alt="The main types of bots that mix into your traffic" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search engine crawlers (Googlebot and friends) walk your pages to build search results. They're well-identified — their name sits in the user agent string — so tools like GA4 auto-exclude most of them.&lt;/p&gt;

&lt;p&gt;The ones to watch are the bots that &lt;strong&gt;ride in on a referrer&lt;/strong&gt;. Link-preview bots from social apps and chat tools open the pasted URL to generate a summary card. That shows up as "traffic from that platform," and some of them disguise themselves as a real browser, so analytics tools can't reliably strip them out. SEO crawlers, uptime monitors, price scrapers, and AI-training crawlers can all leak into your traffic too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the real loss happens: bots throw off both ad budget and SEO
&lt;/h2&gt;

&lt;p&gt;This is where it actually costs you. I nearly fell into the trap on my own site. One video-platform path looked like my highest-volume channel within a few days of launch, and I genuinely felt like it was taking off.&lt;/p&gt;

&lt;p&gt;Then I dug in. &lt;strong&gt;All 9 of those sessions had a dwell time of 0 seconds.&lt;/strong&gt; A crawler was mechanically opening the URL from my video description — not one human had visited. And I'd been treating it as my best-performing channel. The misjudgment runs along two axes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ad investment&lt;/strong&gt; — you judge a bot-inflated path as a "working channel" and shift budget toward a source with no humans and no revenue, while the boring channel that genuinely produces sales looks unimpressive and gets underrated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO&lt;/strong&gt; — when crawlers from SEO tools and the like make one page look heavily trafficked, you keep pouring effort into pages and keywords that produce nothing, or write off a promising one as "ineffective."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both start going wrong the moment you trust the raw traffic count at face value. (For another pitfall where search numbers go missing, see &lt;a href="https://www.revenuescope.jp/en/news/search-console-clicks-mismatch?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=bot-traffic" rel="noopener noreferrer"&gt;why your Search Console clicks don't add up&lt;/a&gt;.)&lt;/p&gt;

&lt;h2&gt;
  
  
  How to spot and exclude bots: read visits against dwell time
&lt;/h2&gt;

&lt;p&gt;You can't get bots to zero, but you can catch them. The key is &lt;strong&gt;behavior&lt;/strong&gt;. A human who opens a page stays at least a few seconds and often views more than one page. Most bots open a single page and leave at 0 seconds.&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%2Fitc1vum5xwbtapdljf6k.jpg" 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%2Fitc1vum5xwbtapdljf6k.jpg" alt="A matrix sorting channels by visits and average dwell time" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sort your channels by &lt;strong&gt;visits times average dwell time&lt;/strong&gt; and their character separates cleanly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;High volume, near 0-second dwell&lt;/strong&gt; — suspect bot contamination first. Exclude it and check whether any human visits remain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High volume with real dwell&lt;/strong&gt; — your genuine workhorse channel. Safe to invest in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low volume but real dwell&lt;/strong&gt; — small but real traffic. A candidate to nurture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeated hits to the same page at the same time&lt;/strong&gt; — textbook machine access. Evenly-spaced, identical-page repeats are a bot signature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GA4 does auto-exclude known bots, but only the ones on the IAB-managed blocklist (the known-bot list). Bots not on the blocklist, or bots hiding their identity, pass right through — and &lt;strong&gt;you can't see how much was excluded&lt;/strong&gt; [2]. So "it's filtered automatically, I'm fine" simply doesn't hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Only after removing bots can you judge by revenue
&lt;/h2&gt;

&lt;p&gt;The danger of bot contamination is that you'll never notice it if you only watch traffic counts. The reason I caught my own bad call was that I lined up average dwell time across channels and one path stood out as eerily 0 seconds. Had I only looked at visit counts, I'd still believe it was my best channel.&lt;/p&gt;

&lt;p&gt;The same trap shows up in other metrics — traffic with no identifiable source getting dumped into Direct, or last-click attribution piling all the credit onto the final ad. Same root cause: deciding from the slice you can see.&lt;/p&gt;

&lt;p&gt;So I've stopped stopping at the traffic count and instead trace each channel through to the &lt;strong&gt;revenue&lt;/strong&gt; it produced. &lt;a href="https://www.revenuescope.jp/en/news/bot-traffic-channel-distortion?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=bot-traffic" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; filters known bots up front by user-agent and server signals (about a quarter of our own traffic), and catches the cloaked ones by behavior — a single-page visit with zero dwell gets dropped — so the channels you judge are made of actual humans, scored by revenue rather than raw hits. Anchoring on revenue is the shortest path around this measurement trap.&lt;/p&gt;

&lt;p&gt;So here's my question back to you: when one channel suddenly looks like your biggest source, do you lean into it right away — or do you check its average dwell time first and assume some of it might be bots?&lt;/p&gt;

&lt;p&gt;(Sorry if my English sounds a bit off — Japanese native, with some help from Google Translate.)&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Thales, &lt;a href="https://www.imperva.com/resources/resource-library/reports/2026-bad-bot-report/" rel="noopener noreferrer"&gt;"2026 Bad Bot Report"&lt;/a&gt;, 2025 [1]&lt;/li&gt;
&lt;li&gt;Google Analytics Help, &lt;a href="https://support.google.com/analytics/answer/9888366" rel="noopener noreferrer"&gt;"Bot traffic exclusion"&lt;/a&gt;, [2]&lt;/li&gt;
&lt;li&gt;Google Search Central, &lt;a href="https://developers.google.com/search/docs/crawling-indexing/googlebot" rel="noopener noreferrer"&gt;"Googlebot"&lt;/a&gt;, [3]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>analytics</category>
      <category>marketing</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>Why Your Search Console Click Counts Don't Add Up (and How Not to Misread SEO)</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:04:02 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/why-your-search-console-click-counts-dont-add-up-and-how-not-to-misread-seo-9n1</link>
      <guid>https://dev.to/toshihiro_shishido/why-your-search-console-click-counts-dont-add-up-and-how-not-to-misread-seo-9n1</guid>
      <description>&lt;p&gt;The first time I tried to confirm how much organic traffic a few pages were really pulling, the math refused to work. I added up every click in the per-query table in Search Console, and the sum came nowhere close to the overall total at the top of the chart. My first thought was the classic one: something is broken, or I've misconfigured a filter.&lt;/p&gt;

&lt;p&gt;Nothing was broken. It turns out this gap is by design, and once I understood &lt;em&gt;why&lt;/em&gt; the numbers don't match, I stopped making a much more expensive mistake — quietly writing off pages that looked dead but were actually growing. This post covers what's happening, the real cause (anonymized queries), the costly misread it leads to, and three rules I now use to read Search Console without getting fooled.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Per-query clicks never sum to the overall total — by design.&lt;/strong&gt; Low-volume queries get dropped from the table. Add up the rows and you'll always fall short of the chart total. Google documents this behavior openly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cause is anonymized queries.&lt;/strong&gt; Queries searched by only a few dozen people, or that contain personal info, are hidden for privacy. But their clicks &lt;em&gt;are&lt;/em&gt; still counted in the overall total — which is exactly why the rows don't add up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not knowing this leads to bad calls.&lt;/strong&gt; If you see "0 clicks" on a page and conclude "no SEO value," you may be killing a page that's quietly converting through anonymized searches. Read the data assuming it's incomplete.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's actually happening
&lt;/h2&gt;

&lt;p&gt;Search Console's performance report gives you two different totals. One is the &lt;strong&gt;overall total&lt;/strong&gt; shown on the chart up top. The other is the sum of the &lt;strong&gt;per-query rows&lt;/strong&gt; in the table below it. Line them up and the table's sum is always smaller.&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%2Fxpk5hyip7ljqz2r5ei5n.jpg" 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%2Fxpk5hyip7ljqz2r5ei5n.jpg" alt="Sum of query rows vs. overall chart total don't match" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On my own site's real data, the per-query rows summed to &lt;strong&gt;4 clicks&lt;/strong&gt;, while the overall total read &lt;strong&gt;61&lt;/strong&gt;. The missing 57 clicks didn't vanish into a bug. Google's own search blog describes the same thing — they give an example where the rows add up to 450 while the chart total is 550 [1].&lt;/p&gt;

&lt;p&gt;The gap doesn't come from two different counting methods. It comes from the simple fact that &lt;strong&gt;some clicks are never shown in the table at all.&lt;/strong&gt; Here's why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real cause: anonymized queries
&lt;/h2&gt;

&lt;p&gt;Google deliberately keeps queries that very few people search out of the table. These are &lt;strong&gt;anonymized queries&lt;/strong&gt;. The threshold is roughly "queries not searched by more than a few dozen people over a 2–3 month window," and anything containing personal or sensitive information is excluded too [1]. It's a privacy mechanism — it stops anyone from inferring who searched for what.&lt;/p&gt;

&lt;p&gt;The key detail: &lt;strong&gt;those hidden clicks are still part of the overall total.&lt;/strong&gt; They drop out of the per-query table, but they stay in the chart's grand total. That's the whole reason summing the rows never reaches it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you're looking at&lt;/th&gt;
&lt;th&gt;Treatment of anonymized queries&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall chart click total&lt;/td&gt;
&lt;td&gt;Included (so the number is larger)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-query rows&lt;/td&gt;
&lt;td&gt;Excluded (so they fall short)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When you filter by a query&lt;/td&gt;
&lt;td&gt;Excluded (filtering always shrinks the count)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Google's design philosophy is simple: &lt;strong&gt;protect the content of searches (who looked for what), but report the totals honestly.&lt;/strong&gt; So the grand total is the true number, and only the breakdown is partly hidden. The smaller your site's traffic, the harder each query is to clear that few-dozen-people bar — which means the share of anonymized data is &lt;em&gt;larger&lt;/em&gt; on low-traffic sites, exactly where founders look hardest for signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the real loss happens
&lt;/h2&gt;

&lt;p&gt;The mismatch itself is harmless — it's a spec, not a leak. The actual loss comes when you make decisions without knowing the data is incomplete. The trap usually runs like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You open the per-query table and a given page shows 0 clicks.&lt;/li&gt;
&lt;li&gt;You conclude "this page produces nothing from search."&lt;/li&gt;
&lt;li&gt;You stop improving it, drop the related keywords, and move on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But 0 clicks in the table can simply mean the clicks are hidden by anonymization. In reality the page may be getting steady clicks from a handful of low-volume searches — a page that was about to grow, stopped by your own hand.&lt;/p&gt;

&lt;p&gt;Startups and pages targeting niche, low-volume keywords are the most exposed to this. Their share of anonymized data is high, so they look like "zero results" in the table even when they're not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three rules for reading a report you know is incomplete
&lt;/h2&gt;

&lt;p&gt;You can't turn anonymized queries off — they're a permanent part of the spec. So instead I read the data with three rules that assume it's incomplete.&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%2F7nichs7p7noqnyocrb7e.jpg" 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%2F7nichs7p7noqnyocrb7e.jpg" alt="Where to invest in CTR improvement: impressions x current CTR" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Focus CTR improvements on high-impression pages.&lt;/strong&gt; Pages with lots of impressions were searched by more people, so anonymization barely touches them and the numbers are trustworthy. The upside is bigger too — these are where you start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat "low impressions, 0 clicks" as a spec, not an anomaly.&lt;/strong&gt; It may just be hidden from the table while quietly getting clicks. Don't cut it on the basis of a 0; give it time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read by page, not by query, as your primary view.&lt;/strong&gt; Page-level totals are less affected by anonymization and give you a cleaner picture of the whole. Use the per-query view as a supplement, not for summing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As the matrix above shows, the top priority is pages with &lt;strong&gt;high impressions and low CTR&lt;/strong&gt;. Pages with low impressions get handled carefully, on the assumption that their numbers are missing data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger pattern: every tool shows you a slice
&lt;/h2&gt;

&lt;p&gt;This isn't only a Search Console quirk. GA4 lumping traffic into "Direct / (none)" when it can't identify the source, or last-click attribution piling all the credit onto the final ad — same root cause. &lt;strong&gt;Tools turn the slice they can see into a number and hand it to you.&lt;/strong&gt; Treat that number as the whole and you'll misjudge.&lt;/p&gt;

&lt;p&gt;That's why I've stopped deciding on traffic counts alone and instead trace each session through to the &lt;strong&gt;revenue&lt;/strong&gt; it produced. Impressions and clicks are entry-point numbers. Once you can follow each channel all the way to "how much revenue did that session generate," the gaps in the data stop pushing your budget decisions around.&lt;/p&gt;

&lt;p&gt;This is exactly the problem I'm working on with &lt;a href="https://www.revenuescope.jp/news/search-console-clicks-mismatch?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=daily-set-50" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; — turning raw, partly-hidden tool data into a form you can actually decide on, anchored on revenue per session rather than raw traffic. The numbers a tool spits out get misread by humans and AI alike when you don't know how they're filtered.&lt;/p&gt;

&lt;p&gt;So here's my question back to you: when a page shows &lt;strong&gt;0 clicks&lt;/strong&gt; in your Search Console query table, do you write it off — or do you check its impressions first and assume the data might just be hidden?&lt;/p&gt;

&lt;p&gt;(Sorry if my English sounds a bit off — Japanese native, with some help from Google Translate.)&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google Search Central Blog, "A deep dive into Search Console performance data filtering and limits," &lt;a href="https://developers.google.com/search/blog/2022/10/performance-data-deep-dive" rel="noopener noreferrer"&gt;blog post&lt;/a&gt;, October 2022 [1]&lt;/li&gt;
&lt;li&gt;Search Console Help, "About Search Console data," &lt;a href="https://support.google.com/webmasters/answer/96568" rel="noopener noreferrer"&gt;help article&lt;/a&gt;, [2]&lt;/li&gt;
&lt;li&gt;Google Search Central, "Use Google Analytics and Search Console data for SEO," &lt;a href="https://developers.google.com/search/docs/monitor-debug/google-analytics-search-console" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, [3]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>seo</category>
      <category>analytics</category>
      <category>marketing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What Is CPC? Cost Per Click Formula, Benchmarks, and How to Lower It</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Tue, 02 Jun 2026 06:00:14 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/what-is-cpc-cost-per-click-formula-benchmarks-and-how-to-lower-it-3f4p</link>
      <guid>https://dev.to/toshihiro_shishido/what-is-cpc-cost-per-click-formula-benchmarks-and-how-to-lower-it-3f4p</guid>
      <description>&lt;p&gt;Every time I opened my Google Ads or Meta Ads report, the same question nagged at me: this CPC — is it high or not? I'd stare at the number, compare it to whatever benchmark I'd read somewhere, and still have no idea whether I was paying a fair price for my store.&lt;/p&gt;

&lt;p&gt;What finally got me unstuck was realizing that CPC is not a number you judge on its own. A cheap click is worthless if nobody buys. This post covers what CPC actually is, the formula, why the price you pay is decided by an auction (not by you), benchmarks by industry and channel, and four levers to lower it — all from the angle of someone running a store, not a textbook.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CPC = Ad spend ÷ Clicks&lt;/strong&gt; — the entry cost of advertising, measured per click. But it says nothing about whether the click converted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheaper isn't better.&lt;/strong&gt; Always read CPC alongside the post-click CVR and the revenue it generates. A flood of cheap clicks that don't convert is just a flood of losses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You don't set the CPC you pay — an auction does.&lt;/strong&gt; On search ads, your "max CPC" is a bid, but the "actual CPC" depends on Ad Rank (bid × quality score). Raising quality score lowers your real cost more reliably than raising your bid.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What CPC actually is
&lt;/h2&gt;

&lt;p&gt;CPC stands for &lt;strong&gt;Cost Per Click&lt;/strong&gt; — the cost incurred each time someone clicks your ad. It shows up as "cost per click" in both Google Ads and Meta Ads, and its job is to measure the &lt;em&gt;entry cost&lt;/em&gt; of advertising on a per-click basis. Line up CPC across campaigns and you can see which one pulls users in most cheaply.&lt;/p&gt;

&lt;p&gt;The catch: CPC is a &lt;strong&gt;cost up to the click, and nothing beyond it.&lt;/strong&gt; Whether that person bought, and how much revenue they brought in, is invisible from CPC alone. That's the first trap — collecting a pile of cheap clicks does not move revenue unless they convert.&lt;/p&gt;

&lt;p&gt;It's easy to confuse CPC with two neighbors, CPA and CTR. They sit on the same line but measure different points:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;th&gt;Formula&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CTR&lt;/td&gt;
&lt;td&gt;Share of impressions that got clicked&lt;/td&gt;
&lt;td&gt;Clicks ÷ Impressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPC&lt;/td&gt;
&lt;td&gt;Cost per click&lt;/td&gt;
&lt;td&gt;Ad spend ÷ Clicks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPA&lt;/td&gt;
&lt;td&gt;Cost per conversion&lt;/td&gt;
&lt;td&gt;Ad spend ÷ Conversions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Advertising flows &lt;strong&gt;impression → click → conversion.&lt;/strong&gt; CTR captures how easily the ad gets clicked, CPC how cheap that click is, CPA the efficiency all the way to a sale. The relationship worth memorizing is &lt;strong&gt;CPA = CPC ÷ CVR&lt;/strong&gt; — which means a low CPC still produces an ugly CPA when CVR is weak.&lt;/p&gt;

&lt;h2&gt;
  
  
  The formula and a quick example
&lt;/h2&gt;

&lt;p&gt;There's only one CPC formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPC = Ad spend ÷ Clicks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Say you spent $3,000 on ads in a month and got 5,000 clicks. CPC is $3,000 ÷ 5,000 = &lt;strong&gt;$0.60&lt;/strong&gt;. It cost 60 cents to bring one person to your site. That's it for the math — the hard part is interpreting it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Max CPC vs. actual CPC — the auction decides
&lt;/h3&gt;

&lt;p&gt;Here's the part that surprised me most when I dug in: the &lt;strong&gt;"max CPC" you set and the "actual CPC" you're charged are two different numbers.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Max CPC (your bid):&lt;/strong&gt; the most you're willing to pay per click. You set this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actual CPC:&lt;/strong&gt; what you actually get charged. It's usually &lt;em&gt;lower&lt;/em&gt; than your max CPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On search ads, ad slots are filled by &lt;strong&gt;auction&lt;/strong&gt;. In Google Ads, your position is calculated as &lt;strong&gt;Ad Rank = bid × quality score&lt;/strong&gt;. Quality score reflects how relevant your ad, keyword, and landing page are to each other — and the higher it is, the better you rank even at a lower bid, which drags your actual CPC down.&lt;/p&gt;

&lt;p&gt;So the real lever for lowering actual CPC isn't "bid more." It's "raise your quality score." That ties directly into the four ways below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks by industry and channel (and the pitfall)
&lt;/h2&gt;

&lt;p&gt;CPC swings hard by industry. In a large U.S. benchmark study, search advertising (Google Search) CPC by industry lands roughly here:&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%2Fvz3rez4d03icfujjgcp2.jpg" 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%2Fvz3rez4d03icfujjgcp2.jpg" alt="U.S. Search CPC by industry" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In U.S. search advertising the all-industry average CPC is &lt;strong&gt;about $5.40&lt;/strong&gt;, with EC-adjacent industries sitting around $4 [2]. One big caveat: this is &lt;strong&gt;U.S. market data&lt;/strong&gt; in USD — currency and competitive dynamics make it differ from other markets, so treat these as directional, not as your target. &lt;strong&gt;Judging CPC purely on an industry benchmark is dangerous.&lt;/strong&gt; You always have to check it against your own post-click CVR and revenue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search ads and social ads are a different game
&lt;/h3&gt;

&lt;p&gt;CPC also shifts by an order of magnitude across channels. Putting search ads (Google Search) and social ads (Facebook) side by side from the same U.S. source makes the gap obvious — social ad CPC runs at roughly &lt;strong&gt;one-fifth or less&lt;/strong&gt; of search ad CPC.&lt;/p&gt;

&lt;p&gt;The reason it's not as simple as "pick the cheaper channel": search ads catch high-intent users ("I want this now"), so CPC is high but CVR is high too. Social ads reach a broad latent audience, so CPC is cheap but CVR tends to be low. Choose a channel on CPC alone and you risk buying a flood of cheap clicks that convert at near zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four ways to lower CPC
&lt;/h2&gt;

&lt;p&gt;The levers for lowering actual CPC fall into four groups:&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%2Fnijtsltbvkqvrs3lrsht.jpg" 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%2Fnijtsltbvkqvrs3lrsht.jpg" alt="4 ways to lower CPC" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my experience &lt;strong&gt;improving quality score is the highest-leverage one.&lt;/strong&gt; Since actual CPC is set by "Ad Rank = bid × quality score," a higher quality score ranks you higher &lt;em&gt;without&lt;/em&gt; raising your bid, and your actual CPC drops as a side effect. Aligning the message across your ad copy, your keywords, and your landing page is the foundation of that.&lt;/p&gt;

&lt;p&gt;One warning, though: for every one of these levers, &lt;strong&gt;lowering CPC is not the goal in itself.&lt;/strong&gt; Halve your CPC and revenue won't budge a cent unless the people clicking actually convert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three steps to measure your own CPC
&lt;/h2&gt;

&lt;p&gt;To turn CPC from "a number I stare at in the ad dashboard" into "a number I make decisions with," I run three steps on my own data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Tag ad traffic with UTM parameters.&lt;/strong&gt; The CPC in an ad dashboard only covers clicks &lt;em&gt;inside that one platform&lt;/em&gt;. Run ads across several channels and you lose track of which ad's visitors generated which revenue. Tagging every ad with a consistent &lt;code&gt;utm_source&lt;/code&gt; / &lt;code&gt;utm_medium&lt;/code&gt; / &lt;code&gt;utm_campaign&lt;/code&gt; lets your site-side analytics consolidate all ad traffic in one place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Aggregate clicks and revenue by channel.&lt;/strong&gt; For each UTM-identified channel, line up clicks, ad spend, conversions, and revenue. The key is to use &lt;strong&gt;clicks and revenue measured on the site side&lt;/strong&gt;, not the CPC the ad dashboard reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Judge "the revenue-generating CPC" with CPC × CVR.&lt;/strong&gt; This is where it clicks. Picture three channels: Google Search at a high CPC but solid RPS, Meta retargeting at a mid CPC with decent RPS, and Meta prospecting at the &lt;em&gt;cheapest&lt;/em&gt; CPC — but an RPS lower than its own cost per click. The cheapest channel is the one you'd stop. Even at the lowest CPC, if RPS sits below it, every extra click deepens the loss. Only here does CPC turn from "the cheapness of a click" into "the basis for a budget decision."&lt;/p&gt;

&lt;p&gt;This is the exact problem I'm working on with &lt;a href="https://www.revenuescope.jp/news/cpc-toha?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=cpc-toha" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; — it aggregates the clicks and revenue of UTM-identified ad traffic on a per-channel RPS (revenue per session) basis, so instead of just seeing how cheap a click was, you see whether each click actually generated revenue.&lt;/p&gt;

&lt;p&gt;So here's my question back: when you look at your ad reports, do you judge CPC by its absolute number — or against the revenue each click actually brings in?&lt;/p&gt;

&lt;p&gt;(Sorry if my English sounds a bit off — Japanese native, with some help from Google Translate.)&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dentsu, "Advertising Expenditures in Japan 2024," &lt;a href="https://www.dentsu.co.jp/news/release/2025/0227-010853.html" rel="noopener noreferrer"&gt;press release&lt;/a&gt;, February 2025 [1]&lt;/li&gt;
&lt;li&gt;LocaliQ, "Search Advertising Benchmarks," &lt;a href="https://localiq.com/blog/search-advertising-benchmarks/" rel="noopener noreferrer"&gt;benchmark report&lt;/a&gt;, 2026 [2]&lt;/li&gt;
&lt;li&gt;LocaliQ, "Facebook Advertising Benchmarks," &lt;a href="https://localiq.com/blog/facebook-advertising-benchmarks/" rel="noopener noreferrer"&gt;benchmark report&lt;/a&gt;, 2025 [3]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>marketing</category>
      <category>advertising</category>
    </item>
    <item>
      <title>I Stopped Treating All My Customers the Same — Here's How RFM Analysis Sorts Them by 3 Numbers</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Mon, 01 Jun 2026 01:28:59 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/i-stopped-treating-all-my-customers-the-same-heres-how-rfm-analysis-sorts-them-by-3-numbers-18fo</link>
      <guid>https://dev.to/toshihiro_shishido/i-stopped-treating-all-my-customers-the-same-heres-how-rfm-analysis-sorts-them-by-3-numbers-18fo</guid>
      <description>&lt;p&gt;For a long time I sent the same email to every customer. New buyers, loyal regulars, people who hadn't come back in months — all got the same "here's our sale" blast. It felt fair. It was actually just lazy, and the results were mediocre: too thin for my best customers, off-key for the ones who'd already drifted away.&lt;/p&gt;

&lt;p&gt;What fixed it was RFM analysis — a way to rank customers by three numbers so I could decide who deserved which tactic. This post covers what the three metrics mean, how to score and segment, and how RFM differs from the cohort analysis it always gets mentioned alongside.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;RFM = ranking customers by &lt;strong&gt;R&lt;/strong&gt;ecency (last purchase date), &lt;strong&gt;F&lt;/strong&gt;requency (purchase count), and &lt;strong&gt;M&lt;/strong&gt;onetary (total spend)&lt;/li&gt;
&lt;li&gt;Score each metric (e.g. 1–5), then read customers by the combination — "R5・F5・M5" is a VIP, "R1・F5・M5" is a loyal customer slipping away&lt;/li&gt;
&lt;li&gt;The goal is &lt;strong&gt;not&lt;/strong&gt; sorting — it's deciding who gets which tactic: keep the loyal, win back the at-risk, nurture the new&lt;/li&gt;
&lt;li&gt;Focusing budget where it works beats sending everyone the same email&lt;/li&gt;
&lt;li&gt;RFM shows the &lt;strong&gt;current state&lt;/strong&gt; of customers; cohort analysis shows the &lt;strong&gt;trend by acquisition period&lt;/strong&gt; — different angles, and they combine well&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. What RFM analysis actually is
&lt;/h2&gt;

&lt;p&gt;RFM evaluates each customer on three metrics and sorts them into groups. The name is just the initials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R (Recency / last purchase date)&lt;/strong&gt;: how long since they last bought&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F (Frequency / purchase count)&lt;/strong&gt;: how many times they've bought&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M (Monetary / total spend)&lt;/strong&gt;: how much they've spent overall&lt;/li&gt;
&lt;/ul&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%2Fnkj3ic8mjkcvqj6ss5wj.jpg" 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%2Fnkj3ic8mjkcvqj6ss5wj.jpg" alt="The three metrics of RFM analysis: evaluate customers by recency, frequency, and monetary value" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why all three? Because any single metric misleads you. The mistake I kept making was prizing only "customers who spent a lot." That made me treat someone who dropped a big order six months ago and never returned as a loyal customer. Add "did they buy recently (R)" and "how often (F)," and the people who are &lt;em&gt;actually&lt;/em&gt; active right now become visible. Since acquiring new customers costs more than retaining existing ones, deciding who to keep ties straight to revenue.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Scoring the three metrics
&lt;/h2&gt;

&lt;p&gt;You turn each metric into a score. A 1-to-5 scale is common. Example rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt;: within 30 days = 5, over six months ago = 1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F&lt;/strong&gt;: 10+ purchases = 5, only once = 1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M&lt;/strong&gt;: ¥100k+ total = 5, under ¥5k = 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set the cutoffs from your own data — for purchase count, sort customers, give the top 20% a 5, the next 20% a 4, and so on. Then read the combination of the three scores:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example RFM score&lt;/th&gt;
&lt;th&gt;Customer state&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R5・F5・M5&lt;/td&gt;
&lt;td&gt;Recent, frequent, high-spend&lt;/td&gt;
&lt;td&gt;Top customer (VIP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R5・F2・M2&lt;/td&gt;
&lt;td&gt;Just started buying&lt;/td&gt;
&lt;td&gt;New / nurture candidate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R1・F5・M5&lt;/td&gt;
&lt;td&gt;Once loyal, gone quiet&lt;/td&gt;
&lt;td&gt;At-risk (needs win-back)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R1・F1・M1&lt;/td&gt;
&lt;td&gt;No purchase for a long time&lt;/td&gt;
&lt;td&gt;Dormant customer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That combination shows a customer's current state at a glance — the real strength of RFM. Unlike a single average like ARPU, RFM captures customers not as one lump but as state-based groups.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The four steps
&lt;/h2&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%2Fsja8vcvoqkn15x0oozua.jpg" 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%2Fsja8vcvoqkn15x0oozua.jpg" alt="The four steps of RFM analysis: collect, score, segment, decide tactics" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Collect data&lt;/strong&gt; — last purchase date, purchase count, total spend per customer, pulled from your cart system (Shopify, BASE, STORES) or order history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score&lt;/strong&gt; — turn R, F, M into scores; three levels (high/medium/low) are fine to start, you don't need a 5-point scale on day one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segment&lt;/strong&gt; — group by the combination; fine splits give 9–27 groups, but about five (loyal, stable, new, at-risk, dormant) is enough at first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide tactics&lt;/strong&gt; — this is the real work&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The caution that took me a while to learn: segmenting is not the goal. A clean split that doesn't lead to action won't move revenue at all. The value shows up only when you decide "what do I do for &lt;em&gt;these&lt;/em&gt; people" after sorting.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Tactics by segment
&lt;/h2&gt;

&lt;p&gt;The whole point is changing tactics by group:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Top customers (high R, high F, high M)&lt;/strong&gt;: retention first — early-access sales or thank-you perks so they feel valued&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At-risk (low R, high F, high M)&lt;/strong&gt;: once loyal, now quiet — win-back coupons or a "we've missed you" message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New / nurture (high R, low F)&lt;/strong&gt;: drive the second purchase — post-purchase follow-up or recommendations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dormant (low R, low F, low M)&lt;/strong&gt;: reactivation, but keep the budget modest — this group responds weakly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Win-back tactics for at-risk customers are the most cost-effective of the bunch, because retaining existing customers is cheaper than acquiring new ones and contributes more to revenue. To measure the effect, track how each treated group's revenue changes afterward — which is much easier when you have channel- and tactic-level revenue lined up to compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. RFM vs cohort analysis
&lt;/h2&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%2F4ahdoswbrsgl4dz66foh.jpg" 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%2F4ahdoswbrsgl4dz66foh.jpg" alt="RFM analysis vs. cohort analysis: snapshot of state vs. change over time" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The method most often confused with RFM is cohort analysis. Both sort customers, but from different angles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RFM&lt;/strong&gt;: classifies &lt;em&gt;current&lt;/em&gt; customers by recency, frequency, and monetary value. Answers &lt;strong&gt;"who gets what."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cohort&lt;/strong&gt;: groups customers by &lt;em&gt;when they were acquired&lt;/em&gt; (January cohort, February cohort) and tracks repeat rate over time. Answers &lt;strong&gt;"when does churn tend to happen."&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They aren't opposed — you combine them. In my case, cohort analysis showed churn tended to hit around 60 days after the first order. So I used RFM to pull out customers whose R was starting to slip, and acted &lt;em&gt;before&lt;/em&gt; day 60 arrived. That one move recovered a chunk of repeat revenue I'd been quietly losing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I check this without rebuilding a report every month
&lt;/h2&gt;

&lt;p&gt;Tying a tactic back to revenue means lining up revenue by channel and tactic — and that's exactly where session-centric tools make you do extra filter work each month. That's the problem I'm working on with &lt;a href="https://www.revenuescope.jp/en/news/rfm-analysis-ec?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=daily-set-46" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; — it lines up revenue (RPS and AOV) by channel from actual revenue data, so "did this win-back tactic actually move sales" becomes a number you can read directly instead of a report you rebuild.&lt;/p&gt;

&lt;p&gt;When you look at your customers, do you treat them as one average — or sort them by state and act per group?&lt;/p&gt;

&lt;p&gt;(Sorry if my English sounds a bit off — Japanese native. I used Google translate.)&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>marketing</category>
      <category>analytics</category>
      <category>startup</category>
    </item>
    <item>
      <title>I Tracked Revenue Per User for 6 Months — Here's Why ARPU Beats ARPPU for Channel Decisions 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Wed, 27 May 2026 06:31:38 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/i-tracked-revenue-per-user-for-6-months-heres-why-arpu-beats-arppu-for-channel-decisions-2026-29lp</link>
      <guid>https://dev.to/toshihiro_shishido/i-tracked-revenue-per-user-for-6-months-heres-why-arpu-beats-arppu-for-channel-decisions-2026-29lp</guid>
      <description>&lt;p&gt;For a while I looked at "average order value" and called it my per-user revenue. It felt close enough. It wasn't — because AOV is per order, not per person, and it hides the fact that most of my users weren't buying at all.&lt;/p&gt;

&lt;p&gt;The metric that fixed my thinking was ARPU. This post covers what ARPU actually is, how it differs from ARPPU, and why the denominator matters more than people think.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;ARPU = revenue ÷ &lt;strong&gt;all&lt;/strong&gt; users. Non-buyers count. That's the whole point&lt;/li&gt;
&lt;li&gt;ARPPU = revenue ÷ &lt;strong&gt;paying&lt;/strong&gt; users only. Always higher than ARPU because the denominator is smaller&lt;/li&gt;
&lt;li&gt;ARPU = CVR × ARPPU — so when ARPU is low, you can tell whether it's a conversion problem or a spend-per-buyer problem&lt;/li&gt;
&lt;li&gt;Use ARPU for channel investment decisions, ARPPU for unit economics&lt;/li&gt;
&lt;li&gt;ARPU benchmarks vary wildly by business type — compare within your quadrant, not across industries&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. What ARPU actually is
&lt;/h2&gt;

&lt;p&gt;ARPU (Average Revenue Per User) divides revenue by total users in a period:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ARPU = Revenue ÷ Total Users&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;¥3M monthly revenue, 1,000 users → ARPU is ¥3,000. Buyers, window shoppers, free members — everyone is in the denominator. That's what makes it useful: when ARPU drops, you decompose it.&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%2Fpuvdj1tvm6z0ku2xaq8b.jpg" 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%2Fpuvdj1tvm6z0ku2xaq8b.jpg" alt="ARPU Breakdown Example: ARPU = CVR x ARPPU — isolate the bottleneck" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARPU = CVR × ARPPU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This decomposition tells you whether the problem is "not enough people buying" or "each buyer spending too little." That distinction drives completely different fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. ARPU vs ARPPU — the denominator is different
&lt;/h2&gt;

&lt;p&gt;ARPPU (Average Revenue Per Paying User) narrows the denominator to paying users only:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ARPPU = Revenue ÷ Paying Users&lt;/code&gt;&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%2Fre5h0dmnh1skfafq9zp8.jpg" 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%2Fre5h0dmnh1skfafq9zp8.jpg" alt="ARPU vs. ARPPU: The denominator is different — all users vs. paying users only" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same ¥3M revenue, 200 paying users → ARPPU is ¥15,000. That's 5× the ARPU of ¥3,000, and the multiplier is exactly the inverse of CVR (20%). The ARPU = CVR × ARPPU relationship in action.&lt;/p&gt;

&lt;p&gt;When to use which:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Channel investment&lt;/strong&gt; → ARPU: it captures conversion differences between channels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unit economics&lt;/strong&gt; → ARPPU: it isolates spend per buyer, better for measuring cross-sell effects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth tracking&lt;/strong&gt; → both: if ARPU rises, was it CVR or ARPPU or both?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing that tripped me up: "average order value" (AOV) ≠ ARPPU. AOV is per order; ARPPU is per person. If someone orders twice in a month, they diverge. In my case, one product category had an AOV of ¥8,000 but ARPPU was ¥12,000 because repeat buyers were averaging 1.5 orders per month. I was underestimating the value of that segment until I looked at the per-person number.&lt;/p&gt;

&lt;p&gt;The practical rule: use ARPU when you're deciding which channels deserve more budget (it bakes in conversion rate). Use ARPPU when you're working on increasing spend per buyer (cross-sell, bundles, upsell). Use both when you want to understand why overall revenue per user changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. ARPU benchmarks depend on business type
&lt;/h2&gt;

&lt;p&gt;There's no universal "good ARPU." What determines the benchmark is product price, repeat frequency, and monetization model. I've seen ARPU range from ¥200 for a low-ticket accessories store to ¥15,000+ for a subscription cosmetics brand — comparing them directly would be meaningless.&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%2F8vr6qsdmh2kvlnlwi7vc.jpg" 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%2F8vr6qsdmh2kvlnlwi7vc.jpg" alt="ARPU Tendency by Business Type: Price x Repeat Frequency quadrant" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High price × high repeat&lt;/strong&gt; (supplements, cosmetics subscriptions): highest ARPU. Subscription LTV drives it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High price × low repeat&lt;/strong&gt; (electronics, furniture): big per-order but infrequent, so monthly ARPU is moderate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low price × high repeat&lt;/strong&gt; (food, daily necessities): small orders add up. Moderate to low ARPU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low price × low repeat&lt;/strong&gt; (sundries, accessories): lowest ARPU. CVR improvement is the priority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Borrowing someone else's industry average is a trap. Figure out which quadrant you're in and benchmark against similar types. The only legitimate comparison is between businesses in the same quadrant — a subscription supplement brand benchmarking against a one-off electronics store is comparing apples to furniture.&lt;/p&gt;

&lt;p&gt;To raise ARPU, there are only two levers: raise CVR (get more visitors to buy) or raise ARPPU (get each buyer to spend more). Knowing which quadrant you're in tells you which lever has more headroom.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Getting ARPU by channel with SQL
&lt;/h2&gt;

&lt;p&gt;If you want to compare ARPU across acquisition channels, you need revenue and user counts per channel. Here's a query that produces ARPU, ARPPU, and CVR in one pass:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;channel_stats&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;utm_source&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="k"&gt;CASE&lt;/span&gt; &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;has_purchase&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;paying_users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;revenue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_revenue&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sessions&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;session_date&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2026-05-01'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;session_date&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'2026-06-01'&lt;/span&gt;
  &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;utm_source&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;total_revenue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;NULLIF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;arpu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;total_revenue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;NULLIF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paying_users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;arppu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;paying_users&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;FLOAT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;NULLIF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;channel_stats&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;arpu&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ARPU = CVR × ARPPU relationship holds in the output. When a channel has low ARPU, you can immediately see whether it's a CVR problem (lots of visitors, few buyers) or an ARPPU problem (buyers aren't spending much). That distinction points you to completely different fixes — acquisition optimization vs. upsell/cross-sell.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. 3 steps to measure your own ARPU
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Pull last month's revenue&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with total revenue from your ecommerce platform or GA4's ecommerce report. If you can break it out by channel, do — the differences show up in the next step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Divide by user count&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Divide revenue by total users to get ARPU. Also divide by paying users to get ARPPU alongside it. The gap between the two numbers is your CVR effect. In GA4, "Active users" is the closest metric for the denominator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Decompose with ARPU = CVR × ARPPU&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Identify whether the bottleneck is low CVR or low ARPPU. If you run this per channel (using the SQL above or your analytics tool), you'll see which channels convert revenue effectively and which ones just bring traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Why this is hard to see in GA4
&lt;/h2&gt;

&lt;p&gt;GA4 is session-centric. Ecommerce purchase amounts are available, but to see "how many users came, how many bought, and how much per user" by channel, you need exploration reports with careful filter configuration. Switching between "all users" and "paying users only" adds more filter overhead. And if you want to track ARPU over time by channel, you're rebuilding that exploration report every month. The SQL approach above works if you have the data in a warehouse, but most small ecommerce teams don't have that pipeline set up.&lt;/p&gt;

&lt;p&gt;That's the problem I'm working on with &lt;a href="https://www.revenuescope.jp/en/news/arpu-arppu-difference?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=daily-set-45" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; — it lines up RPS (revenue per session) and AOV by channel from actual revenue data, so the "is it a CVR problem or a unit economics problem" decomposition becomes straightforward.&lt;/p&gt;

&lt;p&gt;When you look at per-user revenue, do you use all users as the base — or just buyers?&lt;/p&gt;

&lt;p&gt;(Sorry if my English sounds a bit off — Japanese native. I used Google translate.)&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>marketing</category>
      <category>analytics</category>
      <category>startup</category>
    </item>
    <item>
      <title>CAC Looks Simple Until You Realize It Means Nothing Without LTV 2026</title>
      <dc:creator>toshihiro shishido</dc:creator>
      <pubDate>Tue, 26 May 2026 03:20:04 +0000</pubDate>
      <link>https://dev.to/toshihiro_shishido/cac-looks-simple-until-you-realize-it-means-nothing-without-ltv-2026-25oc</link>
      <guid>https://dev.to/toshihiro_shishido/cac-looks-simple-until-you-realize-it-means-nothing-without-ltv-2026-25oc</guid>
      <description>&lt;p&gt;For a long time I judged my marketing on one number: how cheap it was to get a conversion. It felt rigorous. It wasn't — because cost per acquisition on its own can't tell you whether a customer was worth acquiring.&lt;/p&gt;

&lt;p&gt;This post is the small mental model that fixed that for me: what CAC actually is, how it differs from CPA, and why it only means something when you put LTV next to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;CAC = total acquisition cost ÷ new customers. Include labor and tools, not just ad spend&lt;/li&gt;
&lt;li&gt;CPA is per &lt;strong&gt;action&lt;/strong&gt;, CAC is per &lt;strong&gt;customer&lt;/strong&gt; — and CAC has a wider cost scope&lt;/li&gt;
&lt;li&gt;A CAC number alone is meaningless. Read it against LTV at a &lt;strong&gt;3:1&lt;/strong&gt; benchmark&lt;/li&gt;
&lt;li&gt;CAC tolerance is set by gross margin and repeat rate, not by your industry label&lt;/li&gt;
&lt;li&gt;GA4 is session-first, so lining up CAC and LTV by channel is a manual chore&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. What CAC actually is
&lt;/h2&gt;

&lt;p&gt;CAC (customer acquisition cost) is what it costs to win one new customer:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CAC = total acquisition cost ÷ new customers&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Spend 1,000,000 yen across ads, marketing labor, and tools in a month, gain 200 new customers, and CAC is 5,000 yen. The part people skip is the cost scope — enter only ad spend and you've basically computed CPA, not CAC. Real CAC includes the labor and tooling behind acquisition.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. CAC vs CPA
&lt;/h2&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%2Fed0fcuws7u5tfsnpeb1j.jpg" 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%2Fed0fcuws7u5tfsnpeb1j.jpg" alt="CAC vs CPA: what each measures, the formula, included costs, and the unit" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CPA = ad spend ÷ conversions, a per-action metric for ad efficiency. CAC = total cost ÷ new customers, a per-customer metric for business-wide efficiency. Same person converts twice on day one? CPA counts two, CAC counts one customer. Use CPA to tune ads, CAC to decide how much to invest overall.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The number is meaningless without LTV
&lt;/h2&gt;

&lt;p&gt;A CAC of 5,000 yen is neither good nor bad until you know what that customer is worth over time.&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%2Fyb9uxx6ly6l0u3h7f517.jpg" 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%2Fyb9uxx6ly6l0u3h7f517.jpg" alt="LTV-to-CAC ratio benchmark: break-even at 1x, healthy around 3x, underinvested above 5x" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The common benchmark is LTV ÷ CAC = 3. Below 1x you lose money per customer. Around 3x is healthy. Well above 5x, you might be underspending and leaving growth on the table. This is the part that broke my old "lowest cost per click wins" habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Tolerance depends on margin and repeat rate
&lt;/h2&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%2Ffx08gzn0ymfwrk108x5s.jpg" 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%2Ffx08gzn0ymfwrk108x5s.jpg" alt="CAC tolerance by business type: margin and repeat rate set the affordable ceiling" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;High-margin, high-repeat products (subscription supplements, cosmetics) give a big LTV, so a higher CAC still pays back over reorders. Thin-margin one-off products can't afford much. That's why borrowing someone else's "average CAC" is a trap — derive your tolerance from your own margin and repeat rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Why this is a chore in GA4
&lt;/h2&gt;

&lt;p&gt;To get CAC right you match each channel's spend, new customers, and their LTV. GA4 is built around sessions and doesn't hold ad spend or customer IDs, so CAC by channel means pulling data from elsewhere and dividing by hand. Distinguishing a cheap-but-one-off channel from an expensive-but-loyal one means wanting CAC and LTV on one screen.&lt;/p&gt;

&lt;p&gt;That's the problem I'm building &lt;a href="https://www.revenuescope.jp/en/news/cac-toha-calc-formula?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=daily-set-44" rel="noopener noreferrer"&gt;RevenueScope&lt;/a&gt; for — it lines up revenue, RPS, and AOV by channel from a revenue-first view, so you can tell which channel's customers keep buying and can therefore afford a higher CAC.&lt;/p&gt;

&lt;p&gt;When you judge a channel, do you go by what it costs to acquire — or by what those customers are worth over time?&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>marketing</category>
      <category>analytics</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
