惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
Recorded Future
Recorded Future
T
Tenable Blog
S
Securelist
C
CERT Recently Published Vulnerability Notes
T
Threatpost
S
Schneier on Security
A
Arctic Wolf
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Register - Security
The Register - Security
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
K
Kaspersky official blog
T
True Tiger Recordings
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
T
The Exploit Database - CXSecurity.com
小众软件
小众软件
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Spread Privacy
Spread Privacy
Malwarebytes
Malwarebytes
P
Proofpoint News Feed
F
Fox-IT International blog
F
Fortinet All Blogs
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
量子位
Latest news
Latest news
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Project Zero
Project Zero
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
I
Intezer
博客园_首页
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security

DEV Community

Building a DAG Workflow Orchestration Engine from Scratch in Python PicoCTF Web Challenge Writeup: Failure Failure An AI Agent Wiped a Production Database in 9 Seconds. What Engineers Must Design Before Shipping. The Fire That Reached the Backups: The OVHcloud Strasbourg Data-Centre Fire, 2021 Why HEIC to JPG Is Still a Massive Problem for iPhone Users? How I Fixed a CSS Animation Bug in an Open Source React Library Why Your API Gateway Might Be Your Biggest Compliance Liability Liquidity Pool Analyzer — Zero-Dep Python CLI for Solana DEX Data What AI Leaders Are Really Worried About in 2026 5 ways AI agents quietly die inside n8n production LLM-as-judge variance broke our DPO training signal for 3 weeks I stopped trying to build a “productivity app.” How to Build a HIPAA-Compliant Healthcare App in React Native (2026) Veltrix Was Losing Events in Plain Sight—Heres the Flame Graph That Proved It Anthropic Self-Hosted Sandboxes + MCP Tunnels: Enterprise AI Agents That Keep Your Data Behind Your Walls Understanding Closures in JavaScript: A Complete Beginner Guide Most expense trackers expect perfect English. But real users type in Hindi, Hinglish, mixed language, and natural conversation. So I built https://vitmora.com to understand the way people actually type. I Got Tired of Messy Bookmark Managers, So I Built My Own HackTheBox: DarkZero Writeup The seam I Built an AI Expense Tracker That Understands the Way People Actually Type I built a Chrome extension after my kid turned my YouTube feed into Roblox Building a Production MCP Server in Laravel How Our Event-Driven Pipeline Blew Up Because We Trusted the Default Config Looping in Python I Built a Retro Gaming Console Using ESP32 and OLED Display 🎮 ORA-00255 오류 원인과 해결 방법 완벽 가이드 Why Hytale Treasure Hunt Servers Throttle at 100 Players (And How We Fixed It) Product Update: Post-Quantum Cryptography meets <1s Kubernetes Syncs ECS vs EKS vs Lambda: How to Pick the Right AWS Compute Service (2026) Shopify fired the webhook. My server never processed it. Here's how I catch that now. Understanding React: Components, JSX, Virtual DOM, and More Stage 0.2 — Operating System Fundamentals I Didn’t Need Another Markdown App. So I Built This Instead. ClickUp Alternatives for Solo Freelancers Who Want Less Complexity The Gods That Ate the Engineers "My AI Agent Kept Missing Buttons, So I Used Windows UI Automation" Manejo de errores en Go - Primeros pasos The Treasure Hunt Engine Blew Up My Inbox at 3 AM Curing Telegram Information Overload: How I Automate Deal Hunting with AI and MTProto Read-Modify-Write isolation in NoSQL, part 2: When the invariant spans multiple aggregates. The Code Runs. The System Runs Too. How I secured my FastAPI app - 6 vulnerabilities fixed in one session with gstack /cso The Day the Treasure Hunt Engine Stopped Beeping The bf16 grad accumulator that killed our SDXL LoRA training I Still Have Nightmares About the Time Our Hytale Server Crashed Under Load Stop Using Global State: Master Localized React Context ⚡ Build a Private AI Search on Your Device: Local RAG in the Browser Stop Freezing Your API: Async Email Delivery in Laravel An AI Agent Wrote and Sold Her Own Prompt Collection Solana Validator Stake Checker CLI — Track Decentralization from Your Terminal Mouse Unlock!—no password, just a secret click pattern Reloading Textures in Blender Is a Pain — I Made a Free Add-on for That AI Agents Don't Log In. That's Why Your Entire Security Stack Is Flying Blind Claude Cowork has changed managing a Figma design system library forever Bayesian Knowledge Tracing in 37 lines of Python — how NumPath models what a student knows Two Cross-Platform Bugs in Our Go CLI (And How We Fixed Them) Two Knowledge Hierarchies: Structuring Context for AI Agents and LLMs The Day Treasure Hunt Broke My Caches—And How We Fixed It From Figma to production React, with AI in the loop Built a Sentiment Analysis Web App – My First Full-Stack ML Project I built a zsh cleanup script for macOS dev machines — and learned more than I expected AI 3D tools need product evals, not benchmark faith AI Prompt Injection Defense: Building Effective Strategies in 5 Steps Treasure Hunt Engine Blew Up When We Asked It To Grow I Tried Self-Hosting Open Source AI Models. Here's Why I Went Back to APIs. Enterprise vs Startup AI APIs — The Architectural Decision Nobody Talks About I Cut My AI API Bill from $420 to $28/Month — Here's Exactly How ENS Resolver CLI — Look Up Any ENS Name from Your Terminal 🚀 My Journey Begins on DEV Community — Building Startups, Communities & AI-Powered Solutions Using AI Chat Is Not the Same as Using an AI Agent The Cache That Bled — How We Turned Veltrix Event Config From Silent Killer to Silent Savior Designing a Modular Wiring Harness for Multi-Function Vehicle Trackers Reviving a 12K+ Star Abandoned Library: toastr-next v3 🍞 The Day the Language Became the Bottleneck winston vs pino in 2026: A Production-Tested Comparison HTB: MonitorsFour - Full Walkthrough Fixing your writing tone with a Chrome extension Experimented to fork AWS infra graph and simulate what breaks before you deploy Industrial SEO at 100 Pages/Week: My n8n + Claude Code + RAG Stack I Built a Kubernetes Alternative. It Changed My Perspective on Complexity. Chronos vs Toto: Zero-Shot Forecasting Benchmark Results Edge-Cached Localhost Tunnels: How to Give Stakeholders a Production-Fast Preview Directly from Your IDE Radiation-Proof Flash Storage Could Be the Missing Layer for AI Data Centers in Space AI Learning Roadmap: Where to Start if You're a Complete Beginner I built 6 free dev tools to skip the signup walls — here's what I learned How to Set Realistic Goals for an Open Source Project? How I Built an Indonesian NLP Parser That Understands Warung Owners, Then Abandoned It Keyboard shortcuts that fixed my editing flow I Built an AI-Native Productivity System Instead of Another AI Wrapper LogicNodes MCP bridge: Connecting Claude to real-world utility I Built a Stateful Research Agent Inside a Sandbox. Here's What the Numbers Actually Looked Like. From Credentials to Domain Admin: Support Machine Writeup logfx v1.0.0: One Logger for Development and Production The Day the Garbage Collector Slowed Down a Real-Time Treasure Hunt ARTIST: RL-Powered Tool Use for LLM Agents Explained Breaking the RL Flywheel: From Manual Grind to Instant Debugging When Your Treasure Hunt Engine Becomes a Scavenger Hunt for DevOps Nightmares BoxAgnts Introduction (3) — WebAssembly Sandbox Engineering a 100% Client-Side, $0 Server-Cost Document
I Tracked Revenue Per User for 6 Months — Here's Why ARPU Beats ARPPU for Channel Decisions 2026
toshihiro sh · 2026-05-27 · via DEV Community

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.

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.

TL;DR

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

1. What ARPU actually is

ARPU (Average Revenue Per User) divides revenue by total users in a period:

ARPU = Revenue ÷ Total Users

¥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.

ARPU Breakdown Example: ARPU = CVR x ARPPU — isolate the bottleneck

ARPU = CVR × ARPPU

Enter fullscreen mode Exit fullscreen mode

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

2. ARPU vs ARPPU — the denominator is different

ARPPU (Average Revenue Per Paying User) narrows the denominator to paying users only:

ARPPU = Revenue ÷ Paying Users

ARPU vs. ARPPU: The denominator is different — all users vs. paying users only

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.

When to use which:

  • Channel investment → ARPU: it captures conversion differences between channels
  • Unit economics → ARPPU: it isolates spend per buyer, better for measuring cross-sell effects
  • Growth tracking → both: if ARPU rises, was it CVR or ARPPU or both?

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.

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.

3. ARPU benchmarks depend on business type

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.

ARPU Tendency by Business Type: Price x Repeat Frequency quadrant

Four patterns:

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

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.

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.

4. Getting ARPU by channel with SQL

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:

WITH channel_stats AS (
  SELECT
    utm_source AS channel,
    COUNT(DISTINCT user_id) AS total_users,
    COUNT(DISTINCT CASE WHEN has_purchase THEN user_id END) AS paying_users,
    SUM(revenue) AS total_revenue
  FROM sessions
  WHERE session_date >= '2026-05-01' AND session_date < '2026-06-01'
  GROUP BY utm_source
)
SELECT
  channel,
  total_revenue / NULLIF(total_users, 0) AS arpu,
  total_revenue / NULLIF(paying_users, 0) AS arppu,
  paying_users::FLOAT / NULLIF(total_users, 0) AS cvr
FROM channel_stats
ORDER BY arpu DESC;

Enter fullscreen mode Exit fullscreen mode

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.

5. 3 steps to measure your own ARPU

Step 1: Pull last month's revenue

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.

Step 2: Divide by user count

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.

Step 3: Decompose with ARPU = CVR × ARPPU

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.

6. Why this is hard to see in GA4

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.

That's the problem I'm working on with RevenueScope — 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.

When you look at per-user revenue, do you use all users as the base — or just buyers?

(Sorry if my English sounds a bit off — Japanese native. I used Google translate.)