🏠 Index | ⬅️ Prev (Ch.11) | ➡️ Next (Ch.13) | 🌐 中文版
Ch.12 From Product Usage to Acquisition Experiments
Problem: Shipping features does not show whether users complete key flows or where they drop off.
Practice: Define a few business metrics, build a digest, and test acquisition channels in small reversible experiments.
On my WeChat public account "Real-World Product Talk" and pmer.cn, I have written numerous articles about "independent development and side hustles." The most common trap developers fall into is: optimizing implementation details without checking whether real users need the feature.
No matter how elegant your code is or how perfect your architecture config is, as long as nobody uses it, it is just a pretty ornament. In the AI-native era, we must not only let Codex help us "manufacture products," but also let it help us "spin the commercial flywheel."
A Way to Think About It: Building a Day-and-Night Self-Spinning "Hydraulic Irrigation Waterwheel"
A commercial flywheel shouldn't depend on hauling water buckets by hand every day:
[Manual Bucket Hauling] ──> Writing code until midnight, then handing out flyers manually the next morning.
If you get sick for a single day, product updates stall and traffic drops to zero (fragile).
[Hydraulic Waterwheel] ──> ✅ You assemble this self-spinning waterwheel by the river:
1. The Flume (SEO & automated sitemaps: continuously absorbing long-tail search traffic);
2. The Milling Blades (Core SaaS features: solving real problems for real users);
3. The Grain Funnel (Stripe checkout & subscriptions: continuously generating cash flow);
4. The Water Level Gauge (Daily telemetry cards: monitoring conversion rates and active users).Once this pipeline is assembled, whether you are sleeping, eating, or traveling, the waterwheel spins day and night, generating compounding value.
Practice: Start with Three Steps
Take your first step toward commercialization in 3 simple steps:
- Step 1: Deploy an Automated Sitemap Generation Script
Runscripts/generate-sitemap.jsautomatically in your deployment pipeline to ensure every new markdown post or route gets indexed by Google. - Step 2: Hook Up an 8:00 AM Daily Revenue Telemetry Digest
Configure a scheduled script that pushes yesterday's new signups and active subscriptions to your phone every morning, sharpening your business sensitivity. - Step 3: Post Your "One-Sentence Value Proposition" in Public Communities
Share your MVP link on X (Twitter), Reddit, or developer forums to gather real payment signals from your first seed cohort.
12.1 Automated Traffic Pipeline for a "One-Person SaaS"
For a healthy indie project, traffic acquisition (SEO, long-tail keywords, social media) should function as an automated conveyor belt just like its codebase.
Practice: Directing Codex to Autonomously Maintain SEO Blogs and Sitemaps
// File: scripts/generate-sitemap.js
const fs = require('fs');
const path = require('path');
const BASE_URL = 'https://pmer.cn';
const blogDir = path.join(__dirname, '../content/blog');
function getBlogSlugs() {
if (!fs.existsSync(blogDir)) return [];
return fs.readdirSync(blogDir)
.filter(file => file.endsWith('.md'))
.map(file => `/blog/${file.replace('.md', '')}`);
}
function generate() {
const staticPages = ['/', '/auth/login', '/features'];
const blogPages = getBlogSlugs();
const allUrls = [...staticPages, ...blogPages];
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${allUrls.map(url => `
<url>
<loc>${BASE_URL}${url}</loc>
<changefreq>daily</changefreq>
<priority>${url === '/' ? '1.0' : '0.8'}</priority>
</url>`).join('')}
</urlset>`;
fs.writeFileSync(path.join(__dirname, '../public/sitemap.xml'), xml);
console.log('✅ Sitemap.xml generated successfully!');
}
generate();12.2 Connecting Business Data for Daily Telemetry
To keep yourself sensitive to cash flow dynamics, fetch Stripe earnings and user growth every morning and broadcast a report straight to your phone:
// File: scripts/daily-report.js
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
const axios = require('axios');
async function sendReport() {
const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000);
const userCount = await prisma.user.count({
where: { createdAt: { gte: yesterday } }
});
const activeSubs = await prisma.subscription.count({
where: { status: 'ACTIVE' }
});
const reportText = `📊 [Real-World Product Briefing]\nNew registered users yesterday: ${userCount}\nTotal active subscriptions: ${activeSubs}\n—— Keep going!`;
await axios.post(process.env.MOBILE_WEBHOOK_URL, {
msg_type: 'text',
content: { text: reportText }
});
}
sendReport();12.3 What Still Matters When Code Is Easier to Produce
As code generation becomes faster, understanding needs, reaching users, and delivering reliable service still determine whether people keep using a product. For independent developers and product managers, useful strengths include:
- Understanding the user's actual problem.
- Knowledge of the domain and its constraints.
- The ability to test a product and business assumption with evidence.
🛡️ Troubleshooting & Pitfall Cheat Sheet
| Common Pitfall | Root Cause | Rapid Diagnosis & Fix Guide |
|---|---|---|
| Product launched with zero traffic for a month | Siloed development without early SEO or social seeding | Share your building journey on X/Twitter/Indie Hackers immediately; use scripts to output multilingual long-tail blog posts |
| Obsessing over refactoring and afraid to ship or tweet | Perfectionist trap and fear of public criticism | Remember: as long as core checkout works, ship minor flaws and iterate based on real feedback |
| Wasting half a day on minor layout tweaks | Failing to delegate visual micro-adjustments to Codex | Use Computer Use (from Ch.07) for automated visual verification, freeing your time to talk to paying customers |

