<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged product</title>
<link>https://coderlegion.com/tag/product</link>
<description>Powered by Question2Answer</description>
<item>
<title>Multi-tenant SaaS, explained with a football academy</title>
<link>https://coderlegion.com/32528/multi-tenant-saas-explained-with-a-football-academy</link>
<description>&lt;p&gt;&quot;Multi-tenant&quot; is one of those words that sounds harder than it is.&lt;br&gt;
I put it on my CV.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; is multi-tenant and role-based.&lt;br&gt;
Real academies run on it.&lt;/p&gt;
&lt;p&gt;So here's what that actually means, for beginners.&lt;br&gt;
No cloud diagrams.&lt;br&gt;
Just a football academy, a building, and some locked doors.&lt;/p&gt;
&lt;p&gt;One note before we start.&lt;br&gt;
This is about the general idea and the textbook patterns.&lt;br&gt;
It is not a tour of how Track My Academy is wired inside.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/multi-tenant-saas-explained-with-a-football-academy/cover.jpg&quot; alt=&quot;Three footballs lined up on artificial grass while a squad in black kit warms up on the pitch behind them&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@leo_visions_&quot;&gt;Leo_Visions&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/soccer-balls-lined-up-on-field-with-players-training-SfCiU3xdap0&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-building-what-a-tenant-is&quot;&gt;The building: what a tenant is&lt;/h3&gt;
&lt;p&gt;Picture one big sports building.&lt;br&gt;
Lots of academies rent space in it.&lt;br&gt;
Each one has its own players, coaches, fees and attendance.&lt;/p&gt;
&lt;p&gt;Every academy is a &lt;strong&gt;tenant&lt;/strong&gt;.&lt;br&gt;
The building is your software.&lt;/p&gt;
&lt;p&gt;Microsoft's &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/tenancy-models&quot;&gt;guide to tenancy models&lt;/a&gt; says that if your customers are other organisations, you usually map each tenant to one customer.&lt;br&gt;
It also says a single tenant typically has many users.&lt;br&gt;
One academy, many people.&lt;/p&gt;
&lt;p&gt;That's the whole trick of SaaS.&lt;br&gt;
You build the building once.&lt;br&gt;
Everyone rents.&lt;/p&gt;
&lt;h3 id=&quot;the-rooms-roles&quot;&gt;The rooms: roles&lt;/h3&gt;
&lt;p&gt;Inside one academy, not everyone gets the same keys.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;owner&lt;/strong&gt; sees everything: fees, invoices, every batch.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;coach&lt;/strong&gt; sees their batches and marks attendance.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;parent&lt;/strong&gt; sees their own child, their invoices, their messages.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;player&lt;/strong&gt; sees their own reports.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is role-based access control, or RBAC.&lt;br&gt;
NIST, who &lt;a rel=&quot;nofollow&quot; href=&quot;https://csrc.nist.gov/projects/role-based-access-control&quot;&gt;formalised the model&lt;/a&gt; back in 1992, says it has become the predominant model for advanced access control because it reduces the cost of managing access.&lt;br&gt;
Users get roles. Roles get permissions.&lt;br&gt;
You don't hand out keys one person at a time.&lt;br&gt;
You hand out &quot;coach keys&quot;.&lt;/p&gt;
&lt;p&gt;The model was later adopted as a standard, ANSI/INCITS 359, &lt;a rel=&quot;nofollow&quot; href=&quot;https://csrc.nist.gov/projects/role-based-access-control&quot;&gt;first in 2004&lt;/a&gt;.&lt;br&gt;
Not a new idea. Just a very useful one.&lt;/p&gt;
&lt;p&gt;Here's the bit people mix up.&lt;br&gt;
Roles decide which rooms you can enter &lt;em&gt;inside&lt;/em&gt; your academy.&lt;br&gt;
Tenancy decides which academy's rooms you can see &lt;em&gt;at all&lt;/em&gt;.&lt;br&gt;
A coach at Academy A should never see Academy B's attendance, even with full coach keys.&lt;br&gt;
Microsoft's guide puts it as needing to consider &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/tenancy-models&quot;&gt;both tenant and user identity&lt;/a&gt; when you authorise anything.&lt;/p&gt;
&lt;h3 id=&quot;three-ways-to-share-a-building&quot;&gt;Three ways to share a building&lt;/h3&gt;
&lt;p&gt;AWS's SaaS Lens names &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.aws.amazon.com/wellarchitected/latest/saas-lens/silo-pool-and-bridge-models.html&quot;&gt;three patterns: silo, pool and bridge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Silo.&lt;/strong&gt; Every academy gets its own building.&lt;br&gt;
In software terms, dedicated resources per tenant: its own stack, or at least its own database.&lt;br&gt;
AWS notes that even a silo still shares one identity, onboarding and operations setup.&lt;br&gt;
Otherwise you're running a managed service, not SaaS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pool.&lt;/strong&gt; Everyone shares one building.&lt;br&gt;
Same servers, same database, same tables.&lt;br&gt;
AWS calls it &quot;the more classic notion of multi-tenancy&quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bridge.&lt;/strong&gt; A mix.&lt;br&gt;
Some parts siloed, some pooled.&lt;br&gt;
AWS says this acknowledges that &quot;SaaS businesses aren't always exclusively silo or pool.&quot;&lt;/p&gt;
&lt;p&gt;Microsoft describes the same spectrum, from &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/tenancy-models&quot;&gt;fully isolated to fully shared&lt;/a&gt;, and says to treat isolation as a spectrum, not a switch.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/multi-tenant-saas-explained-with-a-football-academy/training-lanes-cones.jpg&quot; alt=&quot;Training lanes marked with white lines on a black surface, with white hurdles and yellow cones in separate lanes&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@redaska&quot;&gt;Steve Pancrate&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/football-field-with-white-lines-numbers-hurdles-and-yellow-cones-FzAyjb2_Hys&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Same surface, separate lanes. That's roughly the picture.&lt;br&gt;
In the database, it usually looks like one of these:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Model &lt;/th&gt;&lt;th&gt;Academy analogy &lt;/th&gt;&lt;th&gt;Trade-off&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Database per tenant &lt;/td&gt;&lt;td&gt;Each academy has its own building &lt;/td&gt;&lt;td&gt;Strong isolation, costs grow with every new tenant&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Schema or collection per tenant &lt;/td&gt;&lt;td&gt;Own floor, shared building &lt;/td&gt;&lt;td&gt;In between, and more things to manage&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Shared tables with a &lt;code&gt;tenant_id&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Shared rooms, every item labelled with the academy's name &lt;/td&gt;&lt;td&gt;Cheapest, but every query must filter correctly&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;MongoDB's own &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.mongodb.com/docs/atlas/build-multi-tenant-arch/&quot;&gt;multi-tenant guidance&lt;/a&gt; is blunt about the middle option.&lt;br&gt;
It says to &quot;avoid putting all tenants with their own collections into a single database.&quot;&lt;br&gt;
It suggests a database per tenant for a small, stable number of tenants with strict access needs.&lt;br&gt;
And shared collections when tenant numbers keep growing.&lt;/p&gt;
&lt;p&gt;With shared collections, MongoDB says: &quot;Every document must have a &lt;code&gt;tenantId&lt;/code&gt; field, and every database query must filter by that field.&quot;&lt;br&gt;
That sentence is the whole risk of the pool model.&lt;/p&gt;
&lt;h3 id=&quot;the-noisy-neighbour&quot;&gt;The noisy neighbour&lt;/h3&gt;
&lt;p&gt;Shared buildings have one classic problem.&lt;br&gt;
One academy throws a party and the whole building shakes.&lt;/p&gt;
&lt;p&gt;Microsoft calls it the &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/antipatterns/noisy-neighbor/noisy-neighbor&quot;&gt;noisy neighbour antipattern&lt;/a&gt;.&lt;br&gt;
It happens &quot;when one tenant's performance is degraded because of the activities of another tenant.&quot;&lt;br&gt;
Say one academy runs a giant report while another is marking attendance at the gate.&lt;br&gt;
The second one waits.&lt;/p&gt;
&lt;p&gt;The fixes on that page are sensible.&lt;br&gt;
Monitor usage per tenant, not just overall.&lt;br&gt;
Apply quotas, throttling or rate limits.&lt;br&gt;
Run heavy, non-urgent jobs at off-peak times.&lt;br&gt;
Cap expensive queries.&lt;/p&gt;
&lt;p&gt;The silo model mostly avoids this.&lt;br&gt;
Microsoft's tenancy guide says dedicated deployments make tenants &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/tenancy-models&quot;&gt;unlikely to affect each other's performance&lt;/a&gt;.&lt;br&gt;
But if one tenant costs X, it says, 100 tenants probably cost 100 times that.&lt;/p&gt;
&lt;h3 id=&quot;the-scary-one-data-leaks&quot;&gt;The scary one: data leaks&lt;/h3&gt;
&lt;p&gt;Noisy neighbours are annoying.&lt;br&gt;
Leaks are a different category.&lt;/p&gt;
&lt;p&gt;AWS's whitepaper on &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.aws.amazon.com/whitepapers/latest/saas-tenant-isolation-strategies/saas-tenant-isolation-strategies.html&quot;&gt;tenant isolation strategies&lt;/a&gt; says crossing that boundary &quot;would represent a significant and potentially un-recoverable event for a SaaS business.&quot;&lt;br&gt;
Imagine a parent opening the app and seeing another academy's fee list.&lt;br&gt;
That's not a bug report. That's a trust problem.&lt;/p&gt;
&lt;p&gt;In a shared database, one forgotten filter is enough.&lt;br&gt;
So I think the safest habit is to not rely on remembering.&lt;br&gt;
Make the database refuse.&lt;/p&gt;
&lt;p&gt;PostgreSQL has &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.postgresql.org/docs/current/ddl-rowsecurity.html&quot;&gt;row-level security&lt;/a&gt; for exactly this.&lt;br&gt;
Once it's on and no policy exists, it uses default-deny: no rows are visible or can be modified.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://supabase.com/docs/guides/database/postgres/row-level-security&quot;&gt;Supabase's RLS guide&lt;/a&gt; builds on the same feature and points out it still protects data when it's reached through third-party tools.&lt;/p&gt;
&lt;p&gt;Here's a small &lt;strong&gt;illustrative example&lt;/strong&gt;.&lt;br&gt;
It is not Track My Academy's code, just the pattern:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- Example only: a shared attendance table, labelled by academy.
ALTER TABLE attendance ENABLE ROW LEVEL SECURITY;

CREATE POLICY academy_isolation ON attendance
  USING (academy_id = current_setting('app.current_academy')::uuid);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The app sets &lt;code&gt;app.current_academy&lt;/code&gt; for each request.&lt;br&gt;
Postgres then filters every query on that table to that academy, even one where someone forgot the &lt;code&gt;WHERE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Two catches from the Postgres docs.&lt;br&gt;
Superusers and roles with &lt;code&gt;BYPASSRLS&lt;/code&gt; always skip these policies.&lt;br&gt;
Table owners do too, unless you use &lt;code&gt;FORCE ROW LEVEL SECURITY&lt;/code&gt;.&lt;br&gt;
So the app shouldn't connect as the owner.&lt;/p&gt;
&lt;h3 id=&quot;how-i-d-think-about-it&quot;&gt;How I'd think about it&lt;/h3&gt;
&lt;p&gt;My opinion, for a small team:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Decide what a tenant is on day one.&lt;/strong&gt; For academy software it's obvious. For other products it often isn't.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Put the tenant ID on everything.&lt;/strong&gt; Retrofitting it later is miserable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let the database enforce isolation where it can.&lt;/strong&gt; Code reviews miss things. Default-deny doesn't get tired.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep roles and tenancy separate in your head.&lt;/strong&gt; Different questions, different checks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch per-tenant usage.&lt;/strong&gt; You can't fix a noisy neighbour you can't see.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test for leaks on purpose.&lt;/strong&gt; Microsoft's guide says to &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/tenancy-models&quot;&gt;verify one tenant's data isn't leaked&lt;/a&gt; to another, whatever model you pick.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For context, the very first Track My Academy prototype had no database at all.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/a-coach-complained-so-i-started-a-company&quot;&gt;The Excel sheet was the database&lt;/a&gt;.&lt;br&gt;
A long way from tenancy models.&lt;/p&gt;
&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;what-is-a-tenant-in-saas-&quot;&gt;What is a tenant in SaaS?&lt;/h4&gt;
&lt;p&gt;A customer, usually an organisation, whose data and users are kept separate from every other customer's, even though they all use the same software.&lt;/p&gt;
&lt;h4 id=&quot;is-a-shared-database-with-a-tenant-id-safe-&quot;&gt;Is a shared database with a tenant ID safe?&lt;/h4&gt;
&lt;p&gt;It can be, if every query is filtered by tenant and you add a database-level guard like row-level security. The risk is a single missed filter.&lt;/p&gt;
&lt;h4 id=&quot;what-s-the-difference-between-multi-tenancy-and-rbac-&quot;&gt;What's the difference between multi-tenancy and RBAC?&lt;/h4&gt;
&lt;p&gt;Tenancy keeps organisations apart. RBAC decides what each person can do inside their own organisation.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.aws.amazon.com/wellarchitected/latest/saas-lens/silo-pool-and-bridge-models.html&quot;&gt;AWS Well-Architected SaaS Lens: Silo, pool, and bridge models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.aws.amazon.com/whitepapers/latest/saas-tenant-isolation-strategies/saas-tenant-isolation-strategies.html&quot;&gt;AWS whitepaper: SaaS Tenant Isolation Strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/tenancy-models&quot;&gt;Microsoft Azure Architecture Center: Tenancy models for a multitenant solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/antipatterns/noisy-neighbor/noisy-neighbor&quot;&gt;Microsoft Azure Architecture Center: Noisy neighbor antipattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.mongodb.com/docs/atlas/build-multi-tenant-arch/&quot;&gt;MongoDB Atlas: Build a multi-tenant architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.postgresql.org/docs/current/ddl-rowsecurity.html&quot;&gt;PostgreSQL docs: Row security policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://supabase.com/docs/guides/database/postgres/row-level-security&quot;&gt;Supabase docs: Row Level Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://csrc.nist.gov/projects/role-based-access-control&quot;&gt;NIST CSRC: Role-based access control&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-next&quot;&gt;What next&lt;/h3&gt;
&lt;p&gt;How it started, Excel sheet and all: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/a-coach-complained-so-i-started-a-company&quot;&gt;a coach complained, so I started a company&lt;/a&gt;.&lt;br&gt;
And what happens when the shared building goes dark: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;the night I broke production&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Running an academy? &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; handles attendance, fees, player reports and parent messages, and there's a free plan.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32528/multi-tenant-saas-explained-with-a-football-academy</guid>
<pubDate>Sat, 31 Oct 2026 12:30:00 +0000</pubDate>
</item>
<item>
<title>Shipping Android and iOS solo (iOS: coming soon)</title>
<link>https://coderlegion.com/32524/shipping-android-and-ios-solo-ios-coming-soon</link>
<description>&lt;p&gt;I built the Track My Academy mobile apps myself.&lt;br&gt;
Both of them. Android and iOS.&lt;/p&gt;
&lt;p&gt;The Android app is live in production.&lt;br&gt;
The iOS app is coming soon.&lt;/p&gt;
&lt;p&gt;That second line is the honest one.&lt;br&gt;
It's also the one every solo founder ends up writing at some point.&lt;/p&gt;
&lt;p&gt;So this post isn't a victory lap.&lt;br&gt;
It's a look at what actually stands between one person and two app stores.&lt;br&gt;
Fees, rules, testers, reviewers.&lt;br&gt;
And why, for a product like ours, I think Android first is the sensible order.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/shipping-android-and-ios-solo/cover.jpg&quot; alt=&quot;A smartphone showing the word android next to a small green Android robot figure&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@redaquamedia&quot;&gt;Denny Müller&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/green-frog-iphone-case-beside-black-samsung-android-smartphone-HfWA-Axq6Ek&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;building-it-is-the-part-you-expect&quot;&gt;Building it is the part you expect&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; started as a web app, and the web app is live.&lt;br&gt;
Real academies run on it.&lt;br&gt;
The first version came together with AI tools, mostly vibe coding, in about three months.&lt;br&gt;
That story, and the agency build that came before it, is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-app-that-arrived-from-2006&quot;&gt;the app that arrived from 2006&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The stack behind it is React, FastAPI, MongoDB, Supabase, Firebase and a few friends.&lt;/p&gt;
&lt;p&gt;Here's the thing nobody tells you when you're writing code at night.&lt;br&gt;
Writing the app is the part you can control.&lt;br&gt;
Getting it into a store is a different job, with somebody else's rules.&lt;/p&gt;
&lt;h3 id=&quot;the-two-doors-play-console-and-app-store-connect&quot;&gt;The two doors: Play Console and App Store Connect&lt;/h3&gt;
&lt;p&gt;Each platform has one front door.&lt;br&gt;
On Android it's the Play Console.&lt;br&gt;
On iOS it's App Store Connect, which needs a paid Apple Developer Program membership.&lt;/p&gt;
&lt;p&gt;The price of entry is the first difference.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Google Play &lt;/th&gt;&lt;th&gt;Apple App Store&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Account cost &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/googleplay/android-developer/answer/6112435&quot;&gt;US$25, one time&lt;/a&gt; &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/programs/&quot;&gt;$99 a year&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Identity checks &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/googleplay/android-developer/answer/6112435&quot;&gt;Government ID and a card in your legal name may be asked for&lt;/a&gt; &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/programs/enroll/&quot;&gt;Legal name for individuals; a D-U-N-S Number for organisations&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Beta testing &lt;/td&gt;&lt;td&gt;Closed testing tracks &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/programs/&quot;&gt;TestFlight, up to 10,000 external testers&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For a bootstrapped team, one fee is a rounding error and the other is a yearly subscription.&lt;br&gt;
Neither is the real obstacle.&lt;br&gt;
But it does tell you something about how each store thinks.&lt;/p&gt;
&lt;p&gt;Apple's organisation route has its own homework.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/programs/enroll/&quot;&gt;Apple's enrolment page&lt;/a&gt; says an organisation must be a legal entity that can sign contracts, needs a D-U-N-S Number, and needs a public, working website on its own domain.&lt;br&gt;
The organisation's name then shows as the seller name on the App Store.&lt;br&gt;
None of that is hard.&lt;br&gt;
All of it takes time you didn't plan for.&lt;/p&gt;
&lt;h3 id=&quot;google-s-12-testers-and-14-days&quot;&gt;Google's 12 testers and 14 days&lt;/h3&gt;
&lt;p&gt;Android is not a free pass either.&lt;/p&gt;
&lt;p&gt;If you open a personal Play developer account today, you can't just upload and publish.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/googleplay/android-developer/answer/14151465&quot;&gt;Google's rules&lt;/a&gt; for personal accounts created after 13 November 2023 say at least 12 testers must be opted in to a closed test when you apply for production access.&lt;br&gt;
And they must have stayed opted in for the preceding 14 days, continuously.&lt;/p&gt;
&lt;p&gt;For a big company, 12 testers is a Slack message.&lt;br&gt;
For a solo developer, it's a favour you ask of friends, family and anyone who owes you one.&lt;br&gt;
Then you wait two weeks and hope nobody uninstalls.&lt;/p&gt;
&lt;p&gt;My opinion: it's annoying, and it's also fair.&lt;br&gt;
Two weeks with real people on real phones finds bugs you won't find alone.&lt;/p&gt;
&lt;h3 id=&quot;apple-s-reviewers-read-the-guidelines-so-you-have-to&quot;&gt;Apple's reviewers read the guidelines so you have to&lt;/h3&gt;
&lt;p&gt;On iOS the gate is a human review.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/distribute/app-review/&quot;&gt;Apple says&lt;/a&gt; it typically reviews at least 50% of submissions in under 24 hours and 90% in under 48 hours.&lt;br&gt;
That's quick.&lt;br&gt;
Passing is the slower bit.&lt;/p&gt;
&lt;p&gt;The same page says that, on average, over 40% of unresolved issues relate to guideline 2.1, App Completeness.&lt;br&gt;
The &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/app-store/review/guidelines/&quot;&gt;App Store Review Guidelines&lt;/a&gt; put it plainly: submissions &quot;should be final versions with all necessary metadata and fully functional URLs included&quot;.&lt;br&gt;
Placeholder text and temporary content have to go.&lt;/p&gt;
&lt;p&gt;There's also a line I like for its honesty.&lt;br&gt;
If your app has a login, include demo account details &quot;(and turn on your back-end service!)&quot;.&lt;br&gt;
Someone clearly learned that the hard way.&lt;/p&gt;
&lt;p&gt;A product like ours is almost entirely behind a login.&lt;br&gt;
It's role-based, so different people see different things.&lt;br&gt;
So a reviewer needs a working account and enough data to see the app do its job.&lt;/p&gt;
&lt;p&gt;Then there's guideline 4.2, Minimum Functionality.&lt;br&gt;
Your app &quot;should include features, content, and UI that elevate it beyond a repackaged website.&quot;&lt;br&gt;
If you already have a good web app, this is the trap.&lt;br&gt;
Wrapping it and shipping it is the fastest route, and the one most likely to bounce.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/distribute/app-review/&quot;&gt;Apple's list of common problems&lt;/a&gt; also includes broken links, a missing privacy policy, inaccurate screenshots and unclear data-access prompts.&lt;br&gt;
Boring things.&lt;br&gt;
The boring things are always the ones that get you.&lt;/p&gt;
&lt;h3 id=&quot;why-android-first-for-us&quot;&gt;Why Android first, for us&lt;/h3&gt;
&lt;p&gt;Here's where I'll be opinionated.&lt;/p&gt;
&lt;p&gt;In India, Android isn't the bigger platform.&lt;br&gt;
It's nearly the only one.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://gs.statcounter.com/os-market-share/mobile/india&quot;&gt;StatCounter's figures for September 2026&lt;/a&gt; put Android at 93.89% of mobile OS share in India and iOS at 6.05%.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; is for sports academies.&lt;br&gt;
Attendance, fees, player reports, messages to parents.&lt;br&gt;
The coach who started all this ran everything from his phone.&lt;br&gt;
His story is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/a-coach-complained-so-i-started-a-company&quot;&gt;how a coach's complaint turned into a company&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you're building for that person in India, the odds say their phone runs Android.&lt;br&gt;
So for an Indian sports-academy product, I think Android first is simply the order the market hands you.&lt;br&gt;
Add a one-time fee and a review flow you can test yourself, and the choice makes itself.&lt;/p&gt;
&lt;p&gt;That doesn't make iOS optional.&lt;br&gt;
Some parents and owners will be on iPhones.&lt;br&gt;
And the web app covers anyone in between while the iOS app is still on its way.&lt;/p&gt;
&lt;h3 id=&quot;what-i-d-tell-another-solo-dev&quot;&gt;What I'd tell another solo dev&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Budget for the store, not just the code.&lt;/strong&gt; Fees, verification, screenshots, privacy policy, demo accounts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Line up your testers early.&lt;/strong&gt; On Play, 14 days only starts once they're in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read guidelines 2.1 and 4.2 before you build, not after.&lt;/strong&gt; It's cheaper to design for them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ship where your users are first.&lt;/strong&gt; For us, that's Android.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Say &quot;coming soon&quot; out loud.&lt;/strong&gt; It's fine. It beats pretending.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The iOS app is coming soon.&lt;br&gt;
When it's out, you'll hear about it here.&lt;br&gt;
Probably with too many exclamation marks.&lt;/p&gt;
&lt;h3 id=&quot;faq-1&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;is-the-track-my-academy-ios-app-out-&quot;&gt;Is the Track My Academy iOS app out?&lt;/h4&gt;
&lt;p&gt;Not yet. The Android app and the web app are live. The iOS app is coming soon.&lt;/p&gt;
&lt;h4 id=&quot;do-new-google-play-developers-need-testers-before-going-live-&quot;&gt;Do new Google Play developers need testers before going live?&lt;/h4&gt;
&lt;p&gt;Personal accounts created after 13 November 2023 need at least 12 testers opted in to a closed test for 14 days in a row before applying for production access.&lt;/p&gt;
&lt;h4 id=&quot;how-much-does-it-cost-to-publish-on-both-stores-&quot;&gt;How much does it cost to publish on both stores?&lt;/h4&gt;
&lt;p&gt;Google Play charges a US$25 one-time fee. The Apple Developer Program costs $99 a year.&lt;/p&gt;
&lt;h3 id=&quot;sources-1&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/programs/&quot;&gt;Apple Developer Program&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/programs/enroll/&quot;&gt;Apple: Enrolment requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/app-store/review/guidelines/&quot;&gt;Apple: App Store Review Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.apple.com/distribute/app-review/&quot;&gt;Apple: App Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/googleplay/android-developer/answer/14151465&quot;&gt;Google Play Console Help: Testing requirements for new personal developer accounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/googleplay/android-developer/answer/6112435&quot;&gt;Google Play Console Help: Registering a developer account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://gs.statcounter.com/os-market-share/mobile/india&quot;&gt;StatCounter: Mobile operating system market share, India&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-next-1&quot;&gt;What next&lt;/h3&gt;
&lt;p&gt;How the product got built in the first place: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-app-that-arrived-from-2006&quot;&gt;the app that arrived from 2006&lt;/a&gt;.&lt;br&gt;
And what happens after you ship: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;we blamed our code, it was SSL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Running an academy? &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; handles attendance, fees, player reports and parent messages.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32524/shipping-android-and-ios-solo-ios-coming-soon</guid>
<pubDate>Fri, 30 Oct 2026 08:30:00 +0000</pubDate>
</item>
<item>
<title>I built a pager for my own developers</title>
<link>https://coderlegion.com/32522/i-built-a-pager-for-my-own-developers</link>
<description>&lt;p&gt;An earlier post ended with a promise.&lt;br&gt;
Sort of.&lt;/p&gt;
&lt;p&gt;In &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;the night I broke production&lt;/a&gt;, an expired SSL certificate on our backend domain failed silently.&lt;br&gt;
It took us about four hours to find it.&lt;br&gt;
I stayed in the office all night.&lt;/p&gt;
&lt;p&gt;At the end I mentioned, almost in passing, that I later built a &quot;Pager System&quot; for Track My Academy developers.&lt;br&gt;
An internal, real-time error and notification system.&lt;br&gt;
The idea: problems should find developers, not wait to be found.&lt;/p&gt;
&lt;p&gt;This post is about that idea.&lt;br&gt;
Why a tiny team needs a pager at all.&lt;br&gt;
And what I think a good one should and shouldn't do.&lt;/p&gt;
&lt;h3 id=&quot;a-very-old-idea&quot;&gt;A very old idea&lt;/h3&gt;
&lt;p&gt;Pagers were not invented for developers.&lt;br&gt;
They were invented for doctors.&lt;/p&gt;
&lt;p&gt;According to &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Pager&quot;&gt;Wikipedia's history of the pager&lt;/a&gt;, Al Gross patented the first telephone pager system in 1949, intended for physicians.&lt;br&gt;
The physicians, apparently, did not love the idea of being permanently on call.&lt;br&gt;
I relate.&lt;/p&gt;
&lt;p&gt;A year later, a paging service for doctors launched around New York City.&lt;br&gt;
Doctors paid US$12 a month for a pager that worked within about 40 km of one transmitter.&lt;/p&gt;
&lt;p&gt;And pagers never quite died.&lt;br&gt;
Wikipedia notes that in 2017 the UK's NHS was thought to use over 10% of the world's remaining pagers.&lt;br&gt;
Volunteer firefighters and rural first responders still carry them.&lt;/p&gt;
&lt;p&gt;The point of a pager has never changed.&lt;br&gt;
Something important is happening.&lt;br&gt;
The right person needs to know.&lt;br&gt;
Now, not when they next check.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/pager-system-for-my-own-developers/pager-circuit-board.jpg&quot; alt=&quot;A small circuit board with a Motorola chip in the middle, held between two fingers&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@winstonchen&quot;&gt;Winston Chen&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/a-close-up-of-a-person-holding-a-small-electronic-device-8Hrs6AIM6R4&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;why-a-small-team-needs-one&quot;&gt;Why a small team needs one&lt;/h3&gt;
&lt;p&gt;Big companies have on-call rotations, incident commanders and very serious dashboards.&lt;br&gt;
Small teams have a group chat and hope.&lt;/p&gt;
&lt;p&gt;Hope is not a monitoring strategy.&lt;br&gt;
I found that out the hard way, overnight.&lt;/p&gt;
&lt;p&gt;Track My Academy runs on React, FastAPI, MongoDB, Supabase, AWS EC2, Vercel, Razorpay, Firebase and Redis.&lt;br&gt;
That's a lot of moving parts for a small team.&lt;br&gt;
Any one of them can have a bad day.&lt;br&gt;
And real academies run on it, so their bad day becomes our bad day.&lt;/p&gt;
&lt;p&gt;The awkward truth is that a small team can't afford to watch everything.&lt;br&gt;
Nobody is sitting in front of a dashboard all day.&lt;br&gt;
We're shipping features, fixing bugs and, in my case, occasionally attending class.&lt;/p&gt;
&lt;p&gt;So the system has to do the watching.&lt;br&gt;
And when something breaks, it has to come and find a human.&lt;/p&gt;
&lt;h3 id=&quot;the-rules-i-d-steal-from-google&quot;&gt;The rules I'd steal from Google&lt;/h3&gt;
&lt;p&gt;Google's SRE book has a chapter on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/monitoring-distributed-systems/&quot;&gt;monitoring distributed systems&lt;/a&gt;.&lt;br&gt;
I keep going back to it.&lt;/p&gt;
&lt;p&gt;Three lines from it should be on every developer's wall:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Every page should be actionable.&quot;&lt;/li&gt;
&lt;li&gt;&quot;Every page response should require intelligence.&quot;&lt;/li&gt;
&lt;li&gt;&quot;Pages should be about a novel problem or an event that hasn't been seen before.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a human gets woken up and the fix is a script, automate the script.&lt;br&gt;
If the alert is something they'll ignore, delete the alert.&lt;/p&gt;
&lt;p&gt;The same chapter splits monitoring into two questions: &quot;what's broken, and why?&quot;&lt;br&gt;
What's broken is the symptom.&lt;br&gt;
Why is the cause.&lt;/p&gt;
&lt;p&gt;That distinction would have saved us hours.&lt;br&gt;
We had a symptom: everything was down.&lt;br&gt;
We jumped straight to a cause we'd picked ourselves: our new code.&lt;br&gt;
The real cause was a certificate nobody was watching.&lt;/p&gt;
&lt;p&gt;It also lists four golden signals: latency, traffic, errors and saturation.&lt;br&gt;
If you can only measure four things, the book says, measure those.&lt;/p&gt;
&lt;h3 id=&quot;the-danger-a-pager-that-cries-wolf&quot;&gt;The danger: a pager that cries wolf&lt;/h3&gt;
&lt;p&gt;There's a catch with alerting.&lt;br&gt;
Too much of it is almost as bad as none.&lt;/p&gt;
&lt;p&gt;The SRE book says that &quot;when pages occur too frequently, employees second-guess, skim, or even ignore incoming alerts&quot;.&lt;br&gt;
And one line I really like: &quot;I can only react with a sense of urgency a few times a day before I become fatigued.&quot;&lt;/p&gt;
&lt;p&gt;Hospitals know this problem well.&lt;br&gt;
The US agency AHRQ has a primer on &lt;a rel=&quot;nofollow&quot; href=&quot;https://psnet.ahrq.gov/primer/alert-fatigue&quot;&gt;alert fatigue&lt;/a&gt;.&lt;br&gt;
It describes one study where ICU monitors generated &quot;more than 2 million alerts in one month&quot;, or &quot;187 warnings per patient per day&quot;.&lt;br&gt;
It also says clinicians &quot;override the vast majority&quot; of computerised ordering warnings.&lt;/p&gt;
&lt;p&gt;Doctors are not careless.&lt;br&gt;
They're human, and humans tune out noise.&lt;br&gt;
Developers are the same, only with worse posture.&lt;/p&gt;
&lt;h3 id=&quot;what-i-think-a-good-internal-pager-should-do&quot;&gt;What I think a good internal pager should do&lt;/h3&gt;
&lt;p&gt;This is opinion, not a spec.&lt;br&gt;
But if you're a small team building your own, here's what I'd aim for.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Page on symptoms users feel.&lt;/strong&gt; Errors, slow responses, failed payments. Not every log line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Say what's broken in one sentence.&lt;/strong&gt; The person reading it may have just woken up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go to the right person.&lt;/strong&gt; Not the whole team. One owner per alert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stay quiet when things are fine.&lt;/strong&gt; Every alert that isn't urgent teaches people to ignore the urgent ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch the boring stuff.&lt;/strong&gt; Certificates, domains, disk space, expiring keys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get pruned regularly.&lt;/strong&gt; If an alert fired and nobody acted, change it or remove it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You don't have to build it from scratch either.&lt;br&gt;
Tools like &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.sentry.io/product/alerts/&quot;&gt;Sentry&lt;/a&gt; let you send notifications or create tickets when issues match rules you set.&lt;br&gt;
Its docs say the goal is alerts that are &quot;valuable and not too noisy&quot;.&lt;br&gt;
They suggest using filters so you only hear about issues your team needs to know about.&lt;/p&gt;
&lt;h3 id=&quot;about-those-certificates&quot;&gt;About those certificates&lt;/h3&gt;
&lt;p&gt;The boring stuff deserves its own section, because it got us.&lt;/p&gt;
&lt;p&gt;Certificates are about to expire a lot more often.&lt;br&gt;
In 2025 the CA/Browser Forum &lt;a rel=&quot;nofollow&quot; href=&quot;https://cabforum.org/2025/04/11/ballot-sc081v3-introduce-schedule-of-reducing-validity-and-data-reuse-periods/&quot;&gt;passed a ballot&lt;/a&gt; to cut the maximum TLS certificate lifetime from 398 days to 47 days.&lt;br&gt;
The reductions start in March 2026 and finish in March 2029.&lt;/p&gt;
&lt;p&gt;Meanwhile, Let's Encrypt &lt;a rel=&quot;nofollow&quot; href=&quot;https://letsencrypt.org/2025/01/22/ending-expiration-emails/&quot;&gt;stopped sending expiry reminder emails&lt;/a&gt; on 4 June 2025.&lt;br&gt;
Its reasons included that more people now have reliable renewal automation.&lt;br&gt;
It pointed people to third-party monitoring instead.&lt;/p&gt;
&lt;p&gt;So: shorter lifetimes, fewer reminders.&lt;br&gt;
If your renewal automation ever quietly fails, nobody is going to email you about it.&lt;br&gt;
Your users will tell you instead.&lt;/p&gt;
&lt;p&gt;Automate renewals.&lt;br&gt;
Then monitor the automation anyway.&lt;/p&gt;
&lt;h3 id=&quot;the-point&quot;&gt;The point&lt;/h3&gt;
&lt;p&gt;A pager isn't about being available all the time.&lt;br&gt;
Honestly, I'd like to sleep more, not less.&lt;/p&gt;
&lt;p&gt;It's about not spending four hours blaming the wrong thing.&lt;br&gt;
The problem should arrive with a name attached.&lt;br&gt;
Then the human can do the part that needs a human.&lt;/p&gt;
&lt;h3 id=&quot;faq-2&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;does-a-small-team-really-need-alerting-&quot;&gt;Does a small team really need alerting?&lt;/h4&gt;
&lt;p&gt;I think so. Small teams have fewer people watching, so the system has to do the watching for them.&lt;/p&gt;
&lt;h4 id=&quot;what-should-trigger-a-page-&quot;&gt;What should trigger a page?&lt;/h4&gt;
&lt;p&gt;Something urgent, actionable and user-facing. If nobody needs to act right now, it's a ticket or a report, not a page.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-avoid-alert-fatigue-&quot;&gt;How do I avoid alert fatigue?&lt;/h4&gt;
&lt;p&gt;Fewer, better alerts. Review the ones that fired, and delete or fix any that nobody acted on.&lt;/p&gt;
&lt;h3 id=&quot;sources-2&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Pager&quot;&gt;Wikipedia: Pager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/monitoring-distributed-systems/&quot;&gt;Google SRE book: Monitoring distributed systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://psnet.ahrq.gov/primer/alert-fatigue&quot;&gt;AHRQ PSNet: Alert fatigue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.sentry.io/product/alerts/&quot;&gt;Sentry docs: Alerts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cabforum.org/2025/04/11/ballot-sc081v3-introduce-schedule-of-reducing-validity-and-data-reuse-periods/&quot;&gt;CA/Browser Forum: Ballot SC-081v3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://letsencrypt.org/2025/01/22/ending-expiration-emails/&quot;&gt;Let's Encrypt: Ending support for expiration notification emails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-next-2&quot;&gt;What next&lt;/h3&gt;
&lt;p&gt;The full outage story is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;the night I broke production&lt;/a&gt;.&lt;br&gt;
For where the late nights happen, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/three-monitors-one-monster-can&quot;&gt;three monitors, one Monster can&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Running an academy? &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; handles attendance, fees, player reports and parent messages.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32522/i-built-a-pager-for-my-own-developers</guid>
<pubDate>Thu, 29 Oct 2026 08:30:00 +0000</pubDate>
</item>
<item>
<title>How to win a hackathon, according to a tired judge</title>
<link>https://coderlegion.com/32520/how-to-win-a-hackathon-according-to-a-tired-judge</link>
<description>&lt;p&gt;&lt;em&gt;Cover photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@evan_marvell&quot;&gt;Evan Marvell&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/two-men-at-a-table-with-a-laptop-uzBZnacIKgQ&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On 8 and 9 October, I sat on the other side of the table.&lt;/p&gt;
&lt;p&gt;I was on the jury of a hackathon at VISTAS.&lt;br&gt;
It was run by the Department of Computing Sciences and the Vels Innovation Council.&lt;br&gt;
More than 80 teams turned up.&lt;br&gt;
Over two days, I evaluated somewhere between 20 and 30 of them.&lt;/p&gt;
&lt;p&gt;I've been a hackathon participant.&lt;br&gt;
I've lost hackathons.&lt;br&gt;
I've won a couple too, which my &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/about&quot;&gt;about page&lt;/a&gt; mentions with suspicious frequency.&lt;/p&gt;
&lt;p&gt;Now I've judged one.&lt;br&gt;
The personal story of that loop is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/from-hackathon-loser-to-hackathon-jury&quot;&gt;from hackathon loser to hackathon jury&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This post is the practical bit.&lt;br&gt;
How to win a hackathon, from someone who just spent two days scoring them.&lt;/p&gt;
&lt;h3 id=&quot;what-hackathon-judges-actually-see&quot;&gt;What hackathon judges actually see&lt;/h3&gt;
&lt;p&gt;Here's the part nobody tells participants.&lt;/p&gt;
&lt;p&gt;Your judge isn't seeing your project in isolation.&lt;br&gt;
They're seeing it as team number seven.&lt;br&gt;
Or team number fourteen.&lt;/p&gt;
&lt;p&gt;Most teams in a judge's group share the same or similar problem statements.&lt;br&gt;
So the judge has already heard your problem explained.&lt;br&gt;
Several times.&lt;br&gt;
Usually in the same words.&lt;/p&gt;
&lt;p&gt;Around the fifth team, focus starts slipping.&lt;br&gt;
Not because judges don't care.&lt;br&gt;
Because judges are human.&lt;/p&gt;
&lt;p&gt;There's research on this, sort of.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Decision_fatigue&quot;&gt;Decision fatigue&lt;/a&gt; describes decisions getting worse after a long run of them.&lt;br&gt;
The evidence for it is honestly mixed, so don't build a religion on it.&lt;br&gt;
But anyone who has judged fifteen pitches in a row will nod politely.&lt;/p&gt;
&lt;p&gt;Running order matters too.&lt;br&gt;
A &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.sciencedaily.com/releases/2005/03/050308102138.htm&quot;&gt;Carnegie Mellon study&lt;/a&gt; found later performers got higher marks.&lt;br&gt;
That was Eurovision and figure skating, not hackathons.&lt;br&gt;
You can't choose your slot anyway.&lt;br&gt;
So the only thing you control is how fast you earn the judge's attention.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/how-to-win-a-hackathon-judges/student-presenting-to-classmates.jpg&quot; alt=&quot;A smiling student presents in front of a projected slide while a room of fellow students listens&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@tinasihgusti&quot;&gt;Herlambang Tinasih Gusti&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/a-man-standing-in-front-of-a-group-of-people-3kc_75Rdgyk&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-first-30-seconds-of-your-hackathon-pitch&quot;&gt;The first 30 seconds of your hackathon pitch&lt;/h3&gt;
&lt;p&gt;Start like a person, not a slide deck.&lt;/p&gt;
&lt;p&gt;Give the judge a firm handshake.&lt;br&gt;
Ask them how their day is going.&lt;br&gt;
They'll appreciate it.&lt;br&gt;
It's probably been a long one.&lt;/p&gt;
&lt;p&gt;Then introduce yourself and your team.&lt;br&gt;
Clearly.&lt;br&gt;
Confidently.&lt;br&gt;
Names, and who built what.&lt;/p&gt;
&lt;p&gt;Then say three things, fast:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The problem statement&lt;/strong&gt; you picked, in one line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The scope&lt;/strong&gt; you chose to tackle within it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your solution&lt;/strong&gt;, in one sentence a tired person can repeat.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That's it.&lt;br&gt;
You now have the judge's attention, and you've spent maybe thirty seconds.&lt;/p&gt;
&lt;p&gt;An &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Elevator_pitch&quot;&gt;elevator pitch&lt;/a&gt; usually runs thirty seconds to two minutes.&lt;br&gt;
Your opening should sit at the short end.&lt;/p&gt;
&lt;h3 id=&quot;show-the-prototype-early&quot;&gt;Show the prototype early&lt;/h3&gt;
&lt;p&gt;The demo is the hackathon.&lt;br&gt;
Everything else is decoration.&lt;/p&gt;
&lt;p&gt;Plenty of hackathon rulebooks say this out loud.&lt;br&gt;
The &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/UHCodeRED/rules&quot;&gt;UH CodeRED rules&lt;/a&gt;, for example, strongly encourage a demo.&lt;br&gt;
They say pitches and presentations are discouraged.&lt;br&gt;
They even say teams aren't judged on the quality of their pitch.&lt;/p&gt;
&lt;p&gt;Not every hackathon works that way.&lt;br&gt;
But almost every judge prefers seeing a thing work to hearing about it.&lt;/p&gt;
&lt;p&gt;So get to the prototype quickly.&lt;br&gt;
Show the main flow, end to end.&lt;br&gt;
One happy path that works beats five half-loaded features.&lt;/p&gt;
&lt;p&gt;If something breaks, say so and move on.&lt;br&gt;
Judges have seen broken demos before.&lt;br&gt;
I've broken &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;production&lt;/a&gt;, so I'm in no position to judge that part.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/how-to-win-a-hackathon-judges/student-team-preparing-laptop-demo.jpg&quot; alt=&quot;Four college students crowd around a laptop on a podium as they get their project demo ready&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.pexels.com/@shibraj-deb-429139665&quot;&gt;Shibraj Deb&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.pexels.com/photo/men-looking-in-laptop-16070143/&quot;&gt;Pexels&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;how-to-win-a-hackathon-stay-on-the-problem-statement&quot;&gt;How to win a hackathon: stay on the problem statement&lt;/h3&gt;
&lt;p&gt;This one hurt to watch, because I used to do it.&lt;/p&gt;
&lt;p&gt;Teams drift.&lt;br&gt;
They start on the given problem statement.&lt;br&gt;
Then they bolt on a chatbot, a dashboard and a dream.&lt;br&gt;
By the end, the judge can't find the original problem.&lt;/p&gt;
&lt;p&gt;Your score is usually tied to the problem you were given.&lt;br&gt;
Solving a different, cooler problem rarely earns bonus points.&lt;br&gt;
It mostly earns confused faces.&lt;/p&gt;
&lt;p&gt;Before you build anything, write the problem statement on a sticky note.&lt;br&gt;
Every feature must point back to it.&lt;br&gt;
If it doesn't, it waits for version two.&lt;br&gt;
I run my own life off sticky notes, as &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/three-monitors-one-monster-can&quot;&gt;my desk setup post&lt;/a&gt; proves.&lt;/p&gt;
&lt;h3 id=&quot;don-t-over-engineer-your-hackathon-project&quot;&gt;Don't over-engineer your hackathon project&lt;/h3&gt;
&lt;p&gt;The second classic mistake: building a cathedral in two days.&lt;/p&gt;
&lt;p&gt;Microservices.&lt;br&gt;
Three databases.&lt;br&gt;
A custom login system nobody asked for.&lt;br&gt;
And a demo that loads forever.&lt;/p&gt;
&lt;p&gt;Judges don't score your architecture diagram.&lt;br&gt;
They score what they can see working.&lt;/p&gt;
&lt;p&gt;Pick the boring stack you already know.&lt;br&gt;
Build the smallest thing that proves your idea.&lt;br&gt;
Spend the saved hours polishing the one flow you'll demo.&lt;/p&gt;
&lt;p&gt;When I started building &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt;, the first night ended with a landing page.&lt;br&gt;
Not an architecture.&lt;br&gt;
A landing page I actually liked.&lt;br&gt;
Small, finished things build momentum.&lt;/p&gt;
&lt;h3 id=&quot;what-the-jury-doesn-t-want-to-hear&quot;&gt;What the jury doesn't want to hear&lt;/h3&gt;
&lt;p&gt;Some things quietly drain your score.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Facts the judge already knows.&lt;/strong&gt; They've read the problem statement. Probably several times today.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Statistics read off a slide.&lt;/strong&gt; Especially ones an AI tool produced five minutes earlier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A tour of everything you made with AI.&lt;/strong&gt; Use AI tools, absolutely. Just don't make them the pitch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trying to impress instead of explain.&lt;/strong&gt; Big words, no working product. Judges spot it instantly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On AI: I'm a fan.&lt;br&gt;
I once chased free AI trials across &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/dozens-of-email-accounts-and-zero-shame&quot;&gt;dozens of email accounts&lt;/a&gt;.&lt;br&gt;
But the judge is scoring your thinking, not your prompt history.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/how-to-win-a-hackathon-judges/judge-scoring-on-clipboard.jpg&quot; alt=&quot;An evaluator holds a pen over a blue clipboard, ready to write down scores&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@philhearing&quot;&gt;Phil Hearing&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/hand-holding-pen-over-a-blue-clipboard-eXcF6L9pEug&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;a-simple-hackathon-pitch-structure&quot;&gt;A simple hackathon pitch structure&lt;/h3&gt;
&lt;p&gt;If you want a template, steal this one.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hello (10 seconds).&lt;/strong&gt; Handshake, how's your day, team intro.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem and scope (20 seconds).&lt;/strong&gt; One line each. No essays.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solution (15 seconds).&lt;/strong&gt; One sentence, plain words.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Demo (most of your time).&lt;/strong&gt; One flow, start to finish, working.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How you built it (30 seconds).&lt;/strong&gt; Your stack, and one hard thing you solved.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What's next (10 seconds).&lt;/strong&gt; One honest line. Then stop talking.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then let the judge ask questions.&lt;br&gt;
Answer them directly.&lt;br&gt;
&quot;I don't know yet&quot; is a perfectly good answer.&lt;br&gt;
Making something up is not.&lt;/p&gt;
&lt;h3 id=&quot;hackathon-tips-for-the-questions-round&quot;&gt;Hackathon tips for the questions round&lt;/h3&gt;
&lt;p&gt;Questions are where good teams pull ahead.&lt;/p&gt;
&lt;p&gt;Listen to the whole question.&lt;br&gt;
Answer the question that was asked, not the one you rehearsed.&lt;br&gt;
Let the person who built that part answer it.&lt;br&gt;
Keep answers to a few sentences.&lt;/p&gt;
&lt;p&gt;If a judge points out a flaw, agree if it's true.&lt;br&gt;
Then say how you'd fix it.&lt;br&gt;
That shows judgement, which is exactly what they're measuring.&lt;/p&gt;
&lt;h3 id=&quot;faq-3&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;how-do-hackathon-judges-score-projects-&quot;&gt;How do hackathon judges score projects?&lt;/h4&gt;
&lt;p&gt;It depends on the event, so read the rules first.&lt;br&gt;
Common criteria are technical difficulty, design, completion and impact.&lt;br&gt;
Most judges weigh what they see working more than what they hear.&lt;/p&gt;
&lt;h4 id=&quot;how-long-should-a-hackathon-pitch-be-&quot;&gt;How long should a hackathon pitch be?&lt;/h4&gt;
&lt;p&gt;As short as the rules allow.&lt;br&gt;
Aim for under a minute before the demo starts.&lt;br&gt;
Then let the working prototype do the talking.&lt;/p&gt;
&lt;h4 id=&quot;do-you-need-a-perfect-product-to-win-a-hackathon-&quot;&gt;Do you need a perfect product to win a hackathon?&lt;/h4&gt;
&lt;p&gt;No.&lt;br&gt;
You need one flow that clearly works and clearly fits the problem statement.&lt;br&gt;
Polish that, and be honest about the rest.&lt;/p&gt;
&lt;h3 id=&quot;go-build-something&quot;&gt;Go build something&lt;/h3&gt;
&lt;p&gt;If you're heading into a hackathon, good luck.&lt;br&gt;
Keep it short, keep it focused, and show the thing.&lt;/p&gt;
&lt;p&gt;I build products at &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmytech.in&quot;&gt;TrackMy Tech&lt;/a&gt;, and I'm always happy to talk shop.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://calendar.rahuldk.in&quot;&gt;Book a call&lt;/a&gt; if you want a second opinion on your idea.&lt;br&gt;
Or read about &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-app-that-arrived-from-2006&quot;&gt;the app that arrived from 2006&lt;/a&gt;, my favourite cautionary tale.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32520/how-to-win-a-hackathon-according-to-a-tired-judge</guid>
<pubDate>Wed, 28 Oct 2026 12:30:00 +0000</pubDate>
</item>
<item>
<title>R.I.P. smart ball v1: what smart football sensors taught me</title>
<link>https://coderlegion.com/32518/r-i-p-smart-ball-v1-what-smart-football-sensors-taught-me</link>
<description>&lt;p&gt;We are gathered here today to remember smart ball v1.&lt;/p&gt;
&lt;p&gt;It was a football.&lt;br&gt;
It had smart football sensors inside.&lt;br&gt;
It never shipped.&lt;/p&gt;
&lt;p&gt;Rest in peace, little guy.&lt;br&gt;
This is the eulogy, and also a beginner's guide to why hardware is hard.&lt;br&gt;
If you have ever wanted to stuff electronics into a football, read this first.&lt;/p&gt;
&lt;p&gt;It will save you some wires.&lt;br&gt;
Possibly some eyebrows.&lt;/p&gt;
&lt;h3 id=&quot;the-idea-a-football-that-knows-it-was-kicked&quot;&gt;The idea: a football that knows it was kicked&lt;/h3&gt;
&lt;p&gt;I love football.&lt;br&gt;
I love building things.&lt;br&gt;
I was also fascinated by how adidas built its smart ball.&lt;br&gt;
It was extremely expensive.&lt;br&gt;
And as far as I could find, you couldn't just buy one.&lt;/p&gt;
&lt;p&gt;Then the chance actually showed up.&lt;br&gt;
While I was working with CP Sports, we had a tie-up with an agency.&lt;br&gt;
That agency worked with a well-known sporting goods manufacturer in north India.&lt;br&gt;
They had a good contact with a senior executive there.&lt;/p&gt;
&lt;p&gt;In one discussion, they asked us a question.&lt;br&gt;
&quot;Can you build something that tracks player data like the adidas smart ball?&quot;&lt;br&gt;
&quot;But cheaper?&quot;&lt;br&gt;
We didn't even flinch.&lt;br&gt;
&quot;Yes, of course.&quot;&lt;/p&gt;
&lt;p&gt;They asked for a structural design within a week.&lt;br&gt;
They'd help us pitch it to the company.&lt;br&gt;
There was talk of hefty funding.&lt;br&gt;
I genuinely thought my life was settled.&lt;/p&gt;
&lt;p&gt;A low-cost football with sensors inside.&lt;br&gt;
Something that could tell you about every touch.&lt;br&gt;
How hard could it be?&lt;/p&gt;
&lt;p&gt;Very.&lt;br&gt;
The answer is very.&lt;/p&gt;
&lt;p&gt;This was not a weekend hack, either.&lt;br&gt;
Smart Football R&amp;amp;D ran from December 2024 to December 2025.&lt;br&gt;
A full year of my life, inside a ball.&lt;/p&gt;
&lt;p&gt;It ran alongside &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt;, which I was building at the same time.&lt;br&gt;
That one started because &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/a-coach-complained-so-i-started-a-company&quot;&gt;a coach complained about attendance&lt;/a&gt;.&lt;br&gt;
So yes, two big projects at once.&lt;br&gt;
One of them was round.&lt;/p&gt;
&lt;h3 id=&quot;prototype-zero-maida-boba-straws-and-a-pickleball&quot;&gt;Prototype zero: maida, boba straws and a pickleball&lt;/h3&gt;
&lt;p&gt;We had one week to show a structure.&lt;br&gt;
We were second-year students.&lt;br&gt;
We had no 3D printer.&lt;br&gt;
We didn't even really know how 3D printing worked.&lt;/p&gt;
&lt;p&gt;So I improvised.&lt;br&gt;
The model just had to show the structure, in any shape or size.&lt;br&gt;
I made a clay-like dough out of maida, plain flour.&lt;br&gt;
I pushed it into boba straws to build the structure.&lt;br&gt;
I used a pickleball as the core and stuck cones on it.&lt;/p&gt;
&lt;p&gt;Yes, our very first smart ball prototype was partly made of flour.&lt;br&gt;
We presented it anyway.&lt;br&gt;
Everything went perfectly.&lt;br&gt;
Hold that thought.&lt;/p&gt;
&lt;h3 id=&quot;what-was-inside-smart-ball-v1&quot;&gt;What was inside smart ball v1&lt;/h3&gt;
&lt;p&gt;Look at the photo above.&lt;/p&gt;
&lt;p&gt;That's an open football shell.&lt;br&gt;
Inside, there are &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Piezoelectric_sensor&quot;&gt;piezo sensors&lt;/a&gt; around the edges.&lt;br&gt;
In the middle, a breadboard covered in wires.&lt;/p&gt;
&lt;p&gt;Lots of wires.&lt;br&gt;
More wires than any football should legally contain.&lt;/p&gt;
&lt;p&gt;Piezo sensors turn pressure into a small electrical signal.&lt;br&gt;
Kick the ball, the sensor reacts.&lt;br&gt;
At least, that's the theory.&lt;/p&gt;
&lt;p&gt;Theory and breadboards are not always on speaking terms.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/rip-smart-ball-v1/arduino-breadboard-sensor-wiring.jpg&quot; alt=&quot;Arduino board wired to sensors on a solderless breadboard, the classic hardware prototyping setup&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@vishnumaiea&quot;&gt;Vishnu Mohanan&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/a-close-up-of-a-board-with-wires-attached-to-it-vtg8tAdoWVQ&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Breadboard&quot;&gt;breadboard&lt;/a&gt; is brilliant for prototyping.&lt;br&gt;
You push wires in, no soldering needed, and you can reuse it.&lt;/p&gt;
&lt;p&gt;Wikipedia also politely notes its connections are &quot;subject to jostle&quot;.&lt;/p&gt;
&lt;p&gt;Jostle.&lt;br&gt;
In a football.&lt;br&gt;
The object whose entire job is being kicked.&lt;/p&gt;
&lt;p&gt;You can see where this is going.&lt;/p&gt;
&lt;h3 id=&quot;the-year-in-one-list&quot;&gt;The year in one list&lt;/h3&gt;
&lt;p&gt;People imagine hardware R&amp;amp;D as one big &quot;eureka&quot;.&lt;br&gt;
It's more like a long list of small &quot;oh no&quot;.&lt;/p&gt;
&lt;p&gt;Here is what that year actually covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sensor selection.&lt;/strong&gt; Which sensor, how many, and what it should even measure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Component placement.&lt;/strong&gt; Where everything sits inside a sphere that gets booted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ball balance.&lt;/strong&gt; Add weight on one side and the ball stops rolling straight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bladder and pressure research.&lt;/strong&gt; The air inside changes how everything behaves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prototype testing.&lt;/strong&gt; Kick it, check it, fix it, repeat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App dashboard concepts.&lt;/strong&gt; What a player or coach would actually see afterwards.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every item on that list could be its own engineering degree.&lt;br&gt;
I had a breadboard and optimism.&lt;/p&gt;
&lt;p&gt;Ball balance was the sneaky one.&lt;br&gt;
In software, a heavy function makes things slow.&lt;br&gt;
In a football, a heavy component makes it wobble.&lt;br&gt;
Nobody wants a ball that curves because of your circuit.&lt;/p&gt;
&lt;h3 id=&quot;our-first-pcb-made-in-coimbatore&quot;&gt;Our first PCB, made in Coimbatore&lt;/h3&gt;
&lt;p&gt;The breadboard could only take us so far.&lt;br&gt;
So we designed our own custom PCB, a &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Printed_circuit_board&quot;&gt;printed circuit board&lt;/a&gt;.&lt;br&gt;
We went to a professional PCB printing place in Coimbatore.&lt;br&gt;
We spent two full days there.&lt;/p&gt;
&lt;p&gt;We came back with our first PCB.&lt;br&gt;
We connected it to our own sensors.&lt;br&gt;
And it worked.&lt;/p&gt;
&lt;p&gt;I can't fully explain that feeling.&lt;br&gt;
The sensors responding, with everything connected inside the ball.&lt;br&gt;
You could see the joy in our eyes.&lt;br&gt;
That moment taught us more about IoT devices than any course.&lt;/p&gt;
&lt;h3 id=&quot;imu-vs-piezo-sensors-two-ways-to-make-a-ball-feel-things&quot;&gt;IMU vs piezo sensors: two ways to make a ball feel things&lt;/h3&gt;
&lt;p&gt;There are two common ways to give a ball a sense of touch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Piezo sensors&lt;/strong&gt; react to pressure and impact.&lt;br&gt;
They are cheap, simple and good at noticing a sudden hit.&lt;br&gt;
The catch: they &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Piezoelectric_sensor&quot;&gt;cannot do truly static measurements&lt;/a&gt;.&lt;br&gt;
They notice the kick, not the gentle story after it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An IMU&lt;/strong&gt; is an &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Inertial_measurement_unit&quot;&gt;inertial measurement unit&lt;/a&gt;.&lt;br&gt;
It combines accelerometers, gyroscopes and sometimes magnetometers.&lt;br&gt;
It measures how the object moves and rotates.&lt;/p&gt;
&lt;p&gt;The catch there is drift.&lt;br&gt;
Tiny measurement errors pile up over time.&lt;br&gt;
The device slowly loses track of where it really is.&lt;/p&gt;
&lt;p&gt;So, roughly:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Piezo sensor &lt;/th&gt;&lt;th&gt;IMU&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Good at &lt;/td&gt;&lt;td&gt;Detecting impacts and pressure &lt;/td&gt;&lt;td&gt;Motion, spin and orientation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Weak at &lt;/td&gt;&lt;td&gt;Static or slow measurements &lt;/td&gt;&lt;td&gt;Drift over time&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Beginner-friendly &lt;/td&gt;&lt;td&gt;Very &lt;/td&gt;&lt;td&gt;Less so&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;My opinion: piezo is the friendly place to start.&lt;br&gt;
An IMU is where the serious connected ball technology lives.&lt;/p&gt;
&lt;h3 id=&quot;meanwhile-the-professionals&quot;&gt;Meanwhile, the professionals&lt;/h3&gt;
&lt;p&gt;While I was fighting wires, real sports tech was doing real things.&lt;/p&gt;
&lt;p&gt;At the 2022 World Cup, the match ball had an IMU sensor in its centre.&lt;br&gt;
According to &lt;a rel=&quot;nofollow&quot; href=&quot;https://inside.fifa.com/en/innovation/world-cup-2022/semi-automated-offside-technology&quot;&gt;FIFA&lt;/a&gt;, it sent data 500 times per second.&lt;br&gt;
That helped detect the exact moment a ball was kicked, for offside calls.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://news.adidas.com/football/adidas-reveals-the-first-fifa-world-cup-official-match-ball-featuring-connected-ball-technology/s/cccb7187-a67c-4166-b57d-2b28f1d36fa0&quot;&gt;adidas says&lt;/a&gt; a suspension system held that sensor steady at the centre.&lt;br&gt;
It ran on a rechargeable battery, charged by induction.&lt;/p&gt;
&lt;p&gt;Read that again.&lt;br&gt;
They suspended a sensor in the middle of a ball.&lt;br&gt;
That is the ball balance problem, solved properly.&lt;/p&gt;
&lt;p&gt;500 times per second.&lt;br&gt;
My prototype struggled to report once without a wire falling off.&lt;/p&gt;
&lt;p&gt;Humbling?&lt;br&gt;
Yes.&lt;/p&gt;
&lt;p&gt;Inspiring?&lt;br&gt;
Also yes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/rip-smart-ball-v1/football-on-grass-close-up.jpg&quot; alt=&quot;Close-up of a well-used match football resting on green grass&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@one23four56&quot;&gt;Jason Mayer&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/a-close-up-of-a-soccer-ball-in-the-grass-Fe3mpcOMQnU&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-real-engineer-jitendra&quot;&gt;The real engineer: Jitendra&lt;/h3&gt;
&lt;p&gt;Let me give credit where it's due.&lt;br&gt;
A huge shout-out to Jitendra.&lt;/p&gt;
&lt;p&gt;He was my junior, and I met him in my second year.&lt;br&gt;
Geeky, nerdy, and with an immense knowledge of IoT and gadgets.&lt;br&gt;
He built about 70% of the IoT systems that made the ball work.&lt;br&gt;
He also wrote the code for it.&lt;/p&gt;
&lt;p&gt;My part was product design.&lt;br&gt;
I told him how I wanted it to work.&lt;br&gt;
He made it work.&lt;br&gt;
That's a very good deal for me.&lt;/p&gt;
&lt;h3 id=&quot;i-learned-to-solder-soldering-safety-first-&quot;&gt;I learned to solder (soldering safety first)&lt;/h3&gt;
&lt;p&gt;Soldering was the painful part for me.&lt;br&gt;
Before this project, I had never soldered anything.&lt;/p&gt;
&lt;p&gt;Complete beginner.&lt;br&gt;
Absolute zero.&lt;/p&gt;
&lt;p&gt;The smart ball got me soldering.&lt;br&gt;
I look like a scientist.&lt;br&gt;
I solder like a nervous chef.&lt;/p&gt;
&lt;p&gt;But I learned.&lt;br&gt;
Slowly.&lt;/p&gt;
&lt;p&gt;If you're a beginner too, here's the bit to take seriously.&lt;/p&gt;
&lt;p&gt;A &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Soldering_iron&quot;&gt;soldering iron&lt;/a&gt; runs roughly between 200 and 480 °C.&lt;br&gt;
That is not a &quot;quick touch to check&quot; temperature.&lt;br&gt;
Hold it by the handle and put it back in its stand.&lt;/p&gt;
&lt;p&gt;The fumes matter too.&lt;br&gt;
The UK's Health and Safety Executive is blunt about it.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.hse.gov.uk/pubns/indg248.pdf&quot;&gt;Rosin solder flux fume can cause asthma and dermatitis&lt;/a&gt;.&lt;br&gt;
Their advice is simple: keep your face out of the fume and use extraction.&lt;/p&gt;
&lt;p&gt;So my beginner soldering safety list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Safety glasses on, every time.&lt;/li&gt;
&lt;li&gt;Ventilation or a fume extractor.&lt;/li&gt;
&lt;li&gt;Iron goes back in the stand.&lt;/li&gt;
&lt;li&gt;Wash your hands after handling solder.&lt;/li&gt;
&lt;li&gt;Never assume the tip has cooled down.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/rip-smart-ball-v1/soldering-iron-circuit-board.jpg&quot; alt=&quot;Soldering iron tip joining components on a printed circuit board while a hand feeds solder wire&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@www_erzetich_com&quot;&gt;Blaz Erzetic&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/C-Cml4m7rUo&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;why-hardware-is-hard-and-why-v1-never-shipped-&quot;&gt;Why hardware is hard (and why v1 never shipped)&lt;/h3&gt;
&lt;p&gt;Hardware is hard.&lt;br&gt;
Everyone says it.&lt;br&gt;
Now I get it.&lt;/p&gt;
&lt;p&gt;With software, a mistake costs you a deploy.&lt;br&gt;
With hardware, a mistake costs you a ball.&lt;/p&gt;
&lt;p&gt;Software also forgives you faster.&lt;br&gt;
When I &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;broke production for hours&lt;/a&gt;, at least nothing physical died.&lt;br&gt;
You can't hotfix a solder joint over Wi-Fi.&lt;/p&gt;
&lt;p&gt;Hardware also costs money at every single step.&lt;br&gt;
Parts, more parts, replacement parts for the parts you fried.&lt;/p&gt;
&lt;p&gt;Now, the plot twist I promised.&lt;br&gt;
That hefty funding? It never came.&lt;br&gt;
It was promised. It just never arrived.&lt;/p&gt;
&lt;p&gt;We spent more than a year on R&amp;amp;D with basically no outside money.&lt;br&gt;
We still put more than ₹1 lakh of our own into the ball.&lt;br&gt;
Eventually, we had to stop.&lt;br&gt;
We put the project aside, as a memory.&lt;/p&gt;
&lt;p&gt;No dramatic explosion.&lt;br&gt;
Just a deal that never landed, and a very sensible spreadsheet.&lt;/p&gt;
&lt;p&gt;Smart ball v1 was never finished.&lt;br&gt;
But it was never meant to be the final version.&lt;/p&gt;
&lt;p&gt;That's what v1 is for.&lt;/p&gt;
&lt;h3 id=&quot;hardware-prototyping-for-beginners-what-i-d-tell-you&quot;&gt;Hardware prototyping for beginners: what I'd tell you&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Building teaches you what reading can't.&lt;/strong&gt;&lt;br&gt;
I understood sensors only after I wired one wrong.&lt;br&gt;
I learn by doing things badly first.&lt;br&gt;
Same energy as rebuilding &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-app-that-arrived-from-2006&quot;&gt;the app that looked like 2006&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Start on a breadboard, finish on solder.&lt;/strong&gt;&lt;br&gt;
Breadboards are for finding out.&lt;br&gt;
Solder is for when you've found out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Think about where the thing lives.&lt;/strong&gt;&lt;br&gt;
A circuit on a desk is easy.&lt;br&gt;
A circuit inside a ball gets kicked, squashed and rained on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prototypes are allowed to die.&lt;/strong&gt;&lt;br&gt;
Their job is to teach you, not to survive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Respect hardware people.&lt;/strong&gt;&lt;br&gt;
Anyone who ships a physical product is a wizard.&lt;br&gt;
I'm still at the &quot;please don't short-circuit&quot; stage.&lt;/p&gt;
&lt;h3 id=&quot;faq-4&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;what-sensors-are-used-in-smart-footballs-&quot;&gt;What sensors are used in smart footballs?&lt;/h4&gt;
&lt;p&gt;Mostly IMUs, which track motion and spin.&lt;br&gt;
The 2022 World Cup ball used one sampling 500 times per second.&lt;br&gt;
Piezo sensors are a cheaper way to detect impacts, which is where I started.&lt;/p&gt;
&lt;h4 id=&quot;is-a-smart-football-hard-to-build-as-a-beginner-&quot;&gt;Is a smart football hard to build as a beginner?&lt;/h4&gt;
&lt;p&gt;A basic &quot;did it get kicked&quot; prototype is doable.&lt;br&gt;
A balanced, durable ball that survives real matches is properly hard.&lt;br&gt;
Budget for broken parts and broken pride.&lt;/p&gt;
&lt;h4 id=&quot;is-soldering-safe-for-beginners-&quot;&gt;Is soldering safe for beginners?&lt;/h4&gt;
&lt;p&gt;It can be, with basic care.&lt;br&gt;
Wear eye protection, keep your face out of the fume and use ventilation.&lt;br&gt;
Treat the iron like it's always hot, because it usually is.&lt;/p&gt;
&lt;h3 id=&quot;the-funeral-is-over&quot;&gt;The funeral is over&lt;/h3&gt;
&lt;p&gt;Smart ball v1 lives on in my heart.&lt;br&gt;
We still have the prototype.&lt;br&gt;
We still have the design files.&lt;/p&gt;
&lt;p&gt;I still think about the idea.&lt;br&gt;
I still watch football and think about sensors.&lt;br&gt;
Building &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.veerancup.in&quot;&gt;Veeran&lt;/a&gt; made that worse, as I explain in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/veeran-ruined-football-for-me&quot;&gt;this post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If we get funding, we'll restart from exactly where we left off.&lt;br&gt;
V2 might happen someday.&lt;br&gt;
Sports tech is the whole point of &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmytech.in&quot;&gt;TrackMy Tech&lt;/a&gt;, so never say never.&lt;/p&gt;
&lt;p&gt;Until then, I'll keep the safety glasses close.&lt;/p&gt;
&lt;p&gt;Building something in sports tech, hardware or software?&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://calendar.rahuldk.in&quot;&gt;Book a call with me&lt;/a&gt; and we can compare scars.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32518/r-i-p-smart-ball-v1-what-smart-football-sensors-taught-me</guid>
<pubDate>Tue, 27 Oct 2026 12:30:00 +0000</pubDate>
</item>
<item>
<title>Outsourcing vs building it yourself: our app arrived from 2006</title>
<link>https://coderlegion.com/32517/outsourcing-vs-building-it-yourself-our-app-arrived-from-2006</link>
<description>&lt;p&gt;Every founder has a moment where they say, &quot;Fine. I'll do it myself.&quot;&lt;br&gt;
Mine came with a very specific smell.&lt;br&gt;
The smell of PHP and a design from another decade.&lt;/p&gt;
&lt;p&gt;This post is about outsourcing app development vs building it yourself.&lt;br&gt;
I've done the first one badly and the second one stubbornly.&lt;br&gt;
So I have opinions.&lt;br&gt;
Lots of them.&lt;/p&gt;
&lt;h3 id=&quot;the-idea-was-simple&quot;&gt;The idea was simple&lt;/h3&gt;
&lt;p&gt;It started with a coach complaining.&lt;br&gt;
His students' fee payments just wouldn't tally.&lt;/p&gt;
&lt;p&gt;Small problem.&lt;br&gt;
Annoying problem.&lt;br&gt;
The kind that sticks in your head.&lt;/p&gt;
&lt;p&gt;That problem became &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt;.&lt;br&gt;
The full origin story is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/a-coach-complained-so-i-started-a-company&quot;&gt;how a coach's complaint turned into a company&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At that point, I had basically zero real coding experience.&lt;br&gt;
I'd made small, chota-chota apps.&lt;br&gt;
But I had no idea how an app actually works in production.&lt;br&gt;
Domains, servers, deployment: all a mystery.&lt;/p&gt;
&lt;p&gt;What I did have was a business mindset.&lt;br&gt;
How the product should look.&lt;br&gt;
How we'd get customers.&lt;br&gt;
How we'd get paid.&lt;br&gt;
That's it.&lt;/p&gt;
&lt;p&gt;So we did what sensible people do.&lt;br&gt;
We looked for freelancers and found an agency.&lt;br&gt;
The plan was to pay them for a white-label solution.&lt;/p&gt;
&lt;p&gt;On paper, that's textbook &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Outsourcing&quot;&gt;outsourcing&lt;/a&gt;.&lt;br&gt;
You pay an external provider to do work you'd otherwise do in-house.&lt;br&gt;
Except we didn't really have an &quot;in-house&quot;.&lt;br&gt;
We had enthusiasm.&lt;br&gt;
Enthusiasm is not a department.&lt;/p&gt;
&lt;h3 id=&quot;then-the-build-arrived&quot;&gt;Then the build arrived&lt;/h3&gt;
&lt;p&gt;I opened it.&lt;br&gt;
I looked at it.&lt;br&gt;
It looked back at me from 2006.&lt;br&gt;
It looked like it had jumped straight out of a template from that year.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-app-that-arrived-from-2006/old-crt-computer-monitor.jpg&quot; alt=&quot;An old CRT computer monitor on a desk, the kind of screen our first outsourced app seemed designed for&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@siri_louis&quot;&gt;Siri louis&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/silver-crt-computer-monitor-on-brown-wooden-desk-KdMgF5Q9EP4&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;PHP.&lt;br&gt;
A design that belonged in a museum.&lt;br&gt;
The kind of interface that makes you check your calendar.&lt;/p&gt;
&lt;p&gt;To be fair, PHP isn't the villain here.&lt;br&gt;
Plenty of good software runs on it.&lt;br&gt;
The design was the villain.&lt;br&gt;
And, probably, so was our brief.&lt;/p&gt;
&lt;p&gt;Not a single screen looked decent.&lt;br&gt;
The thing technically worked.&lt;br&gt;
But it looked so bad that nobody wanted to touch it.&lt;br&gt;
I was ashamed to show it even to my friends.&lt;br&gt;
That's how bad it was.&lt;/p&gt;
&lt;p&gt;So we scrapped the whole thing.&lt;/p&gt;
&lt;p&gt;I sat there and thought one clear thought.&lt;br&gt;
&quot;Damn. I'll do this myself.&quot;&lt;br&gt;
I'd build it with AI tools, the way people now call &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Vibe_coding&quot;&gt;vibe coding&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-stupidest-50-000-i-ve-ever-spent&quot;&gt;The stupidest ₹50,000 I've ever spent&lt;/h3&gt;
&lt;p&gt;Let me be honest about the price.&lt;br&gt;
We paid that agency ₹50,000.&lt;br&gt;
It's the stupidest way to spend 50k I can think of.&lt;/p&gt;
&lt;p&gt;And it wasn't even my money.&lt;br&gt;
It was my co-founder's.&lt;br&gt;
He didn't take it too hard.&lt;br&gt;
But I was responsible for that decision.&lt;br&gt;
I still feel bad about it, honestly.&lt;/p&gt;
&lt;h3 id=&quot;outsourcing-app-development-vs-building-it-yourself&quot;&gt;Outsourcing app development vs building it yourself&lt;/h3&gt;
&lt;p&gt;Here's my honest comparison, after one very educational PHP build.&lt;br&gt;
These are opinions, not laws of physics.&lt;/p&gt;
&lt;p&gt;Outsourcing makes sense when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You know exactly what you want, down to the screens.&lt;/li&gt;
&lt;li&gt;The app supports your business but isn't the business.&lt;/li&gt;
&lt;li&gt;Someone on your side can review the code and the design.&lt;/li&gt;
&lt;li&gt;You have budget for a second round. There's always a second round.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Building it yourself makes sense when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The product &lt;em&gt;is&lt;/em&gt; the business.&lt;/li&gt;
&lt;li&gt;You'll be changing it every week for years.&lt;/li&gt;
&lt;li&gt;You're willing to be bad at it for a while.&lt;/li&gt;
&lt;li&gt;You'd rather understand every bug than pay someone to explain it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Track My Academy was clearly the second list.&lt;br&gt;
It's the company, not a side tool.&lt;/p&gt;
&lt;p&gt;There's also a third option people forget.&lt;br&gt;
Build the first version yourself.&lt;br&gt;
Then bring in people who already understand what you're making.&lt;br&gt;
For most student founders, that's where I'd point them.&lt;/p&gt;
&lt;h3 id=&quot;how-to-write-a-product-brief-that-doesn-t-come-back-from-2006&quot;&gt;How to write a product brief that doesn't come back from 2006&lt;/h3&gt;
&lt;p&gt;Here's the thing nobody tells you.&lt;/p&gt;
&lt;p&gt;If you can't describe what good looks like, you won't get good.&lt;br&gt;
You'll get whatever the builder thinks &quot;done&quot; means.&lt;/p&gt;
&lt;p&gt;And their &quot;done&quot; might be from 2006.&lt;/p&gt;
&lt;p&gt;Bigger companies write a &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Product_requirements_document&quot;&gt;product requirements document&lt;/a&gt;.&lt;br&gt;
It says what the product should do, not how to build it.&lt;br&gt;
You don't need forty pages.&lt;br&gt;
You need one honest page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-app-that-arrived-from-2006/website-wireframe-sketch.jpg&quot; alt=&quot;A hand-drawn website wireframe sketched on paper with an orange pen, the start of a clear product brief&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@sigmund&quot;&gt;Compagnons&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/website-wireframe-sketch-on-paper-4UGmm3WRUoQ&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My checklist for a one-page product brief:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Who it's for.&lt;/strong&gt; &quot;A coach with one batch&quot; beats &quot;sports organisations&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The one painful job.&lt;/strong&gt; For us, that was attendance and payments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Three apps you like the look of.&lt;/strong&gt; Screenshots, not adjectives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What &quot;done&quot; means.&lt;/strong&gt; Which screens, which actions, which devices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What you won't build yet.&lt;/strong&gt; This list saves more money than any discount.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who checks the work.&lt;/strong&gt; If nobody can read code, say so upfront.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Point three is the one I'd underline twice.&lt;br&gt;
&quot;Modern and clean&quot; means nothing.&lt;br&gt;
Every design was modern and clean once.&lt;br&gt;
Even in 2006.&lt;/p&gt;
&lt;p&gt;The aim is a &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Minimum_viable_product&quot;&gt;minimum viable product&lt;/a&gt;.&lt;br&gt;
That means just enough features for early users to actually use it.&lt;br&gt;
Then their feedback tells you what to build next.&lt;br&gt;
Not your imagination at 2 a.m.&lt;/p&gt;
&lt;h3 id=&quot;the-first-night-of-building-a-saas-mvp-myself&quot;&gt;The first night of building a SaaS MVP myself&lt;/h3&gt;
&lt;p&gt;My setup was not exactly a startup lab.&lt;/p&gt;
&lt;p&gt;A MacBook Air.&lt;br&gt;
A second-hand iPhone my cofounder got me.&lt;br&gt;
ChatGPT.&lt;br&gt;
VS Code.&lt;/p&gt;
&lt;p&gt;That was the entire tech stack of my ambition.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-app-that-arrived-from-2006/first-workspace.jpg&quot; alt=&quot;Rahul at his first workspace with a MacBook and an iPhone, the Track My Academy goals poster behind him&quot;&gt;&lt;/p&gt;
&lt;p&gt;Did I start coding immediately?&lt;br&gt;
No.&lt;br&gt;
Mostly, I researched.&lt;/p&gt;
&lt;p&gt;How do real products look?&lt;br&gt;
How do people structure an app like this?&lt;br&gt;
Why does everything I write look worse than everything I see?&lt;/p&gt;
&lt;p&gt;By the end of it, I'd built a landing page.&lt;br&gt;
A landing page I actually liked.&lt;br&gt;
That was the night I stopped waiting for someone else.&lt;/p&gt;
&lt;p&gt;Building it properly took about three months.&lt;br&gt;
The first working version alone took more than a month and a half.&lt;br&gt;
Changes, then more changes, then changes to the changes.&lt;/p&gt;
&lt;p&gt;When I look at that first version now, I'm honestly embarrassed.&lt;br&gt;
It might be the worst thing that ever happened to a piece of software.&lt;br&gt;
The version we have today? I'm really proud of it.&lt;/p&gt;
&lt;p&gt;I learn by touching the thing until it makes sense.&lt;br&gt;
That means doing it badly first, then slightly less badly.&lt;br&gt;
The AI help came from wherever we could find it.&lt;br&gt;
That story is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/dozens-of-email-accounts-and-zero-shame&quot;&gt;dozens of email accounts and zero shame&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-modern-stack-i-ended-up-with&quot;&gt;The modern stack I ended up with&lt;/h3&gt;
&lt;p&gt;No PHP this time.&lt;br&gt;
Again, nothing against PHP.&lt;br&gt;
I just needed a fresh start and a clean conscience.&lt;/p&gt;
&lt;p&gt;Here's what Track My Academy runs on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React&lt;/strong&gt; for the web front end.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://fastapi.tiangolo.com/&quot;&gt;FastAPI&lt;/a&gt;&lt;/strong&gt;, a Python framework for building APIs with type hints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MongoDB&lt;/strong&gt;, a document database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://supabase.com/docs&quot;&gt;Supabase&lt;/a&gt;&lt;/strong&gt;, which bundles Postgres, auth, storage and realtime features.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS EC2&lt;/strong&gt; and &lt;strong&gt;Vercel&lt;/strong&gt;, where things actually run.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Razorpay&lt;/strong&gt;, the payments gateway.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firebase&lt;/strong&gt; and &lt;strong&gt;Redis&lt;/strong&gt;, quietly doing their jobs in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is exotic.&lt;br&gt;
It's just current.&lt;br&gt;
And I can explain why every piece is there.&lt;/p&gt;
&lt;p&gt;That's my real advice for anyone outsourcing.&lt;br&gt;
Ask the builder, &quot;Which stack, and why?&quot;&lt;br&gt;
If the answer is &quot;it's what we always use&quot;, that's information.&lt;br&gt;
Treat it like a yellow card.&lt;/p&gt;
&lt;p&gt;Knowing the stack also means knowing exactly how to break it.&lt;br&gt;
I proved that when &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;I took production down for hours&lt;/a&gt;.&lt;br&gt;
Ownership cuts both ways.&lt;/p&gt;
&lt;h3 id=&quot;then-i-built-the-android-and-ios-apps-too&quot;&gt;Then I built the Android and iOS apps too&lt;/h3&gt;
&lt;p&gt;The web app wasn't the end.&lt;br&gt;
Coaches aren't sitting at desks.&lt;br&gt;
They're on a pitch, holding a phone and a whistle.&lt;/p&gt;
&lt;p&gt;So I built the Android and iOS apps for Track My Academy.&lt;br&gt;
The Android app is live in production.&lt;br&gt;
The iOS app is coming soon.&lt;br&gt;
Apple reviews things slowly. So do I, to be fair.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-app-that-arrived-from-2006/android-and-iphone-apps.jpg&quot; alt=&quot;Two smartphones held up against a city skyline, one Android and one iPhone&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@rmrdnl&quot;&gt;Daniel Romero&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/two-smartphones-held-up-against-city-skyline-txROtUzmo_c&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is where building it yourself pays off.&lt;br&gt;
I'd built the backend, so I knew it inside out.&lt;br&gt;
The apps were new screens, not new mysteries.&lt;/p&gt;
&lt;p&gt;If I'd outsourced the web app, the mobile apps would've started from zero.&lt;br&gt;
Or from 2006 again.&lt;br&gt;
I'm not sure which is worse.&lt;/p&gt;
&lt;p&gt;Today &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; covers attendance, fees, player analytics and parent communication.&lt;br&gt;
Real academies run on it.&lt;br&gt;
It's multi-tenant and role-based, which is a fancy way of saying &quot;complicated&quot;.&lt;br&gt;
It works on the web and Android, with iOS coming soon.&lt;br&gt;
It's published by &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmytech.in&quot;&gt;TrackMy Tech&lt;/a&gt;, our bootstrapped sports-tech company.&lt;/p&gt;
&lt;h3 id=&quot;what-i-learned-from-the-2006-build&quot;&gt;What I learned from the 2006 build&lt;/h3&gt;
&lt;p&gt;I'm not angry at the agency that built it.&lt;br&gt;
Okay, a little.&lt;br&gt;
Mostly at myself.&lt;/p&gt;
&lt;p&gt;Outsourcing works when you know what you want.&lt;br&gt;
It doesn't work when you're hoping someone reads your mind.&lt;/p&gt;
&lt;p&gt;Building it myself meant I understood every piece.&lt;br&gt;
When something breaks, I know where to look.&lt;br&gt;
When a coach wants a feature, I know what it costs.&lt;/p&gt;
&lt;p&gt;None of that exists if I'd accepted the museum piece.&lt;/p&gt;
&lt;p&gt;So, should you build it yourself?&lt;br&gt;
Not always.&lt;br&gt;
But if what comes back makes you wince, listen to the wince.&lt;/p&gt;
&lt;p&gt;Your irritation is data.&lt;/p&gt;
&lt;p&gt;Mine turned into a company.&lt;br&gt;
Yours might turn into something too.&lt;br&gt;
Or at least into a better landing page.&lt;/p&gt;
&lt;p&gt;I'll take either.&lt;/p&gt;
&lt;h3 id=&quot;faq-5&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;is-it-cheaper-to-outsource-app-development-or-build-it-yourself-&quot;&gt;Is it cheaper to outsource app development or build it yourself?&lt;/h4&gt;
&lt;p&gt;Outsourcing usually looks cheaper on day one.&lt;br&gt;
Building yourself costs time instead of money.&lt;br&gt;
Outsourcing costs money, then often time anyway, in revisions.&lt;br&gt;
If the product is your business, I'd rather pay with time.&lt;/p&gt;
&lt;h4 id=&quot;what-should-a-product-brief-for-a-developer-include-&quot;&gt;What should a product brief for a developer include?&lt;/h4&gt;
&lt;p&gt;Who it's for and the one painful job it solves.&lt;br&gt;
Three reference apps, with screenshots.&lt;br&gt;
A clear definition of done, and a list of what's out of scope.&lt;br&gt;
And who will review the work before you pay for it.&lt;/p&gt;
&lt;h4 id=&quot;can-a-non-technical-founder-build-a-saas-mvp-&quot;&gt;Can a non-technical founder build a SaaS MVP?&lt;/h4&gt;
&lt;p&gt;I was a bio-maths student in class 12.&lt;br&gt;
That story is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/bio-maths-to-computer-science&quot;&gt;how I ended up in computer science&lt;/a&gt;.&lt;br&gt;
So yes, eventually.&lt;br&gt;
Expect to be bad at it first.&lt;br&gt;
That's the tuition fee.&lt;/p&gt;
&lt;h3 id=&quot;your-turn&quot;&gt;Your turn&lt;/h3&gt;
&lt;p&gt;Run a sports academy and tired of spreadsheets?&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Try Track My Academy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Stuck deciding between outsourcing and building it yourself?&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://calendar.rahuldk.in&quot;&gt;Book a call with me&lt;/a&gt; and we can argue about it.&lt;/p&gt;
&lt;p&gt;Or see where all this happens now, in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/three-monitors-one-monster-can&quot;&gt;my three-monitor desk setup&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32517/outsourcing-vs-building-it-yourself-our-app-arrived-from-2006</guid>
<pubDate>Tue, 27 Oct 2026 08:30:00 +0000</pubDate>
</item>
<item>
<title>A coach complained, so I built sports academy management software</title>
<link>https://coderlegion.com/32516/a-coach-complained-so-i-built-sports-academy-management-software</link>
<description>&lt;p&gt;&lt;em&gt;Cover photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@acrehuet98&quot;&gt;Adrià Crehuet Cano&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/children-playing-soccer-LIhB1_mAGhY&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Most startup stories begin with a vision.&lt;br&gt;
Mine began with a complaint.&lt;/p&gt;
&lt;p&gt;Not even my complaint.&lt;br&gt;
Two other people's.&lt;/p&gt;
&lt;p&gt;This is the story of how &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; started.&lt;br&gt;
It is sports academy management software now.&lt;br&gt;
Back then, it was one tired coach, one frustrated academy owner and a messy spreadsheet.&lt;/p&gt;
&lt;p&gt;I'm writing it down because people keep asking where the idea came from.&lt;br&gt;
The honest answer is less heroic than they hope.&lt;/p&gt;
&lt;h3 id=&quot;the-evening-it-started&quot;&gt;The evening it started&lt;/h3&gt;
&lt;p&gt;I was coaching football part-time at a sports academy.&lt;/p&gt;
&lt;p&gt;Nothing glamorous.&lt;br&gt;
Cones, whistles, and a lot of shouting about passing.&lt;/p&gt;
&lt;p&gt;One evening, I noticed a coach struggling with his phone.&lt;br&gt;
He was trying to match his students' fee payments.&lt;br&gt;
On one side, the payments in his Google Pay account.&lt;br&gt;
On the other, the manual entries he'd been writing down.&lt;br&gt;
They didn't tally.&lt;/p&gt;
&lt;p&gt;I asked the obvious question.&lt;br&gt;
&quot;Why don't you just use an Excel sheet?&quot;&lt;/p&gt;
&lt;p&gt;His answer was very honest.&lt;br&gt;
He runs everything from his phone.&lt;br&gt;
Keeping an Excel sheet updated every time just wasn't happening.&lt;/p&gt;
&lt;p&gt;The academy's owner was listening.&lt;br&gt;
He's now my co-founder, which tells you how this story ends.&lt;br&gt;
He asked me something simple.&lt;br&gt;
&quot;Why don't you build a small app for these guys?&quot;&lt;/p&gt;
&lt;p&gt;Coaches would enter their payment details.&lt;br&gt;
Everything would land in an Excel sheet automatically.&lt;br&gt;
No more tallying at night.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/a-coach-complained-so-i-started-a-company/coach-tying-young-players-boots.jpg&quot; alt=&quot;A football coach kneeling to tie a young player's boot during training&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@acrehuet98&quot;&gt;Adrià Crehuet Cano&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/man-tying-boys-shoes-on-field-yndHHu2kJAw&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-first-prototype-a-spreadsheet-pretending-to-be-an-app&quot;&gt;The first prototype: a spreadsheet pretending to be an app&lt;/h3&gt;
&lt;p&gt;So I built the simplest thing possible.&lt;br&gt;
It didn't even have a database.&lt;br&gt;
The Excel sheet was the database.&lt;br&gt;
Yes, really.&lt;/p&gt;
&lt;p&gt;The app was just a small form.&lt;br&gt;
A coach entered how much they'd received.&lt;br&gt;
They pasted the payment ID from Google Pay.&lt;br&gt;
Done.&lt;/p&gt;
&lt;p&gt;The entry dropped straight into the sheet.&lt;br&gt;
The sheet was shared automatically.&lt;br&gt;
The owner could open it any time and see everything.&lt;/p&gt;
&lt;p&gt;It was ugly. It was tiny. It worked.&lt;br&gt;
That was the very first prototype of Track My Academy.&lt;/p&gt;
&lt;h3 id=&quot;from-one-academy-to-wait-why-not-everyone-&quot;&gt;From one academy to &quot;wait, why not everyone?&quot;&lt;/h3&gt;
&lt;p&gt;Then a thought hit me.&lt;br&gt;
Hey, wait.&lt;br&gt;
Why can't I sell this to other people?&lt;/p&gt;
&lt;p&gt;Plenty of academies had exactly this problem.&lt;br&gt;
Fees tracked on paper, phones and memory.&lt;br&gt;
And player training was just as messy.&lt;br&gt;
Who attended. Who improved. Who needs more work.&lt;/p&gt;
&lt;p&gt;So the payments form grew up.&lt;br&gt;
It became sports academy management software.&lt;br&gt;
Later, it also became a sports analytics tool, in the same app.&lt;br&gt;
How the analytics got in there is a story for another post.&lt;/p&gt;
&lt;h3 id=&quot;why-sports-academy-management-software-is-a-boring-problem-worth-solving&quot;&gt;Why sports academy management software is a boring problem worth solving&lt;/h3&gt;
&lt;p&gt;Here's something nobody tells you about startups.&lt;br&gt;
The best problems are usually boring.&lt;/p&gt;
&lt;p&gt;Attendance registers. Fee reminders. Who paid. Who didn't.&lt;br&gt;
Nobody makes a film about fee reminders.&lt;/p&gt;
&lt;p&gt;But coaches deal with this every single day.&lt;br&gt;
And every hour spent on paperwork is an hour not spent coaching.&lt;/p&gt;
&lt;p&gt;That's not boring to them.&lt;br&gt;
That's their whole evening.&lt;/p&gt;
&lt;p&gt;Paul Graham has a name for why people skip these problems.&lt;br&gt;
He calls it &lt;a rel=&quot;nofollow&quot; href=&quot;https://paulgraham.com/schlep.html&quot;&gt;schlep blindness&lt;/a&gt;.&lt;br&gt;
Your brain quietly hides ideas that involve tedious work.&lt;/p&gt;
&lt;p&gt;Jared Friedman says something similar in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.ycombinator.com/library/8g-how-to-get-startup-ideas&quot;&gt;YC's talk on getting startup ideas&lt;/a&gt;.&lt;br&gt;
His example is Gusto, which makes payroll software.&lt;br&gt;
Lots of programmers knew payroll software was bad.&lt;br&gt;
Nobody fixed it, because it was boring.&lt;/p&gt;
&lt;p&gt;Sports admin is the same flavour of boring.&lt;br&gt;
Which, in my opinion, is exactly why it was worth doing.&lt;/p&gt;
&lt;h3 id=&quot;attendance-tracking-for-sports-academies&quot;&gt;Attendance tracking for sports academies&lt;/h3&gt;
&lt;p&gt;Let's start with the original villain.&lt;/p&gt;
&lt;p&gt;Attendance tracking for sports academies sounds trivial.&lt;br&gt;
It is not.&lt;/p&gt;
&lt;p&gt;Batches change.&lt;br&gt;
Kids switch timings.&lt;br&gt;
Some coaches cover two branches.&lt;br&gt;
Somebody always forgets the register at home.&lt;/p&gt;
&lt;p&gt;Paper works until it doesn't.&lt;br&gt;
Then you're reconstructing last month from memory and a WhatsApp group.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/a-coach-complained-so-i-started-a-company/handwritten-attendance-notes.jpg&quot; alt=&quot;A person writing notes on a sheet of paper at a desk&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@kobilly&quot;&gt;Billy Albert&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/a-person-writing-on-a-piece-of-paper-5lNKe_pE3oA&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In Track My Academy, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com/#features&quot;&gt;attendance&lt;/a&gt; is the boring core.&lt;br&gt;
Check-in can be by QR code, biometric or the mobile app.&lt;br&gt;
Coaches get alerts when someone is absent.&lt;/p&gt;
&lt;p&gt;That last bit matters more than it sounds.&lt;br&gt;
A missed session is a small signal.&lt;br&gt;
Three missed sessions is a conversation with a parent.&lt;/p&gt;
&lt;h3 id=&quot;fee-collection-and-reminders-without-the-awkwardness&quot;&gt;Fee collection and reminders without the awkwardness&lt;/h3&gt;
&lt;p&gt;Then there's money.&lt;/p&gt;
&lt;p&gt;Nobody likes chasing fees.&lt;br&gt;
Coaches especially hate it.&lt;br&gt;
They signed up to teach a sport, not run accounts receivable.&lt;/p&gt;
&lt;p&gt;So the software handles fee collection and reminders.&lt;br&gt;
Invoices go out.&lt;br&gt;
Reminders go out.&lt;br&gt;
Payments get recorded.&lt;/p&gt;
&lt;p&gt;The coach doesn't have to be the bad guy at the gate.&lt;br&gt;
The system can be the bad guy.&lt;br&gt;
Systems don't mind.&lt;/p&gt;
&lt;p&gt;The stack includes React, FastAPI, MongoDB, Supabase and Razorpay.&lt;br&gt;
Plus a few friends I won't list here.&lt;br&gt;
I'll spare you the architecture diagram.&lt;/p&gt;
&lt;h3 id=&quot;player-progress-tracking-and-parent-communication&quot;&gt;Player progress tracking and parent communication&lt;/h3&gt;
&lt;p&gt;Attendance and fees were the complaint.&lt;br&gt;
But once the data was in one place, more became possible.&lt;/p&gt;
&lt;p&gt;Player progress tracking was the obvious next step.&lt;br&gt;
Coaches can log performance and see trends over time.&lt;br&gt;
Pace, endurance, accuracy, skill.&lt;/p&gt;
&lt;p&gt;Parents can see shareable player reports on their phone.&lt;br&gt;
Which, frankly, saves a lot of &quot;so how is he doing?&quot; chats after training.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/a-coach-complained-so-i-started-a-company/checking-phone-outdoors.jpg&quot; alt=&quot;A hand holding a smartphone showing notifications on the lock screen&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@jamie452&quot;&gt;Jamie Street&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/person-holding-phone-33oxtOMk6Ac&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Parent communication lives there too.&lt;br&gt;
Announcements, session updates and direct messages.&lt;br&gt;
No more screenshotting the timetable into six groups.&lt;/p&gt;
&lt;p&gt;It's a &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Software_as_a_service&quot;&gt;software as a service&lt;/a&gt; product.&lt;br&gt;
The academy doesn't host anything.&lt;br&gt;
It just logs in.&lt;/p&gt;
&lt;p&gt;It's also &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Multitenancy&quot;&gt;multi-tenant&lt;/a&gt;.&lt;br&gt;
Many academies can share one system, each with separate data.&lt;/p&gt;
&lt;p&gt;And it uses &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Role-based_access_control&quot;&gt;role-based access control&lt;/a&gt;.&lt;br&gt;
Owners, coaches and parents each see what their role allows.&lt;br&gt;
A parent should not be able to edit the fee ledger.&lt;br&gt;
Tempting as that might be for them.&lt;/p&gt;
&lt;p&gt;There's a web app and an Android app.&lt;br&gt;
The iOS app is coming soon.&lt;br&gt;
I built the mobile apps myself.&lt;br&gt;
That sentence is doing a lot of heavy lifting.&lt;/p&gt;
&lt;p&gt;And real academies run on it.&lt;br&gt;
That part still feels slightly unreal.&lt;/p&gt;
&lt;h3 id=&quot;from-a-2006-looking-app-to-building-it-myself&quot;&gt;From a 2006-looking app to building it myself&lt;/h3&gt;
&lt;p&gt;The road there was not straight.&lt;/p&gt;
&lt;p&gt;For the full product, we first hired someone to build it.&lt;br&gt;
What came back was PHP, terrible design, and looked like 2006.&lt;br&gt;
I wrote about &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-app-that-arrived-from-2006&quot;&gt;the app that arrived from 2006&lt;/a&gt; separately.&lt;br&gt;
It is a whole saga.&lt;/p&gt;
&lt;p&gt;So I decided to build it myself.&lt;/p&gt;
&lt;p&gt;The first night was a MacBook Air.&lt;br&gt;
A second-hand iPhone my cofounder got me.&lt;br&gt;
ChatGPT and VS Code.&lt;/p&gt;
&lt;p&gt;Mostly research.&lt;br&gt;
Then a landing page I actually liked.&lt;/p&gt;
&lt;p&gt;I learn by touching the thing until it makes sense.&lt;br&gt;
Usually by doing it badly first.&lt;/p&gt;
&lt;p&gt;Later came the less glamorous lessons.&lt;br&gt;
Like hunting free AI trials across &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/dozens-of-email-accounts-and-zero-shame&quot;&gt;dozens of email accounts&lt;/a&gt;.&lt;br&gt;
And &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-night-i-broke-production&quot;&gt;the night I broke production&lt;/a&gt; by splitting the backend.&lt;/p&gt;
&lt;h3 id=&quot;trackmy-tech-cp-sports-and-the-titles-i-didn-t-expect&quot;&gt;TrackMy Tech, CP Sports, and the titles I didn't expect&lt;/h3&gt;
&lt;p&gt;Track My Academy started in December 2024.&lt;/p&gt;
&lt;p&gt;Since June 2026, it has a proper home.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmytech.in&quot;&gt;TrackMy Tech Pvt Ltd&lt;/a&gt; is the sports-tech and SaaS company that publishes it.&lt;br&gt;
It's bootstrapped.&lt;br&gt;
I'm its Executive Director.&lt;/p&gt;
&lt;p&gt;Which still sounds funny to me.&lt;br&gt;
I'm also a student.&lt;br&gt;
The exams have not been informed of my title.&lt;br&gt;
More on that in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/exams-the-office-and-a-1am-gate&quot;&gt;exams, the office and a 1 a.m. gate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Separately, I'm Technical Operations Manager at CP Sports.&lt;br&gt;
I built its first official website and internal academy and event tools.&lt;br&gt;
I also manage the digital team and coordinate coaches across branches.&lt;/p&gt;
&lt;p&gt;That job keeps me close to how academies actually run.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/veeran-ruined-football-for-me&quot;&gt;Veeran&lt;/a&gt; came later, built at TrackMy Tech.&lt;/p&gt;
&lt;h3 id=&quot;what-coaching-taught-me-about-building&quot;&gt;What coaching taught me about building&lt;/h3&gt;
&lt;p&gt;Coaching and building products are weirdly similar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can't redo the first half.&lt;/strong&gt;&lt;br&gt;
Football has twenty-two players, ninety minutes, and no undo button.&lt;br&gt;
Production software feels exactly the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Listen more than you talk.&lt;/strong&gt;&lt;br&gt;
That coach didn't pitch me a startup idea.&lt;br&gt;
He just couldn't make his payments tally.&lt;br&gt;
The idea was hiding inside the complaint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix what people actually do.&lt;/strong&gt;&lt;br&gt;
Coaches don't want dashboards for fun.&lt;br&gt;
They want to finish admin and get back to the pitch.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/a-coach-complained-so-i-started-a-company/football-on-training-pitch.jpg&quot; alt=&quot;A football resting on the grass of a training pitch under a player's boot&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@concoyne&quot;&gt;Connor Coyne&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/white-and-blue-soccer-ball-on-green-grass-field-OgqWLzWRSaI&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;finding-startup-ideas-in-real-complaints&quot;&gt;Finding startup ideas in real complaints&lt;/h3&gt;
&lt;p&gt;Stop looking for big ideas.&lt;/p&gt;
&lt;p&gt;Paul Graham puts it neatly in &lt;a rel=&quot;nofollow&quot; href=&quot;https://paulgraham.com/startupideas.html&quot;&gt;How to Get Startup Ideas&lt;/a&gt;.&lt;br&gt;
The verb you want is not &quot;think up&quot;.&lt;br&gt;
It's &quot;notice&quot;.&lt;/p&gt;
&lt;p&gt;Go and sit near people doing their actual jobs.&lt;br&gt;
Wait for them to complain.&lt;/p&gt;
&lt;p&gt;Write down the complaint.&lt;/p&gt;
&lt;p&gt;Then ask a few annoying questions.&lt;br&gt;
How often does this happen?&lt;br&gt;
What do you do about it now?&lt;br&gt;
Would you pay to never deal with it again?&lt;/p&gt;
&lt;p&gt;If the answers are &quot;daily&quot;, &quot;a spreadsheet&quot; and &quot;yes&quot;, congratulations.&lt;br&gt;
You may have a company.&lt;/p&gt;
&lt;p&gt;It won't sound exciting at a party.&lt;br&gt;
It will sound very exciting to the person who has that problem.&lt;/p&gt;
&lt;p&gt;And honestly? Parties are overrated anyway.&lt;br&gt;
I'd rather be at the office.&lt;/p&gt;
&lt;p&gt;Which is probably a problem of its own.&lt;/p&gt;
&lt;h3 id=&quot;faq-6&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;what-is-sports-academy-management-software-&quot;&gt;What is sports academy management software?&lt;/h4&gt;
&lt;p&gt;It's software that runs the admin side of a sports academy.&lt;br&gt;
Attendance, fees, player progress and parent messages, in one place.&lt;br&gt;
Ideally, so the coach can go back to coaching.&lt;/p&gt;
&lt;h4 id=&quot;does-track-my-academy-work-on-phones-&quot;&gt;Does Track My Academy work on phones?&lt;/h4&gt;
&lt;p&gt;Yes.&lt;br&gt;
There's a web app and an Android app, and the iOS app is coming soon.&lt;br&gt;
Coaches and parents mostly live on their phones anyway.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-find-a-startup-idea-&quot;&gt;How do I find a startup idea?&lt;/h4&gt;
&lt;p&gt;Notice problems instead of inventing them.&lt;br&gt;
Boring, repeated, slightly embarrassing problems are the best ones.&lt;br&gt;
Then check whether people would actually pay to make them go away.&lt;/p&gt;
&lt;h3 id=&quot;try-it-or-talk-to-me&quot;&gt;Try it, or talk to me&lt;/h3&gt;
&lt;p&gt;If you run an academy, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;take a look at Track My Academy&lt;/a&gt;.&lt;br&gt;
There's a free plan, so the risk is mostly your time.&lt;/p&gt;
&lt;p&gt;If you'd rather talk it through, &lt;a rel=&quot;nofollow&quot; href=&quot;https://calendar.rahuldk.in&quot;&gt;book a call with me&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Or read how the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/rip-smart-ball-v1&quot;&gt;smart football prototype&lt;/a&gt; went.&lt;br&gt;
Spoiler: it's in the title.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32516/a-coach-complained-so-i-built-sports-academy-management-software</guid>
<pubDate>Tue, 27 Oct 2026 04:30:00 +0000</pubDate>
</item>
<item>
<title>Production outage lessons: we blamed our code. It was SSL.</title>
<link>https://coderlegion.com/32504/production-outage-lessons-we-blamed-our-code-it-was-ssl</link>
<description>&lt;p&gt;Building a product is one job.&lt;br&gt;
Keeping it alive is a completely different job.&lt;/p&gt;
&lt;p&gt;Nobody warns you about the second one.&lt;br&gt;
Or they do, and you don't listen.&lt;br&gt;
I didn't listen.&lt;/p&gt;
&lt;p&gt;This post is my production outage lessons, learnt the expensive way.&lt;br&gt;
One backend split, one expired SSL certificate, four hours of blaming the wrong thing.&lt;br&gt;
And what I'd do differently: checklists, rollbacks, monitoring and postmortems.&lt;/p&gt;
&lt;h3 id=&quot;the-clever-idea-splitting-the-backend&quot;&gt;The clever idea: splitting the backend&lt;/h3&gt;
&lt;p&gt;This happened in 2026, not long after we incorporated TrackMy Tech.&lt;br&gt;
We'd just become a private limited company.&lt;br&gt;
And we had a nagging feeling we weren't doing things professionally enough.&lt;br&gt;
We wanted to fix that.&lt;/p&gt;
&lt;p&gt;We also had real problems.&lt;br&gt;
Lots of payment-related issues.&lt;br&gt;
A steady stream of API errors.&lt;br&gt;
And the load wasn't balancing well.&lt;/p&gt;
&lt;p&gt;Then an Instagram reel showed up.&lt;br&gt;
I shared it with the team.&lt;br&gt;
&quot;This model is so capable. We can try some serious stuff with it.&quot;&lt;br&gt;
That one reel kicked off the whole cycle.&lt;/p&gt;
&lt;p&gt;The plan: split the backend into separate pieces.&lt;br&gt;
We used an AI coding agent to do the heavy lifting.&lt;br&gt;
To be fair to the agent, it did its job.&lt;br&gt;
It was us who got things wrong.&lt;/p&gt;
&lt;p&gt;On paper, splitting load sounds smart.&lt;br&gt;
Spread the work. Feel like a real engineering team.&lt;br&gt;
Put &quot;distributed&quot; in your head and feel tall.&lt;/p&gt;
&lt;h3 id=&quot;then-everything-went-down&quot;&gt;Then everything went down&lt;/h3&gt;
&lt;p&gt;Not slowly. Not politely.&lt;br&gt;
Everything went down.&lt;br&gt;
For hours.&lt;/p&gt;
&lt;p&gt;If you've never broken production, let me describe the feeling.&lt;br&gt;
Your stomach drops to somewhere near your shoes.&lt;br&gt;
Every message notification sounds like an accusation.&lt;/p&gt;
&lt;p&gt;Real academies use &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt;.&lt;br&gt;
Real coaches. Real parents. Real attendance.&lt;/p&gt;
&lt;p&gt;None of them care about our clever architecture.&lt;br&gt;
They care that the app works.&lt;/p&gt;
&lt;p&gt;And it did not work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-night-i-broke-production/server-room-network-cabinets.jpg&quot; alt=&quot;A server room with rows of network cabinets under blue cables&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@tvick&quot;&gt;Taylor Vick&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/server-room-with-network-cabinets-aWslrFhs1w4&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-real-culprit-an-expired-ssl-certificate&quot;&gt;The real culprit: an expired SSL certificate&lt;/h3&gt;
&lt;p&gt;We were sure we'd broken the code.&lt;br&gt;
So we did what any panicking team does.&lt;br&gt;
We checked the split.&lt;br&gt;
We checked the code.&lt;br&gt;
Then we checked it all again.&lt;/p&gt;
&lt;p&gt;About four hours later, we found it.&lt;br&gt;
It wasn't the code at all.&lt;br&gt;
The SSL certificate on our backend domain had expired.&lt;br&gt;
Right in the middle of the transition.&lt;/p&gt;
&lt;p&gt;It was failing silently.&lt;br&gt;
And we were busy blaming our own clever architecture.&lt;/p&gt;
&lt;p&gt;When we finally saw it, we just stared at the screen.&lt;br&gt;
Oh God.&lt;br&gt;
This is why debugging is hard.&lt;/p&gt;
&lt;p&gt;Here's why it's so sneaky.&lt;br&gt;
A &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Public_key_certificate&quot;&gt;TLS certificate&lt;/a&gt; proves a server is who it claims to be.&lt;br&gt;
Every certificate has a &quot;Not After&quot; date.&lt;br&gt;
After that date, it's simply no longer valid.&lt;br&gt;
Apps and browsers stop trusting the server, and requests fail.&lt;/p&gt;
&lt;p&gt;Short certificate lifetimes are normal now.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://letsencrypt.org/docs/faq/&quot;&gt;Let's Encrypt says&lt;/a&gt; its default certificates are valid for 90 days.&lt;br&gt;
It recommends renewing them every 60 days.&lt;br&gt;
Miss a renewal and the clock just quietly runs out.&lt;/p&gt;
&lt;p&gt;The timing is what fooled us.&lt;br&gt;
Two things changed at once: our backend, and the certificate's validity.&lt;br&gt;
So naturally we blamed the change we'd made ourselves.&lt;/p&gt;
&lt;p&gt;Google's &lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/introduction/&quot;&gt;SRE book&lt;/a&gt; says roughly 70% of outages come from changes to a live system.&lt;br&gt;
We were the change.&lt;br&gt;
We just weren't the cause.&lt;/p&gt;
&lt;h3 id=&quot;the-longest-night-in-the-office&quot;&gt;The longest night in the office&lt;/h3&gt;
&lt;p&gt;I stayed in the office all night.&lt;/p&gt;
&lt;p&gt;Not because it looks dedicated on LinkedIn.&lt;br&gt;
Because it was my mess, and I wanted it fixed.&lt;/p&gt;
&lt;p&gt;There's a special kind of quiet in an office at 3 a.m.&lt;br&gt;
It's just you, the monitors, and your mistakes.&lt;/p&gt;
&lt;p&gt;The Monster cans on the wall were not decoration that night.&lt;br&gt;
They were fuel.&lt;br&gt;
(The full tour of that desk is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/three-monitors-one-monster-can&quot;&gt;three monitors, one Monster can&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Office nights are not rare for me, sadly.&lt;br&gt;
That's a whole other post: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/exams-the-office-and-a-1am-gate&quot;&gt;exams, the office and a 1 a.m. gate&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;when-i-m-stuck-badly-enough-i-call-arun&quot;&gt;When I'm stuck badly enough, I call Arun&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-night-i-broke-production/arun.jpg&quot; alt=&quot;Arun, our CTO, smiling at the camera&quot;&gt;&lt;/p&gt;
&lt;p&gt;Every founder needs one person who picks up at any hour.&lt;br&gt;
For me, that's Arun. Our CTO.&lt;/p&gt;
&lt;p&gt;No questions asked. He just picks up.&lt;br&gt;
At any hour. Which is frankly suspicious.&lt;/p&gt;
&lt;p&gt;If you want to know who he is, here's &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.arunvignesh.my/&quot;&gt;his portfolio&lt;/a&gt;.&lt;br&gt;
He's the reason &quot;stuck&quot; never becomes &quot;stuck forever&quot;.&lt;/p&gt;
&lt;p&gt;The lesson here isn't technical.&lt;br&gt;
Know who you'll call before the crisis, not during it.&lt;/p&gt;
&lt;h3 id=&quot;a-deployment-checklist-i-d-hand-my-past-self&quot;&gt;A deployment checklist I'd hand my past self&lt;/h3&gt;
&lt;p&gt;I'm not going to pretend I have a grand theory.&lt;br&gt;
But here's the checklist that night burned into my brain.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check the boring stuff first.&lt;/strong&gt; SSL certificates, DNS, environment variables. Then blame the code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Know when every certificate expires.&lt;/strong&gt; Write the dates down before you touch anything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change one big thing at a time.&lt;/strong&gt; Two changes, one failure, endless guessing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy when people are awake.&lt;/strong&gt; Ideally the people who can fix it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Know your way back.&lt;/strong&gt; Before you ship, not after.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch it after you ship.&lt;/strong&gt; &quot;Deployed&quot; is not the same as &quot;working&quot;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Google's SRE book lists three practices for safer changes.&lt;br&gt;
Progressive rollouts.&lt;br&gt;
Quickly and accurately detecting problems.&lt;br&gt;
Rolling back safely when problems arise.&lt;/p&gt;
&lt;p&gt;That's basically my checklist, written by people with far more sleep.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-night-i-broke-production/deployment-checklist-notebook.jpg&quot; alt=&quot;A hand ticking items off a deployment checklist in a notebook&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@jakubzerdzicki&quot;&gt;Jakub Żerdzicki&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/hand-checking-off-items-on-a-to-do-list-fXlL5I0IvK0&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;rollbacks-have-a-way-back&quot;&gt;Rollbacks: have a way back&lt;/h3&gt;
&lt;p&gt;If you can't undo a change quickly, you're not deploying.&lt;br&gt;
You're gambling.&lt;/p&gt;
&lt;p&gt;One classic pattern is &lt;a rel=&quot;nofollow&quot; href=&quot;https://martinfowler.com/bliki/BlueGreenDeployment.html&quot;&gt;blue-green deployment&lt;/a&gt;, as Martin Fowler describes it.&lt;br&gt;
You keep two nearly identical production environments.&lt;br&gt;
One is live. The other gets the new version.&lt;br&gt;
You test the idle one, then switch the router over.&lt;/p&gt;
&lt;p&gt;If it breaks, you switch the router back.&lt;br&gt;
Fowler calls it &quot;a rapid way to rollback&quot;.&lt;/p&gt;
&lt;p&gt;You don't need a fancy setup to steal the idea.&lt;br&gt;
Keep the old config. Keep the old build.&lt;br&gt;
Know the exact command that puts things back.&lt;br&gt;
Practise it once on a calm day.&lt;/p&gt;
&lt;h3 id=&quot;monitoring-and-alerting-find-out-before-your-users-do&quot;&gt;Monitoring and alerting: find out before your users do&lt;/h3&gt;
&lt;p&gt;The worst way to discover an outage is from a user.&lt;br&gt;
The second worst is from a friend asking &quot;is your app down?&quot;&lt;/p&gt;
&lt;p&gt;The Google SRE chapter on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/monitoring-distributed-systems/&quot;&gt;monitoring distributed systems&lt;/a&gt; is a good start.&lt;br&gt;
It names four golden signals: latency, traffic, errors and saturation.&lt;br&gt;
Measure those and page a human when they look wrong.&lt;br&gt;
I'd add one more for small teams: certificate expiry dates.&lt;br&gt;
That gets you decently covered, according to the book.&lt;/p&gt;
&lt;p&gt;It also says something I love: &quot;Every page should be actionable.&quot;&lt;br&gt;
An alert you ignore is just a very expensive ringtone.&lt;/p&gt;
&lt;p&gt;Later, I built a &quot;Pager System&quot; for Track My Academy developers.&lt;br&gt;
It's an internal real-time error and notification system.&lt;br&gt;
The idea is simple: problems should find developers, not wait to be found.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.rahuldk.in/posts/the-night-i-broke-production/monitoring-dashboard-graphs.jpg&quot; alt=&quot;A laptop showing monitoring dashboard graphs for latency and traffic&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/@lukechesser&quot;&gt;Luke Chesser&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; href=&quot;https://unsplash.com/photos/graphs-of-performance-analytics-on-a-laptop-screen-JKUTrJ4vK00&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;write-the-postmortem-and-keep-it-blameless&quot;&gt;Write the postmortem, and keep it blameless&lt;/h3&gt;
&lt;p&gt;After the fix, the temptation is to sleep and never speak of it again.&lt;br&gt;
Don't.&lt;/p&gt;
&lt;p&gt;Write an incident postmortem.&lt;br&gt;
Google's chapter on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/postmortem-culture/&quot;&gt;postmortem culture&lt;/a&gt; puts it nicely.&lt;br&gt;
&quot;Writing a postmortem is not punishment.&quot;&lt;br&gt;
It's a learning opportunity for the whole company.&lt;/p&gt;
&lt;p&gt;Their triggers include user-visible downtime and an engineer having to roll back.&lt;br&gt;
A multi-hour outage ticks both boxes with enthusiasm.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.atlassian.com/incident-management/postmortem&quot;&gt;Atlassian's guide to incident postmortems&lt;/a&gt; is very practical.&lt;br&gt;
It covers a timeline, root cause, impact, metrics and action items.&lt;br&gt;
It suggests a review meeting within 24 to 48 hours of resolution.&lt;br&gt;
Then draft the write-up straight after.&lt;br&gt;
Wait longer and the details evaporate.&lt;/p&gt;
&lt;p&gt;Blameless doesn't mean nobody made a mistake.&lt;br&gt;
It means you fix the system so the next person can't make it.&lt;br&gt;
Even if the next person is, once again, me.&lt;/p&gt;
&lt;h3 id=&quot;was-it-worth-it-&quot;&gt;Was it worth it?&lt;/h3&gt;
&lt;p&gt;Honestly? Yes.&lt;br&gt;
Not the outage. The outage was terrible.&lt;br&gt;
But I learned more in that one night than in a month of tutorials.&lt;/p&gt;
&lt;p&gt;Mistakes are expensive teachers.&lt;br&gt;
They're also very, very memorable.&lt;/p&gt;
&lt;p&gt;I'd still prefer the tutorials, though.&lt;/p&gt;
&lt;h3 id=&quot;faq-7&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;what-are-the-most-important-production-outage-lessons-for-a-small-team-&quot;&gt;What are the most important production outage lessons for a small team?&lt;/h4&gt;
&lt;p&gt;Change one thing at a time.&lt;br&gt;
Always have a tested way back.&lt;br&gt;
Monitor the basics so you hear about problems before users do.&lt;/p&gt;
&lt;h4 id=&quot;can-an-expired-ssl-certificate-take-down-a-backend-&quot;&gt;Can an expired SSL certificate take down a backend?&lt;/h4&gt;
&lt;p&gt;Yes, and quietly.&lt;br&gt;
Once a certificate passes its expiry date, clients stop trusting the server.&lt;br&gt;
Requests fail, and it can look exactly like a code bug.&lt;/p&gt;
&lt;h4 id=&quot;what-should-go-in-an-incident-postmortem-&quot;&gt;What should go in an incident postmortem?&lt;/h4&gt;
&lt;p&gt;A timeline, the impact, the root cause and clear action items.&lt;br&gt;
Keep it blameless.&lt;br&gt;
Fix the system, not the person.&lt;/p&gt;
&lt;h3 id=&quot;sources-3&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/introduction/&quot;&gt;Google SRE book: Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/monitoring-distributed-systems/&quot;&gt;Google SRE book: Monitoring distributed systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://sre.google/sre-book/postmortem-culture/&quot;&gt;Google SRE book: Postmortem culture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.atlassian.com/incident-management/postmortem&quot;&gt;Atlassian: Incident postmortems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://martinfowler.com/bliki/BlueGreenDeployment.html&quot;&gt;Martin Fowler: Blue-green deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Public_key_certificate&quot;&gt;Wikipedia: Public key certificate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://letsencrypt.org/docs/faq/&quot;&gt;Let's Encrypt FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-next-3&quot;&gt;What next&lt;/h3&gt;
&lt;p&gt;Curious how the product got built in the first place? Read &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/the-app-that-arrived-from-2006&quot;&gt;the app that arrived from 2006&lt;/a&gt;.&lt;br&gt;
Or how I learned the tools: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rahuldk.in/blog/dozens-of-email-accounts-and-zero-shame&quot;&gt;dozens of email accounts and zero shame&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Running an academy? &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmyacademy.com&quot;&gt;Track My Academy&lt;/a&gt; handles attendance, fees, player analytics and parent communication.&lt;br&gt;
It's built by &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.trackmytech.in&quot;&gt;TrackMy Tech&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Want to talk shipping, breaking and fixing things? &lt;a rel=&quot;nofollow&quot; href=&quot;https://calendar.rahuldk.in&quot;&gt;Book a call&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32504/production-outage-lessons-we-blamed-our-code-it-was-ssl</guid>
<pubDate>Mon, 26 Oct 2026 12:01:40 +0000</pubDate>
</item>
<item>
<title>You’re Losing Money. Your Instinct Says Cut. Your Instinct Is Frequently, Precisely Wrong.</title>
<link>https://coderlegion.com/32150/youre-losing-money-your-instinct-says-cut-your-instinct-is-frequently-precisely-wrong</link>
<description>&lt;p&gt;Part 4 of 4 on IBR's Mini Strategy Handbook for AI Founders. The last review is a five-minute finance lens that would have saved a lot of businesses I've watched shrink themselves to death.&lt;/p&gt;
&lt;p&gt;Here’s the situation the handbook closes on, and if you’ve run anything, you’ve lived it. Revenue has plateaued. Every month closes red. You do the responsible thing: cut marketing, freeze hiring, trim every discretionary line. And the loss… doesn’t move. Or deepens. So you cut again, more responsibly, and it deepens again, and at some point somebody says the word “shut” in a meeting.&lt;/p&gt;
&lt;p&gt;Vivek Bisht’s The Contribution Factor argues that a lot of these businesses aren’t broken. They’re sub-scale, and every “responsible” cut makes them smaller and therefore worse. The tool that tells the two apart is one subtraction.&lt;/p&gt;
&lt;p&gt;The formula, and where your next order actually goes&lt;br&gt;
Contribution Factor = Price − Variable Cost per Order. It’s what’s left from each sale after paying the costs of making that sale, and it “contributes” toward the fixed costs, rent, salaries, software, until those are covered, after which every further order is profit.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=13468191846618146727&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;That’s genuinely the whole thing. But the diagnostic power comes from what the sign and scale of the number tell you to do, and it’s here that most founders’ instincts fail.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=18408696646060151081&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Negative: every sale loses money, scaling makes it worse, fix unit economics before anything else. Positive but low volume: the model works, you’re just too small to cover the cost base, so spend more, not less, and grow into it. Positive and covering fixed costs: you’ve crossed break-even; defend margins, reinvest selectively. The middle row is where a startling number of “failing” businesses actually live, and it’s exactly the row where cutting kills you.&lt;/p&gt;
&lt;p&gt;The death spiral, and its reversal&lt;br&gt;
The handbook’s case is Treya Gifts, an Indian DTC brand selling STEM toys for kids. Loyal customers, strong reviews, eighteen months of plateau and monthly losses, and the founders were doing the textbook thing: slashing marketing, freezing spend, trimming everything variable. Each round of cuts was followed by a proportionate drop in orders, and the losses persisted, because the same fixed costs were now spread across fewer orders. Every cut was defensible. The loop was fatal.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=3915576684217240107&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;IBR rebuilt the P&amp;amp;L per order and the contribution factor came back clearly positive, about 33% of revenue. Treya wasn’t selling at a loss. It was sub-scale. So the recommendation was the opposite of every instinct in the room: increase marketing until volume comfortably cleared the fixed-cost barrier, with guardrails, cap cost-per-order below the contribution margin so every incremental order stayed profitable, shift toward channels with clean per-order attribution so you can watch the number live, and freeze fixed costs, no hires, no warehouse, until volume stabilized. Twelve weeks later: orders up 180%, contribution factor steady at 33%, fixed costs up 8%, and the business moved from monthly loss to monthly profit. Not by cutting. By spending more on the one line that was working.&lt;/p&gt;
&lt;p&gt;Where I’d argue with a word: “responsible”&lt;br&gt;
My quibble this time isn’t with the framework, it’s with the vocabulary founders use around it. Cutting costs when you see red ink is described, universally, as “responsible,” and spending more as “reckless.” The contribution lens shows the labels are backwards for a specific, common case. When each order is profitable and you don’t have enough of them, cutting the thing that produces orders is the reckless move dressed as prudence. It feels responsible because it’s painful and it’s what your board expects. Pain is not a signal of correctness. Ask Part 3.&lt;/p&gt;
&lt;p&gt;The handbook flags the misclassification that causes most of this, and it’s the single most useful sentence in the review: performance marketing is a variable cost, not fixed overhead. File it under overhead and you will cut it at exactly the moment you should be doubling it.&lt;/p&gt;
&lt;p&gt;The AI-startup edition, which the handbook leaves for us&lt;br&gt;
The Treya case is e-commerce; the handbook is for AI founders. So let me draw the translation, because AI businesses have a variable-cost line that didn’t exist five years ago and that founders routinely misfile.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=12164534771892501573&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Inference tokens per job are variable. So are third-party API calls, human-review minutes, and payment fees. Salaries, cloud baseline, SaaS seats and the model you fine-tuned once are fixed. Which means an AI product can have a negative contribution factor while looking healthy on gross margin slides, if each job burns more tokens than the price covers, and it can be positive-but-sub-scale while looking doomed, if you’ve been treating the ads that bring jobs as overhead. Run the per-job P&amp;amp;L. Put the token bill in the variable column where it belongs. Then read the number and decide, from the table above, not from your stomach.&lt;/p&gt;
&lt;p&gt;One more AI-specific wrinkle: token prices fall. A negative contribution factor today may be positive in two quarters with no change on your side, which is the only case I know where “wait” is a legitimate unit-economics strategy. Note it, date it, and don’t confuse it with the sub-scale case, which waiting only worsens.&lt;/p&gt;
&lt;p&gt;Closing the series&lt;br&gt;
Four reviews, one arc. Launch wide and win by what you cut. Distribute through a specific person with a specific scar, because polish is free now. Read every signal by what it cost the customer to send. And when the numbers still come back red, decide (this one) with one subtraction whether you’re broken or merely small, because the fixes are opposites and the instinct usually picks the wrong one.&lt;/p&gt;
&lt;p&gt;What I like about the handbook, beyond the frameworks, is the through-line I keep meeting everywhere this year: the cheap things, building, polish, attention got cheaper (for more on this, read this small book) and the expensive things, judgment about what to cut, a checkable point of view, a customer’s costly commitment, the discipline to read a number instead of a feeling, got scarcer. IBR’s own tagline says it better than I can: judgment is scarce, execution is abundant.&lt;/p&gt;
&lt;p&gt;Which is a strategy handbook’s way of saying what my last four articles said about AI. Nice to know the founders and the models are learning the same lesson.&lt;/p&gt;
&lt;p&gt;-Hardik&lt;/p&gt;
&lt;p&gt;I’ve spent about two decades building data and AI systems, and enough time around P&amp;amp;Ls to have watched good businesses cut themselves into the ground while calling it discipline. This closes my four-part walk through IBR’s handbook. If it was useful, the original is free at ikanabusinessreview.com and worth your subscription; and if you missed Parts 1–3, they’re the launch, the distribution, and the signal you’ll need before this one applies. Subscribe here too, obviously; my contribution factor per reader is positive and I’m merely sub-scale.&lt;/p&gt;
&lt;p&gt;Series map: Part 1 · The Inverted Launch → Part 2 · The Founder Is the Channel → Part 3 · The Signal Cost Principle → Part 4 · The Contribution Factor (this).&lt;/p&gt;
&lt;p&gt;Source: Ikana Business Review, Mini Strategy Handbook for AI Founders (August 2026), Review 04, “The Contribution Factor” by Vivek Bisht, including the formula, the decision table, and the Treya Gifts case (+180% orders, 33% contribution factor held, +8% fixed costs, loss to profit in twelve weeks); full case at ikanabusinessreview.com. The “responsible” argument, the AI-startup variable-cost translation, and the falling-token-price wrinkle are mine.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32150/youre-losing-money-your-instinct-says-cut-your-instinct-is-frequently-precisely-wrong</guid>
<pubDate>Fri, 23 Oct 2026 05:55:33 +0000</pubDate>
</item>
<item>
<title>Can One Developer Beat Big Tech? Sideways, Yes.</title>
<link>https://coderlegion.com/31457/can-one-developer-beat-big-tech-sideways-yes</link>
<description>&lt;p&gt;Let me start with a confession. Bitly's cheapest plan with a custom domain was listed at around $29 a month. I looked at my wallet. My wallet looked back with concern.&lt;/p&gt;
&lt;p&gt;So I did what any reasonable developer does when the price is too high: I built my own. That's how &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech&quot;&gt;Fewly&lt;/a&gt; was born.&lt;/p&gt;
&lt;p&gt;&quot;Compete with the tech giants&quot; sounds like a movie trailer, I know. One guy, one laptop, one dream, and 47 open browser tabs. But stay with me, because the trick is not what you think.&lt;/p&gt;
&lt;h3 id=&quot;you-don-t-fight-giants-you-find-the-gap-&quot;&gt;You don't fight giants. You find the gap.&lt;/h3&gt;
&lt;p&gt;Big companies are cargo ships. Huge, powerful, and very busy chasing enterprise contracts. Freelancers, students and small creators are not on their radar, so the pricing slowly drifts toward whoever owns a corporate card.&lt;/p&gt;
&lt;p&gt;I'm a speedboat. I can't carry 10,000 containers, but I can park in the small harbor nobody else bothers with.&lt;/p&gt;
&lt;p&gt;Cuttly is kinder than Bitly, with paid plans from about $12 a month. Prices change, so check them yourself. The point is that the gap I found was not a missing feature. It was a missing price.&lt;/p&gt;
&lt;h3 id=&quot;so-what-does-fewly-do-&quot;&gt;So what does Fewly do?&lt;/h3&gt;
&lt;p&gt;Paste a long URL, get a short one. No account needed. Then it gets more interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free:&lt;/strong&gt; 50 links a month, 30 days of analytics, basic QR codes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro, $5 a month:&lt;/strong&gt; unlimited links, branded domains, 1 year of analytics, API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team, $9 per seat:&lt;/strong&gt; workspaces, roles and an audit log.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Honest note: branded domains are a Pro feature, not free. But &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech/branded-links&quot;&gt;branded short links&lt;/a&gt; at $5 instead of $29 is a conversation a freelancer can actually have.&lt;/p&gt;
&lt;h3 id=&quot;the-blockers-aka-the-fun-part-&quot;&gt;The blockers (aka the fun part)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Blocker 1: My first QR generator was embarrassing.&lt;/strong&gt; It made a QR code for a link. That's it. A QR generator that only does links is a Swiss Army knife with one blade, which is just a knife. So I added WiFi, WhatsApp, vCard, email, SMS, location, social and payment codes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blocker 2: DNS.&lt;/strong&gt; Custom domains need DNS records, and DNS is the one place on the internet where everyone is equally confused. So now Fewly shows you the exact records to add, verifies them, and sets up HTTPS on its own. Fewer tears all around.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blocker 3: People will shorten sketchy stuff.&lt;/strong&gt; Of course they will. So every link is scanned for malware and phishing, and anything pointing to private or internal addresses gets refused. Turns out a link shortener also has to be a bouncer.&lt;/p&gt;
&lt;h3 id=&quot;then-i-got-carried-away-and-built-tools&quot;&gt;Then I got carried away and built tools&lt;/h3&gt;
&lt;p&gt;Fewly now has &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech/tools&quot;&gt;73 free browser tools&lt;/a&gt;. No signup, no uploads, no watermarks. Everything runs on your own device, which also keeps my server bill small. That's the only reason &quot;free&quot; survives.&lt;/p&gt;
&lt;p&gt;My favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Online DB Viewer.&lt;/strong&gt; Drop in a SQLite file, browse tables and run real SQL with the &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech/tools/online-db-viewer&quot;&gt;online DB viewer&lt;/a&gt;. The file never leaves your machine. Perfect for that moment when you pull a database out of an app and wonder what's inside.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text to Handwriting.&lt;/strong&gt; The &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech/tools/text-to-handwriting&quot;&gt;text to handwriting tool&lt;/a&gt; turns typed text into ruled notebook pages. To be clear, it's a handwriting font, not a clone of your own writing. Use it for worksheets and cards, not for crimes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QR Code Generator.&lt;/strong&gt; A free &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech/qr-code-generator&quot;&gt;QR code generator&lt;/a&gt; with PNG and SVG download. No signup, no watermark, and yes, it does more than links now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Payment Fee Calculator.&lt;/strong&gt; On a $5 sale, Stripe's $0.30 fixed fee eats nearly 9%. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech/tools/payment-fee-calculator&quot;&gt;payment fee calculator&lt;/a&gt; shows what actually lands in your account. Want to receive exactly $500? Charge $515.24, not $514.50. Math is sneaky like that.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-i-learned&quot;&gt;What I learned&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Hunt for gaps in price, privacy and speed.&lt;/strong&gt; Features are easy to copy. A fair price is harder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Free tools are a front door.&lt;/strong&gt; Someone comes for a JSON formatter, leaves in ten seconds, and now knows my name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Be honest.&lt;/strong&gt; Bitly has a name everyone knows, years of trust and enterprise clients. Fewly is young. I'm not claiming a win. I'm saying one small corner of the market was underserved.&lt;/p&gt;
&lt;h3 id=&quot;so-can-a-solo-dev-still-compete-&quot;&gt;So, can a solo dev still compete?&lt;/h3&gt;
&lt;p&gt;Not head on. Sideways, absolutely.&lt;/p&gt;
&lt;p&gt;Try &lt;a rel=&quot;nofollow&quot; href=&quot;https://fewly.tech&quot;&gt;Fewly&lt;/a&gt; and tell me what's missing. I read every message, mostly because I'm the only one here.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31457/can-one-developer-beat-big-tech-sideways-yes</guid>
<pubDate>Sat, 17 Oct 2026 01:56:50 +0000</pubDate>
</item>
<item>
<title>At Seed Stage You Don’t Have a Brand. You Have a Person. (Bad News for People Who’d Rather Build.)</title>
<link>https://coderlegion.com/31068/at-seed-stage-you-dont-have-a-brand-you-have-a-person-bad-news-for-people-whod-rather-build</link>
<description>&lt;p&gt;Part 2 of 4 on IBR’s Mini Strategy Handbook for AI Founders. This is the review about distribution, and I’m going to write it the way it tells me to: with the scar showing.&lt;/p&gt;
&lt;p&gt;In Part 1 I confessed to shipping eight products this year and being much better at the launching than the cutting. Here’s the second, worse confession, the one that makes Ikana’s Review 02 read like it was addressed to me personally: I can ship anything, and I struggle to distribute it. My own operating rules literally include “outbound is oxygen,” which is the kind of rule you write when you have been, historically, holding your breath.&lt;/p&gt;
&lt;p&gt;So Richa Sati’s The Founder Is the Channel is uncomfortable reading, and therefore probably correct. The core claim: at seed stage you don’t have a brand. You have a person. Distribution starts with that person being specific in public, repeatedly, about a problem they’ve actually bled over. Not with ad spend. Not with a logo. With a scar.&lt;/p&gt;
&lt;p&gt;The polish inversion&lt;br&gt;
The mechanism underneath is the sharpest idea in the whole handbook, and it rhymes with things I’ve written about AI deflation. For twenty years, professional-looking content was a moat: a design agency and a copywriter meant you looked credible; without them you looked like a hobby. AI made polished content free, instant, and identical, everyone drawing from the same tools. So polish stopped signaling competence and started signaling nothing, and in some rooms it now signals inauthenticity: if your About page reads like GPT wrote it, and it probably did, the thing that used to build trust quietly erodes it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=17580824585494211048&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Cheap production didn’t democratize credibility. It devalued the currency credibility used to trade in. And what’s still scarce, still expensive to fake? The handbook’s phrase: a specific human with a specific scar, saying something a committee would never approve.&lt;/p&gt;
&lt;p&gt;Read that with the deflation lens from my last few pieces and it clicks: polish is a capability, capabilities got free, and the premium migrated to the one thing you can’t pip install, a person with a checkable track record. Same pattern, different arena.&lt;/p&gt;
&lt;p&gt;The Swap-the-Logo Test&lt;br&gt;
Then comes the tool I’ve already started running on my own drafts, and it stings. Take your last post. Paste it onto a competitor’s account. Does it still make sense? Then you haven’t written anything. You’ve assembled category filler.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=2436820611140926245&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The handbook’s contrast is Pieter Levels, no investors, no PR, just years of building in public with the actual revenue, the actual failures, the actual 3 a.m. decisions, versus the median AI startup account: a rotating cast of “excited to announce,” dashboards nobody outside can verify, enthusiasm calibrated to offend no one. Not wrong. Just interchangeable.&lt;/p&gt;
&lt;p&gt;The distinction I found most useful is that this is a Ben Thompson problem, not a GaryVee problem. “Just be authentic” mostly produces founders performing authenticity, which is its own noise. What actually moves markets is a specific, arguable, falsifiable point of view, delivered consistently, so people know exactly what you think and can check your track record against it. The mechanism isn’t charisma. It’s legibility of belief. “AI will change everything” can’t be checked against anything. “Trust is the last scarce thing in AI, and here’s why” can, and if I’m wrong you’ll get to say so.&lt;/p&gt;
&lt;p&gt;The SCAR test&lt;br&gt;
The review’s operational tool is four questions that are secretly one question, could literally any other founder in your category have written this?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=9793134054297422400&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Scar, not slogan: “we democratize AI” versus “I hand-labeled data for four months and wanted to set myself on fire.” Contrarian, not consensus: would a smart peer have real reason to disagree? Artifact, not announcement: show the eval, the ticket, the graph of what broke; announcements decay in hours, artifacts get cited for months. Repeated, not one-off: Nomad List wasn’t one good post, it was years of them.&lt;/p&gt;
&lt;p&gt;The Stripe example lands the point: the Collisons wrote deeply technical posts that only made sense if you’d hit the exact walls they described. Nobody hires an agency to fake that level of specificity, because faking it costs more than having the scar. Hence the line I’d frame: the scar is the moat, the one thing a better-funded fast-follower can’t clone by Tuesday.&lt;/p&gt;
&lt;p&gt;Where it breaks, and the honest bit&lt;br&gt;
Credit to the review for saying where the mechanism fails, because most “build in public” gospel doesn’t. Regulated and enterprise infrastructure: a hospital procurement officer does not care about your Twitter. At scale, structurally: multiple product lines and a sales org eventually need a brand that doesn’t live or die on one person’s posting cadence. And when it’s performed instead of lived: people detect a staged “day in the life” even when they can’t articulate why.&lt;/p&gt;
&lt;p&gt;That first exception matters for me specifically, because half my portfolio sells into enterprises and clinics, where the buyer wants institutional trust, not my feed. So the honest synthesis is: the founder channel is how you get the first believers and the first ten customers, and it is not how you get the hospital. Both are true. Plan for both and don’t run into the same ‘build before sell’ hole as articulated in Part-1 of the series.&lt;/p&gt;
&lt;p&gt;What I’m actually going to do&lt;br&gt;
Since the review demands specificity, here’s mine. My scar isn’t “passionate about AI.” It’s: two decades building data systems, a year of shipping products faster than I could sell them, and the slow, expensive realization that the launch was never the constraint. That’s a checkable, slightly embarrassing, entirely mine sentence, and it passes the swap-the-logo test, because no competitor would want to paste it.&lt;/p&gt;
&lt;p&gt;The Part 1 caveat comes due here: launching wide divides your voice by the number of tools. The Founder-Is-the-Channel model only works with one identity, repeated. My own rule says one identity for twelve months. I wrote the rule. Time to obey it.&lt;/p&gt;
&lt;p&gt;Next, Part 3, on the trap that catches you after distribution starts working: mistaking loud signals for real ones. The handbook has a ladder. Bring your waitlist. We’ll see where it sits.&lt;/p&gt;
&lt;p&gt;-Hardik&lt;/p&gt;
&lt;p&gt;I’ve spent about two decades building data and AI systems, and one uncomfortable year learning that “outbound is oxygen” is easier to write on a wall than to breathe. This is Part 2 of 4 on IBR’s handbook. Part 3, The Signal Cost Principle, is the framework I wish I’d had before my first “we broke the site” screenshot. Subscribe; the scar tissue economy pays out slowly, but it does pay.&lt;/p&gt;
&lt;p&gt;Series map: Part 1 · The Inverted Launch → Part 2 · The Founder Is the Channel (this) → Part 3 · The Signal Cost Principle → Part 4 · The Contribution Factor.&lt;/p&gt;
&lt;p&gt;Source: Ikana Business Review, Mini Strategy Handbook for AI Founders (August 2026), Review 02, “The Founder Is the Channel” by Richa Sati, including the polish inversion, the Swap-the-Logo Test, and the SCAR test; the full argument is at ikanabusinessreview.com. The confessions and the deflation framing are mine.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31068/at-seed-stage-you-dont-have-a-brand-you-have-a-person-bad-news-for-people-whod-rather-build</guid>
<pubDate>Wed, 14 Oct 2026 12:33:15 +0000</pubDate>
</item>
<item>
<title>Top Digital Product Delivery Platforms for Selling eBooks and Courses</title>
<link>https://coderlegion.com/28524/top-digital-product-delivery-platforms-for-selling-ebooks-and-courses</link>
<description>&lt;p&gt;Selling an eBook or online course no longer requires building a complete ecommerce system from scratch. Digital product delivery platforms now combine storefronts, checkout, file delivery, course hosting, payment processing, customer management, analytics, and, in some cases, affiliate tracking and marketing tools.&lt;/p&gt;
&lt;p&gt;The important distinction is that these platforms are not interchangeable. Some are designed primarily for downloadable products. Others are built around structured online learning. Some charge monthly subscriptions, while others take a percentage of each transaction. For publishers and creators using affiliate marketing, paid traffic, sponsored content, or other acquisition channels, tracking and attribution can be just as important as the checkout itself.&lt;/p&gt;
&lt;p&gt;The following platforms are worth considering when the objective is to sell eBooks, courses, or both.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Payhip&lt;br&gt;
Payhip is built around digital commerce and supports a wide range of products without requiring sellers to build their own ecommerce infrastructure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Its pricing structure is straightforward. The Free Forever plan has no monthly subscription but charges a 5% transaction fee. The Plus plan costs $29 per month with a 2% transaction fee, while the Pro plan costs $99 per month with no Payhip transaction fee. Payment processors such as Stripe and PayPal still charge their own fees. Payhip states that all three plans provide access to all features, unlimited products, and unlimited revenue.&lt;/p&gt;
&lt;p&gt;For an eBook publisher, the main attraction is the low barrier to entry. A creator can begin without committing to a monthly subscription and move to a paid plan as sales increase.&lt;/p&gt;
&lt;p&gt;Payhip also has built-in affiliate functionality. Sellers can create affiliate programs, assign products to affiliates, generate unique tracking links, and establish commission rates. Payhip reports a 30-day cookie duration, with commissions attributed to the last touchpoint before conversion. However, sellers are responsible for paying their affiliates themselves. Payhip provides monthly affiliate sales reports rather than automatically distributing those commissions.&lt;/p&gt;
&lt;p&gt;That makes Payhip particularly relevant to publishers who want to combine direct sales with an affiliate network without adding separate affiliate software.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gumroad&lt;br&gt;
Gumroad has become a prominent option for creators selling digital products directly to an audience.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The platform supports eBooks, courses, memberships, subscriptions, digital downloads, and other digital products. Gumroad also allows creators to use its storefront or embed purchasing functionality into an existing website.&lt;/p&gt;
&lt;p&gt;Its commercial model differs substantially from subscription-based platforms. Gumroad currently charges 10% plus $0.50 per transaction for sales made through a creator's direct Gumroad presence, in addition to applicable sales tax and payment processing charges. Sales generated through Gumroad's Discover marketplace are subject to a 30% fee that includes processing. Gumroad does not charge a monthly subscription fee.&lt;/p&gt;
&lt;p&gt;For creators who are testing an eBook or course idea, this model removes the recurring platform bill. The tradeoff is that transaction costs can become significant as sales volume grows.&lt;/p&gt;
&lt;p&gt;Gumroad also supports affiliate selling. Creators can add affiliates, while Gumroad's Discover products can be promoted through its affiliate system. Affiliate links use tracking mechanisms to attribute purchases. Gumroad states that Discover affiliate links have a seven-day cookie window, while links provided directly by creators to their affiliates use a 30-day cookie window.&lt;/p&gt;
&lt;p&gt;This makes Gumroad relevant to publishers whose acquisition strategy includes bloggers, newsletter operators, creators, or other partners.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Podia&lt;br&gt;
Podia takes a broader approach by combining digital product sales with online courses, memberships, coaching, community products, and email marketing capabilities.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Podia allows creators to create paid offers for online courses, downloads, coaching products, bundles, and other products. Its pricing system supports one-time payments, payment plans, and recurring subscriptions.&lt;/p&gt;
&lt;p&gt;That combination is useful when an eBook is only one component of a larger business. For example, a creator could sell an eBook as a standalone product and also offer a course or membership built around the same subject.&lt;/p&gt;
&lt;p&gt;Podia's transaction structure depends on the plan. As of 2026, the company's Mover plan carries a 5% transaction fee, while the Shaker and Earthquaker plans remove Podia's transaction fee and provide additional capabilities. Payment processor charges from Stripe or PayPal remain separate.&lt;/p&gt;
&lt;p&gt;Affiliate functionality is also available. Podia's affiliate program allows sellers to establish default and product-specific commission rates, invite affiliates, and use unique referral links. The affiliate system uses cookies to attribute sales, and Podia provides affiliate reporting covering clicks, referrals, sales, and related activity. The affiliate feature is available on Shaker and Earthquaker plans.&lt;/p&gt;
&lt;p&gt;For a creator building a business around multiple product types, Podia provides a more consolidated environment than a basic file-delivery service.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Teachable&lt;br&gt;
Teachable is primarily associated with online courses, but it also supports digital downloads, making it suitable for creators who want to sell both educational programs and downloadable publications.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Teachable's digital download system supports eBooks, guides, audio files, podcasts, printables, and other downloadable material. Downloads can be sold as standalone products or incorporated into broader offers such as bundles and order bumps.&lt;/p&gt;
&lt;p&gt;The platform also supports several pricing models for courses, including one-time purchases, payment plans, and subscriptions. Digital downloads have more limited pricing options, including free products, one-time payments, and payment plans.&lt;/p&gt;
&lt;p&gt;Teachable's current plan structure includes Starter, Builder, Growth, and Advanced. Its published pricing shows Starter at $39 per month when billed monthly or $29 per month when billed annually. Builder is $89 monthly or $69 annually, Growth is $189 monthly or $139 annually, and Advanced is $399 monthly or $309 annually.&lt;/p&gt;
&lt;p&gt;Transaction fees also vary by plan. Teachable currently lists a 7.5% transaction fee on Starter and 0% on Builder, Growth, and Advanced, before payment processing charges.&lt;/p&gt;
&lt;p&gt;Teachable therefore makes more sense for creators whose primary commercial product is an online course and who want eBooks or other downloads to support that course business.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Thinkific&lt;br&gt;
Thinkific is another course-focused platform that has expanded beyond conventional course hosting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Its current Basic plan is listed at $54 per month when billed monthly or $40 per month when billed annually. The Start plan is $109 monthly or $82 annually, while Grow is $219 monthly or $164 annually. Thinkific's 2026 pricing update took effect from August 13, 2026, increasing the listed Basic, Start, and Grow prices by approximately 10%.&lt;/p&gt;
&lt;p&gt;Thinkific's Basic plan includes unlimited courses and supports digital products, including up to five eBooks, workbooks, or templates. Higher plans expand the digital download capability. The platform also supports checkout features such as order bumps, coupons, gifting, payment plans, memberships, subscriptions, and product bundles.&lt;/p&gt;
&lt;p&gt;For publishers concerned with affiliate attribution, Thinkific includes affiliate reporting among its sales tools. Its platform can track affiliate sales and commissions, which makes it more relevant to a course business using partner-driven customer acquisition.&lt;/p&gt;
&lt;p&gt;Thinkific does not offer a permanent free plan, although it currently provides a 30-day free trial. The company also states that it does not take a commission from course sales, although payment processing and applicable third-party fees can still apply.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sellfy&lt;br&gt;
Sellfy is designed for creators who want a storefront for digital products without building the entire ecommerce system themselves.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sellfy supports digital downloads, subscriptions, merchandise, and physical products. Its current published pricing lists Starter at $22 per month, Business at $59 per month, and Premium at $119 per month, with annual billing available at discounted rates. Sellfy states that its plans do not charge additional transaction fees, although payment processors such as Stripe and PayPal charge their own fees.&lt;/p&gt;
&lt;p&gt;The platform also provides email marketing and other commerce functions. Business and Premium plans add features including product upselling, cart abandonment tools, and affiliate marketing.&lt;/p&gt;
&lt;p&gt;Sellfy's built-in affiliate system allows sellers to configure commission rates, manage partners, and track affiliate activity. Its affiliate documentation identifies partner-link tracking, minimum payout settings, and product commission rates as core configuration options. The affiliate feature is available to Business, Premium, and Custom plan users.&lt;/p&gt;
&lt;p&gt;For a creator selling eBooks alongside other digital products, Sellfy provides a storefront-oriented alternative to course-first platforms such as Teachable and Thinkific.&lt;/p&gt;
&lt;p&gt;What matters when choosing a digital product platform?&lt;br&gt;
The platform's headline feature list should not be the only consideration. The economics of the business matter more.&lt;/p&gt;
&lt;p&gt;Transaction fees&lt;br&gt;
A platform with no monthly fee can still become expensive if it takes a substantial percentage from every sale. Conversely, a monthly subscription can become more economical at higher sales volumes.&lt;/p&gt;
&lt;p&gt;For example, Gumroad's direct-sale fee is currently 10% plus $0.50 per transaction, while Payhip's free plan charges 5%. Teachable uses a subscription model with plan-dependent transaction fees, and Thinkific does not charge a commission on course sales.&lt;/p&gt;
&lt;p&gt;Creators should calculate the total cost using their actual expected sales volume rather than comparing subscription prices alone.&lt;/p&gt;
&lt;p&gt;Affiliate tracking&lt;br&gt;
Affiliate marketing introduces another technical requirement. A platform needs to identify which partner generated a sale and calculate the associated commission correctly.&lt;/p&gt;
&lt;p&gt;Payhip uses unique affiliate keys and a 30-day cookie window. Gumroad uses different cookie windows depending on the affiliate arrangement. Podia supports configurable affiliate commissions and attribution settings. Sellfy provides partner-link tracking and commission management.&lt;/p&gt;
&lt;p&gt;These details matter when a publisher plans to rely on affiliates, review websites, newsletters, influencers, or other third-party traffic sources.&lt;/p&gt;
&lt;p&gt;Product type&lt;br&gt;
An eBook business does not necessarily need a full learning management system. A course business usually requires more than simple file delivery.&lt;/p&gt;
&lt;p&gt;Payhip, Gumroad, and Sellfy are particularly oriented toward digital commerce and downloadable products. Teachable and Thinkific place greater emphasis on structured online learning. Podia occupies a broader position by combining courses, downloads, memberships, coaching, and community products.&lt;/p&gt;
&lt;p&gt;Marketing and analytics&lt;br&gt;
Selling the product is only one part of digital commerce. Publishers also need to understand where customers originate, which products convert, and which promotional channels generate revenue.&lt;/p&gt;
&lt;p&gt;Features such as abandoned-cart recovery, affiliate reports, customer analytics, email tools, coupons, order bumps, and product bundles can reduce the need for separate software.&lt;/p&gt;
&lt;p&gt;For publishers buying advertising or sponsored placements, this distinction becomes important. The acquisition cost of a customer should be measured against the actual revenue generated after platform fees, payment processing, affiliate commissions, refunds, and advertising costs.&lt;/p&gt;
&lt;p&gt;Which platform fits which business model?&lt;br&gt;
For a creator starting with downloadable eBooks and looking to minimize fixed costs, Payhip or Gumroad provide straightforward entry points. Payhip offers a free plan with a transaction fee, while Gumroad operates without a monthly subscription but charges a higher transaction fee on direct sales.&lt;/p&gt;
&lt;p&gt;For a business combining eBooks, courses, memberships, and community products, Podia provides a broader product mix in one platform. Its affiliate tools are also directly integrated into the seller dashboard.&lt;/p&gt;
&lt;p&gt;For a business where the course is the main product and the eBook functions as a companion product, lead magnet, or additional offer, Teachable or Thinkific provide stronger course-oriented infrastructure. Both support digital downloads alongside course products.&lt;/p&gt;
&lt;p&gt;For creators who want a storefront covering digital products and potentially physical merchandise, Sellfy provides a commerce-focused alternative with built-in email marketing and affiliate capabilities on eligible plans.&lt;/p&gt;
&lt;p&gt;Final considerations&lt;br&gt;
The best platform is determined by the economics and technical requirements of the business, not by the size of a platform's feature list.&lt;/p&gt;
&lt;p&gt;An eBook seller should examine transaction fees, payment processing, file delivery, tax handling, affiliate attribution, analytics, customer ownership, and the ability to export customer data. A course creator should add lesson delivery, student management, quizzes, certificates, memberships, payment plans, and learning analytics to that evaluation.&lt;/p&gt;
&lt;p&gt;Affiliate marketing also deserves careful attention. A platform that can track partner referrals inside the same system can eliminate the need for additional affiliate software, but commission rates, attribution windows, payout procedures, and plan restrictions must be examined before launching a program.&lt;/p&gt;
&lt;p&gt;The six platforms covered here represent different approaches to the same commercial problem. Payhip and Gumroad emphasize accessible digital commerce. Podia combines several creator-business functions. Teachable and Thinkific place online education at the center. Sellfy focuses on creator commerce and storefront functionality.&lt;/p&gt;
&lt;p&gt;Before committing, calculate the expected monthly sales, average order value, affiliate commissions, payment-processing costs, advertising expenditure, and platform fees. Then compare the resulting net revenue rather than comparing subscription prices in isolation. Platform pricing and features can change, so the provider's current pricing and documentation should be checked before making a purchasing decision.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28524/top-digital-product-delivery-platforms-for-selling-ebooks-and-courses</guid>
<pubDate>Thu, 24 Sep 2026 16:40:08 +0000</pubDate>
</item>
<item>
<title>Ecommerce SEO Audit Checklist</title>
<link>https://coderlegion.com/25632/ecommerce-seo-audit-checklist</link>
<description>
&lt;p&gt;&lt;strong&gt;Direct answer:&lt;/strong&gt; start by defining the URLs that should be indexed, then crawl the paths customers and bots can follow. Control filters and parameters, and reconcile redirects, canonicals, internal links, and sitemaps. Next, inspect category and product templates, Product and variant data, and stock states. Finally, compare the cleaned inventory with Search Console. Fix discovery and canonical conflicts before rewriting page copy or chasing rich-result warnings.&lt;/p&gt;
      &lt;p&gt;This checklist diagnoses a store-wide URL and template system. It does not teach product or category copy in depth, replace a migration plan, or repeat every crawler setting. Use the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/technical-seo-audit-screaming-frog-search-console&quot;&gt;technical SEO audit workflow&lt;/a&gt; when you need the full crawl and Search Console evidence process.&lt;/p&gt;
      &lt;p&gt;&lt;a href=&quot;#verification-checklist&quot;&gt;Jump to verification checklist &amp;rarr;&lt;/a&gt;&lt;/p&gt;

      &lt;h2 id=&quot;use-this-audit-map&quot;&gt;Use this audit map&lt;/h2&gt;
      &lt;div class=&quot;article-table-wrap&quot;&gt;
        &lt;table class=&quot;article-table&quot;&gt;
          &lt;thead&gt;
            &lt;tr&gt;&lt;th&gt;Area&lt;/th&gt;&lt;th&gt;Evidence to collect&lt;/th&gt;&lt;th&gt;Pass condition&lt;/th&gt;&lt;/tr&gt;
          &lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;Indexable inventory&lt;/td&gt;&lt;td&gt;Template list, URL samples, XML sitemap&lt;/td&gt;&lt;td&gt;Every intended category and product has one preferred URL&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Discovery&lt;/td&gt;&lt;td&gt;Navigation crawl, orphan report, pagination paths&lt;/td&gt;&lt;td&gt;Important pages are reachable through crawlable links&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Filters and parameters&lt;/td&gt;&lt;td&gt;Parameter patterns, combinations, crawl volume&lt;/td&gt;&lt;td&gt;Useful landing pages are distinct; unwanted combinations do not expand the crawl&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Canonical signals&lt;/td&gt;&lt;td&gt;Status, redirect, canonical, internal links, sitemap membership&lt;/td&gt;&lt;td&gt;Signals consistently point to the same preferred URL&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Templates&lt;/td&gt;&lt;td&gt;HTML, rendered output, mobile output, structured data&lt;/td&gt;&lt;td&gt;Primary content and signals survive every representative template&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Measurement&lt;/td&gt;&lt;td&gt;Search Console pages, queries, indexing groups&lt;/td&gt;&lt;td&gt;Issues are prioritized by affected templates and search evidence&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;

      &lt;h2 id=&quot;1-define-the-indexable-store-inventory&quot;&gt;1. Define the indexable store inventory&lt;/h2&gt;
      &lt;p&gt;List the page types the store intentionally wants in search before opening a crawler. Typical candidates include the homepage, departments, categories, useful subcategories, product detail pages, editorial guides, store locations, and selected campaign pages. Account, cart, checkout, internal search, sorting, session, and tracking URLs normally serve users or operations without needing a separate search result.&lt;/p&gt;
      &lt;p&gt;Do not decide by URL shape alone. A filtered collection can deserve indexing when it serves a stable demand with unique inventory and useful context. The same filter can be wasteful when it creates a thin duplicate or an empty combination. Record the business owner, intended canonical, indexability, sitemap state, and one real example for every template.&lt;/p&gt;
      &lt;div class=&quot;article-table-wrap&quot;&gt;
        &lt;table class=&quot;article-table article-table-wide&quot;&gt;
          &lt;thead&gt;
            &lt;tr&gt;&lt;th&gt;Template&lt;/th&gt;&lt;th&gt;Example URL&lt;/th&gt;&lt;th&gt;Index?&lt;/th&gt;&lt;th&gt;Canonical target&lt;/th&gt;&lt;th&gt;Sitemap?&lt;/th&gt;&lt;th&gt;Owner&lt;/th&gt;&lt;/tr&gt;
          &lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;Category&lt;/td&gt;&lt;td&gt;&lt;code&gt;/ceramics/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Self&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Merchandising&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Product&lt;/td&gt;&lt;td&gt;&lt;code&gt;/ceramics/blue-vase/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Self&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Catalog&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Filter&lt;/td&gt;&lt;td&gt;&lt;code&gt;/ceramics/?color=blue&lt;/code&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Policy decision&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;SEO&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Search&lt;/td&gt;&lt;td&gt;&lt;code&gt;/search?q=blue&lt;/code&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Product&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;

      &lt;h2 id=&quot;2-crawl-the-paths-shoppers-and-google-can-follow&quot;&gt;2. Crawl the paths shoppers and Google can follow&lt;/h2&gt;
      &lt;p&gt;Run a normal crawl from the preferred origin with robots rules respected. Then compare it with XML sitemap URLs, Search Console landing pages, analytics landing pages if available, product feeds, and the commerce platform export. The differences matter more than a single crawl total.&lt;/p&gt;
      &lt;p&gt;Google says it uses page relationships to understand ecommerce structure and recommends linking categories, subcategories, and products with crawlable &lt;code&gt;&amp;lt;a href&amp;gt;&lt;/code&gt; links. Googlebot generally does not submit a site search form, so search-only products may remain undiscovered. A sitemap or Merchant Center feed can supplement discovery, but neither repairs a weak internal path. See Google's guidance on &lt;a href=&quot;https://developers.google.com/search/docs/specialty/ecommerce/help-google-understand-your-ecommerce-site-structure&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;helping Google understand an ecommerce site structure&lt;/a&gt;.&lt;/p&gt;
      &lt;div class=&quot;article-callout&quot;&gt;
        &lt;p&gt;&lt;strong&gt;Protect the store while crawling.&lt;/strong&gt; Exclude checkout, accounts, carts, wish lists, internal search, and unbounded parameter spaces. Use a considerate crawl rate and test against a small sample before expanding.&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;Investigate four gaps:&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;important URLs in the catalog but not in the crawl;&lt;/li&gt;
        &lt;li&gt;crawlable URLs missing from the intended inventory;&lt;/li&gt;
        &lt;li&gt;sitemap URLs that redirect or canonicalize elsewhere;&lt;/li&gt;
        &lt;li&gt;Google landing pages that no current navigation path reaches.&lt;/li&gt;
      &lt;/ul&gt;

      &lt;h2 id=&quot;3-decide-what-happens-to-faceted-and-parameter-urls&quot;&gt;3. Decide what happens to faceted and parameter URLs&lt;/h2&gt;
      &lt;p&gt;Group parameters by function: filtering, sorting, pagination, tracking, session state, display mode, and campaign attribution. Sample real combinations and count how quickly each family expands. A five-filter interface can create far more URLs than products.&lt;/p&gt;
      &lt;p&gt;Google's current &lt;a href=&quot;https://developers.google.com/crawling/docs/faceted-navigation&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;faceted navigation guidance&lt;/a&gt; warns that generated combinations can consume large amounts of crawling. When faceted URLs are not needed in search, prevent the unwanted crawl through an enforceable URL and robots policy. When a subset should be indexable, keep parameter order stable and return a real 404 for empty or nonsensical combinations. Give each selected landing page consistent internal links, content, canonical signals, and sitemap treatment.&lt;/p&gt;
      &lt;div class=&quot;article-table-wrap&quot;&gt;
        &lt;table class=&quot;article-table&quot;&gt;
          &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pattern&lt;/th&gt;&lt;th&gt;Default audit decision&lt;/th&gt;&lt;th&gt;Reason to make an exception&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;Sort order&lt;/td&gt;&lt;td&gt;Do not index&lt;/td&gt;&lt;td&gt;Rarely creates a distinct search job&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Tracking and session&lt;/td&gt;&lt;td&gt;Do not index&lt;/td&gt;&lt;td&gt;No separate content value&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Single useful attribute&lt;/td&gt;&lt;td&gt;Evaluate&lt;/td&gt;&lt;td&gt;Stable demand, enough inventory, useful landing-page context&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Multiple arbitrary filters&lt;/td&gt;&lt;td&gt;Usually do not crawl or index&lt;/td&gt;&lt;td&gt;Only when intentionally curated as a durable collection&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Empty combination&lt;/td&gt;&lt;td&gt;404&lt;/td&gt;&lt;td&gt;None when no matching inventory exists&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;
      &lt;p&gt;Do not use one blanket canonical to the unfiltered category as a substitute for controlling an infinite crawl. Canonical is a consolidation signal, not a crawl-budget switch. For the implementation sequence behind filter combinations, pagination, empty states, and crawlable internal discovery, continue with &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/ecommerce-faceted-navigation-pagination&quot;&gt;faceted navigation and pagination for ecommerce SEO&lt;/a&gt;.&lt;/p&gt;

      &lt;h2 id=&quot;4-test-pagination-and-category-discovery&quot;&gt;4. Test pagination and category discovery&lt;/h2&gt;
      &lt;p&gt;Open a deep category with JavaScript disabled and inspect the source links. Each paginated URL should have a unique, crawlable address, and products beyond the first viewport should still be discoverable. Infinite scroll and load-more interfaces need an underlying sequence of URLs and links that a crawler can follow without clicking or scrolling.&lt;/p&gt;
      &lt;p&gt;Google's &lt;a href=&quot;https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;pagination guidance for ecommerce&lt;/a&gt; explains that crawlers may not trigger user interactions. Test first, middle, and final pages for self-canonicals, status codes, duplicate metadata, empty states, and products that disappear when inventory changes.&lt;/p&gt;
      &lt;p&gt;Do not canonicalize every paginated page to page one when later pages contain distinct products. Also verify that removing or adding a product does not leave an endless chain of empty pages.&lt;/p&gt;

      &lt;h2 id=&quot;5-align-redirects-canonicals-links-and-sitemaps&quot;&gt;5. Align redirects, canonicals, links, and sitemaps&lt;/h2&gt;
      &lt;p&gt;For every representative URL, compare the requested URL, final status, redirect target, HTML canonical, internal-link destination, sitemap URL, and any locale or variant signals. The preferred version should be the version the site actually links to and submits.&lt;/p&gt;
      &lt;p&gt;Google treats redirects and &lt;code&gt;rel=&quot;canonical&quot;&lt;/code&gt; as strong canonicalization signals, while sitemap inclusion is weaker. Signals can reinforce each other when they agree. Review Google's &lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;duplicate URL consolidation guidance&lt;/a&gt;, then use the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/fix-sitemap-redirects-non-canonical-urls&quot;&gt;sitemap and non-canonical URL fix&lt;/a&gt; for implementation detail.&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Protocol and host:&lt;/strong&gt; HTTP, HTTPS, www, and non-www should resolve consistently.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Path variants:&lt;/strong&gt; casing, trailing slashes, duplicate category paths, and legacy handles need one policy.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Parameters:&lt;/strong&gt; internal navigation should not add tracking or display parameters to canonical product links.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Sitemaps:&lt;/strong&gt; include absolute, preferred, indexable URLs that return a successful response.&lt;/li&gt;
      &lt;/ul&gt;

      &lt;h2 id=&quot;6-inspect-product-templates-variants-and-stock-states&quot;&gt;6. Inspect product templates, variants, and stock states&lt;/h2&gt;
      &lt;p&gt;Sample products by revenue, category, inventory state, number of variants, age, and traffic. Include a simple product, a multi-variant product, an out-of-stock item, a discontinued item, a product with reviews, and a newly created item. Inspect initial HTML, rendered DOM, mobile output, status, canonical, links, title, primary heading, price, availability, media, and purchase state.&lt;/p&gt;
      &lt;p&gt;Choose variant URLs deliberately. In a single-page model, each variant should be directly preselectable through a distinct stable URL state while the overall &lt;code&gt;ProductGroup&lt;/code&gt; keeps one canonical product URL. Separate variant pages can work when users search for the variation and each page remains stable, internally linked, and accurately represented. Avoid a hybrid where feeds, internal links, canonicals, and structured data disagree about whether variants are separate products.&lt;/p&gt;
      &lt;div class=&quot;article-table-wrap&quot;&gt;
        &lt;table class=&quot;article-table&quot;&gt;
          &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stock state&lt;/th&gt;&lt;th&gt;Audit question&lt;/th&gt;&lt;th&gt;Typical safe route&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;Temporarily unavailable&lt;/td&gt;&lt;td&gt;Will the same product return?&lt;/td&gt;&lt;td&gt;Keep the useful page, show accurate availability, preserve alternatives&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Permanently discontinued with replacement&lt;/td&gt;&lt;td&gt;Is there a close successor?&lt;/td&gt;&lt;td&gt;Redirect only when the replacement satisfies the same user job&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Permanently discontinued without replacement&lt;/td&gt;&lt;td&gt;Does the page still help users?&lt;/td&gt;&lt;td&gt;Keep useful reference content or return 404/410 when it has no remaining value&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Deleted by mistake&lt;/td&gt;&lt;td&gt;Should the catalog item still exist?&lt;/td&gt;&lt;td&gt;Restore the original URL and repair feed or inventory synchronization&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;
      &lt;p&gt;Do not redirect every removed product to its category. A misleading redirect hides the missing item without giving the user an equivalent result.&lt;/p&gt;

      &lt;h2 id=&quot;7-check-structured-data-against-the-visible-offer&quot;&gt;7. Check structured data against the visible offer&lt;/h2&gt;
      &lt;p&gt;Validate Product markup on representative product pages, not category templates. Compare every property with the visible page and current offer: name, image, price, currency, availability, condition, seller, ratings, and reviews. Google notes that Product markup can support product snippets or merchant listing experiences, and variants can be represented with &lt;code&gt;ProductGroup&lt;/code&gt; and &lt;code&gt;Product&lt;/code&gt;. Read the official &lt;a href=&quot;https://developers.google.com/search/docs/appearance/structured-data/product&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Product structured data documentation&lt;/a&gt; and &lt;a href=&quot;https://developers.google.com/search/docs/appearance/structured-data/product-variants&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;product variant documentation&lt;/a&gt;.&lt;/p&gt;
      &lt;p&gt;A valid Rich Results Test is not the end of the audit. Confirm that the server or rendered page exposes the same current price and stock state users see. Google cautions that rapidly changing price and availability produced only through JavaScript can be less reliable for crawling. Also reconcile website markup with merchant feeds so the same offer does not publish conflicting values.&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;Markup describes the specific product page, not a category of many unrelated products.&lt;/li&gt;
        &lt;li&gt;Variant and group identifiers are stable and consistent with canonical decisions.&lt;/li&gt;
        &lt;li&gt;Ratings and reviews are visible, attributable, and about the marked-up product.&lt;/li&gt;
        &lt;li&gt;Currency, price, and availability match the purchasable offer.&lt;/li&gt;
        &lt;li&gt;Validation warnings are prioritized by eligibility and data accuracy, not by count alone.&lt;/li&gt;
      &lt;/ul&gt;

      &lt;h2 id=&quot;8-prioritize-with-search-console-and-template-reach&quot;&gt;8. Prioritize with Search Console and template reach&lt;/h2&gt;
      &lt;p&gt;Join the cleaned inventory with Search Console performance and indexing evidence. Use normalized URL keys, but preserve raw URLs so canonical aggregation and parameter behavior remain inspectable. Segment by template, category, indexability decision, status, canonical target, sitemap state, and issue type.&lt;/p&gt;
      &lt;figure class=&quot;article-figure&quot;&gt;
        &lt;picture&gt;
          &lt;source type=&quot;image/webp&quot;&gt;
          &lt;img src=&quot;https://floxolab.com/uploads/seo/guides/ecommerce-seo-audit-checklist/gsc-page-indexing-reasons.png?v=20260823&quot; width=&quot;780&quot; height=&quot;515&quot; alt=&quot;Google Search Console Page indexing report showing crawled, redirect, canonical, noindex, 404, and discovered exclusion groups&quot;&gt;
        &lt;/source&gt;&lt;/picture&gt;
        &lt;figcaption&gt;Real FloxoLab Search Console Page indexing snapshot. The counts and validation states are property-specific; use the issue groups to choose what to inspect, not as universal targets.&lt;/figcaption&gt;
      &lt;/figure&gt;
      &lt;p&gt;Prioritize a defect when it affects an intended template at scale, blocks discovery or consolidation, contradicts the store's inventory policy, or is tied to meaningful impressions, clicks, revenue, or strategic products. A warning on one obsolete URL is not automatically more urgent than a navigation defect hiding thousands of products.&lt;/p&gt;
      &lt;p&gt;Once the technical inventory is stable, use the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/product-category-page-seo&quot;&gt;product and category page SEO guide&lt;/a&gt; to implement useful store templates, variants, availability, media, links, and Product data. Use the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/on-page-seo-audit-checklist&quot;&gt;on-page SEO audit checklist&lt;/a&gt; for the wider page-level review.&lt;/p&gt;

      &lt;h2 id=&quot;what-not-to-do&quot;&gt;What not to do&lt;/h2&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Do not crawl every filter combination by default.&lt;/strong&gt; Scope and sample the parameter space first.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not submit every platform-generated URL.&lt;/strong&gt; Sitemaps should reinforce the preferred inventory.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not canonicalize conflicts without fixing internal links.&lt;/strong&gt; Users and crawlers should receive the preferred URL directly.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not treat every excluded URL as an error.&lt;/strong&gt; Carts, searches, duplicates, and controlled facets may be intentionally excluded.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not remove out-of-stock pages automatically.&lt;/strong&gt; Decide from permanence, replacement fit, links, demand, and remaining user value.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not add Product markup to a category just to increase schema coverage.&lt;/strong&gt; Mark up the actual eligible product offer.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not rewrite thousands of descriptions before fixing discovery and canonical conflicts.&lt;/strong&gt; Repair the system that determines which pages can compete.&lt;/li&gt;
      &lt;/ul&gt;

      &lt;h2 id=&quot;verification-checklist&quot;&gt;Verification checklist&lt;/h2&gt;
      &lt;ul&gt;
        &lt;li&gt;Every store template has an explicit indexability and canonical policy.&lt;/li&gt;
        &lt;li&gt;Important categories and products are reachable through crawlable links.&lt;/li&gt;
        &lt;li&gt;Search forms, filters, sorting, tracking, and sessions do not create an uncontrolled crawl space.&lt;/li&gt;
        &lt;li&gt;Pagination exposes stable URLs and links to products beyond the first page.&lt;/li&gt;
        &lt;li&gt;Redirects, canonicals, internal links, feeds, and sitemaps agree on preferred URLs.&lt;/li&gt;
        &lt;li&gt;Representative product and category templates return complete mobile and desktop output.&lt;/li&gt;
        &lt;li&gt;Variant URLs and ProductGroup relationships match the store's actual selection model.&lt;/li&gt;
        &lt;li&gt;Price, currency, availability, ratings, and reviews match the visible offer.&lt;/li&gt;
        &lt;li&gt;Temporary and permanent stock states have separate, documented handling.&lt;/li&gt;
        &lt;li&gt;Search Console evidence is segmented by template and compared with the intended inventory.&lt;/li&gt;
        &lt;li&gt;Fixes are ranked by template reach, search evidence, user harm, and commercial importance.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;An ecommerce audit is complete when the store can explain which URLs should exist, how crawlers reach them, which version cons&lt;/p&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/25632/ecommerce-seo-audit-checklist</guid>
<pubDate>Tue, 01 Sep 2026 15:50:00 +0000</pubDate>
</item>
<item>
<title>Product and Category Page SEO</title>
<link>https://coderlegion.com/25633/product-and-category-page-seo</link>
<description>
&lt;p&gt;&lt;strong&gt;Direct answer:&lt;/strong&gt; make a category page help shoppers narrow a meaningful product set, then make each product page answer whether the specific item fits, what it includes, what it costs, whether it is available, and what happens next. Link the hierarchy with crawlable anchors, choose one deliberate variant URL model, expose useful media in standard HTML, and make Product data match the visible offer.&lt;/p&gt;
      &lt;p&gt;This guide implements product and category templates. It does not repeat the sitewide crawl, faceted-navigation, canonical, sitemap, or Search Console diagnosis in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/ecommerce-seo-audit-checklist&quot;&gt;ecommerce SEO audit checklist&lt;/a&gt;. Stabilize that inventory first when the store does not yet know which URLs should be indexed. Then use the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/ecommerce-faceted-navigation-pagination&quot;&gt;faceted navigation and pagination guide&lt;/a&gt; to control filter combinations and later product pages.&lt;/p&gt;
      &lt;p&gt;&lt;a href=&quot;#verification-checklist&quot;&gt;Jump to the verification checklist &amp;rarr;&lt;/a&gt;&lt;/p&gt;

      &lt;h2 id=&quot;use-this-page-job-map&quot;&gt;Use this page-job map&lt;/h2&gt;
      &lt;div class=&quot;article-table-wrap&quot;&gt;
        &lt;table class=&quot;article-table&quot;&gt;
          &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Page type&lt;/th&gt;&lt;th&gt;Primary job&lt;/th&gt;&lt;th&gt;Evidence the page needs&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;Category&lt;/td&gt;&lt;td&gt;Help a shopper understand and narrow a product set&lt;/td&gt;&lt;td&gt;Scope, useful groupings, visible inventory, filters, comparison cues, crawlable product links&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Product&lt;/td&gt;&lt;td&gt;Help a shopper evaluate one product or deliberate variant group&lt;/td&gt;&lt;td&gt;Identity, media, options, price, availability, specifications, delivery, returns, trust, related routes&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Variant&lt;/td&gt;&lt;td&gt;Represent a meaningful option without creating accidental duplicates&lt;/td&gt;&lt;td&gt;Stable selection state, unique identifiers, consistent URL and canonical model, accurate offer data&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;

      &lt;h2 id=&quot;1-assign-one-job-to-each-template&quot;&gt;1. Assign one job to each template&lt;/h2&gt;
      &lt;p&gt;Start with a representative department, one category, one simple product, and one multi-variant product. Write the user question each page must answer. A category might answer &amp;ldquo;Which office chairs fit a small room?&amp;rdquo; A product might answer &amp;ldquo;Will this chair fit my desk, budget, delivery window, and return requirements?&amp;rdquo;&lt;/p&gt;
      &lt;p&gt;Do not make a category imitate a product page or make a product page repeat every category introduction. Shared brand, shipping, and policy details can appear where useful, but the distinctive evidence should belong to the page that owns the decision.&lt;/p&gt;
      &lt;p&gt;Keep the preferred URL stable. Google says it generally understands ecommerce structure from page linkages rather than inferring hierarchy from URL folders. Clean paths are useful to people and operations, but internal navigation still has to express the relationship. See Google's current guidance on &lt;a href=&quot;https://developers.google.com/search/docs/specialty/ecommerce/help-google-understand-your-ecommerce-site-structure&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;ecommerce navigation structure&lt;/a&gt; and &lt;a href=&quot;https://developers.google.com/search/docs/specialty/ecommerce/designing-a-url-structure-for-ecommerce-sites&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;ecommerce URL design&lt;/a&gt;.&lt;/p&gt;

      &lt;h2 id=&quot;2-build-category-pages-for-discovery-and-comparison&quot;&gt;2. Build category pages for discovery and comparison&lt;/h2&gt;
      &lt;p&gt;A useful category page explains what belongs in the set, exposes the products, and gives shoppers enough information to narrow without opening every card. The exact controls depend on the inventory, but the template should support these jobs:&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Orient:&lt;/strong&gt; a descriptive title, primary heading, short scope, and clear subcategory routes.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Scan:&lt;/strong&gt; recognizable product names, useful images, meaningful price or availability information, and one consistent product-card action.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Narrow:&lt;/strong&gt; filters and sorting that match real buying decisions rather than every database field.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Compare:&lt;/strong&gt; expose the attributes that distinguish products in this category, such as capacity, material, fit, compatible use, or delivery state.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Continue:&lt;/strong&gt; crawlable links to every intended product, pagination route, adjacent category, and useful buying guidance.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Category copy does not need to bury the products under a long essay. Place the concise orientation before or near the inventory, then add supporting guidance where it genuinely answers a follow-up question. If every category inherits the same generic paragraph with only one noun replaced, the template has created duplication rather than usefulness.&lt;/p&gt;
      &lt;div class=&quot;article-callout&quot;&gt;
        &lt;p&gt;&lt;strong&gt;Category pages are navigation surfaces first.&lt;/strong&gt; A paragraph cannot compensate for products that appear only after a search form, interaction, or client-side event that produces no crawlable link.&lt;/p&gt;
      &lt;/div&gt;

      &lt;h2 id=&quot;3-build-product-pages-for-confidence-and-action&quot;&gt;3. Build product pages for confidence and action&lt;/h2&gt;
      &lt;p&gt;A product page should identify the item quickly, then reduce the uncertainty that blocks the purchase or inquiry. Put the essentials near the primary action and keep deeper evidence easy to find.&lt;/p&gt;
      &lt;div class=&quot;article-table-wrap&quot;&gt;
        &lt;table class=&quot;article-table&quot;&gt;
          &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Product element&lt;/th&gt;&lt;th&gt;Implementation test&lt;/th&gt;&lt;th&gt;Common failure&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;Name and product identity&lt;/td&gt;&lt;td&gt;Distinct, understandable without the breadcrumb&lt;/td&gt;&lt;td&gt;SKU-only or manufacturer string that shoppers cannot interpret&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Price and availability&lt;/td&gt;&lt;td&gt;Visible, current, and tied to the selected option&lt;/td&gt;&lt;td&gt;Structured data, feed, and visible page disagree&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Options&lt;/td&gt;&lt;td&gt;Selection changes the offer state and remains accessible&lt;/td&gt;&lt;td&gt;Color or size exists only as an unlabeled visual swatch&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Media&lt;/td&gt;&lt;td&gt;Shows the product, scale, important details, and relevant variation&lt;/td&gt;&lt;td&gt;One decorative image or hidden CSS background&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Specifications&lt;/td&gt;&lt;td&gt;Answers fit, compatibility, materials, dimensions, care, and included items&lt;/td&gt;&lt;td&gt;Important facts buried in an image or downloadable file&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Delivery and returns&lt;/td&gt;&lt;td&gt;Important limits are visible before commitment&lt;/td&gt;&lt;td&gt;Generic promise that contradicts the product or destination&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;
      &lt;p&gt;Use the language customers need to make the decision. A manufacturer description can supply facts, but copying it unchanged across resellers does not explain the store's own offer, delivery, selection help, or relevant limitations.&lt;/p&gt;

      &lt;h2 id=&quot;4-connect-categories-products-and-supporting-guides&quot;&gt;4. Connect categories, products, and supporting guides&lt;/h2&gt;
      &lt;p&gt;Google recommends crawlable &lt;code&gt;&amp;lt;a href&amp;gt;&lt;/code&gt; links from menus to categories, categories to subcategories, and subcategories to products. Googlebot generally does not submit search forms, so products discoverable only through internal search can be missed by normal crawling.&lt;/p&gt;
      &lt;ol&gt;
        &lt;li&gt;Link every intended category from a stable menu, department, or parent route.&lt;/li&gt;
        &lt;li&gt;Link every intended product through a crawlable category or subcategory sequence.&lt;/li&gt;
        &lt;li&gt;Keep pagination or incremental-loading URLs accessible without requiring a click or scroll event.&lt;/li&gt;
        &lt;li&gt;Link a product back to its most useful category, compatible items, replacements, care guides, and buying guidance.&lt;/li&gt;
        &lt;li&gt;Link editorial guides to relevant products only when the product is a logical next step.&lt;/li&gt;
      &lt;/ol&gt;
      &lt;p&gt;Do not make every product link to every other product. Related links should express compatibility, substitution, next use, or a genuine comparison. The hierarchy becomes clearer when links reflect real relationships rather than a generic popularity widget.&lt;/p&gt;

      &lt;h2 id=&quot;5-choose-one-variant-url-model&quot;&gt;5. Choose one variant URL model&lt;/h2&gt;
      &lt;p&gt;Variants can share one product page through stable, directly preselected URL states or live on separate pages. Neither model is universally correct. The choice depends on whether each option has distinct demand, content, media, availability, identifiers, and a durable landing state.&lt;/p&gt;
      &lt;div class=&quot;article-table-wrap&quot;&gt;
        &lt;table class=&quot;article-table&quot;&gt;
          &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;/th&gt;&lt;th&gt;Use it when&lt;/th&gt;&lt;th&gt;Required consistency&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;One product page / single-page model&lt;/td&gt;&lt;td&gt;Options are selectable states of the same product decision&lt;/td&gt;&lt;td&gt;Each variant can be directly preselected with a stable URL state; the overall ProductGroup uses one canonical product URL&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Separate variant URLs&lt;/td&gt;&lt;td&gt;A variant is independently searched, shared, stocked, or merchandised&lt;/td&gt;&lt;td&gt;Each URL loads the correct selection, uses stable identifiers, and follows one internal-link and canonical policy&lt;/td&gt;&lt;/tr&gt;
            &lt;tr&gt;&lt;td&gt;Mixed accidental model&lt;/td&gt;&lt;td&gt;Never as a deliberate choice&lt;/td&gt;&lt;td&gt;Fix feeds, links, canonicals, parameters, and markup so they stop describing different URL models&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;
      &lt;p&gt;Google's &lt;a href=&quot;https://developers.google.com/search/docs/appearance/structured-data/product-variants&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;product variant documentation&lt;/a&gt; supports grouping variants with &lt;code&gt;ProductGroup&lt;/code&gt; and individual &lt;code&gt;Product&lt;/code&gt; entities. Treat markup as a description of the implemented model. Do not use it to hide URL or selection behavior that remains contradictory.&lt;/p&gt;

      &lt;h2 id=&quot;6-handle-availability-without-erasing-useful-pages&quot;&gt;6. Handle availability without erasing useful pages&lt;/h2&gt;
      &lt;p&gt;Temporary unavailability is different from permanent removal. Keep a useful product URL when the same item is expected to return, show the real availability, preserve specifications and support information, and offer a relevant notification or alternative route. Do not present an unavailable item as purchasable.&lt;/p&gt;
      &lt;p&gt;When a product is permanently discontinued, decide from remaining demand, inbound links, support value, and replacement fit. Redirect only when the replacement satisfies substantially the same job. Otherwise keep a useful reference page or return an honest 404 or 410 when no useful page remains. Redirecting every removed product to a category creates a misleading destination.&lt;/p&gt;
      &lt;p&gt;Update the visible page, Product data, merchant feed, internal recommendations, and sitemap policy together. A status badge changed in one system is not enough when another still advertises the item as in stock.&lt;/p&gt;

      &lt;h2 id=&quot;7-make-product-media-crawlable-useful-and-fast&quot;&gt;7. Make product media crawlable, useful, and fast&lt;/h2&gt;
      &lt;p&gt;Use standard HTML image elements, descriptive alternative text where the image conveys information, explicit dimensions, responsive sources, a fallback &lt;code&gt;src&lt;/code&gt;, and formats appropriate to the content. Google says it can find images in an &lt;code&gt;img&lt;/code&gt; element, including inside &lt;code&gt;picture&lt;/code&gt;, but not an image supplied only as a CSS background. Its current &lt;a href=&quot;https://developers.google.com/search/docs/appearance/google-images&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;image SEO guidance&lt;/a&gt; also recommends responsive delivery and balancing quality with page weight.&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;Show the real product clearly before lifestyle or decorative images.&lt;/li&gt;
        &lt;li&gt;Include useful angles, scale, materials, controls, packaging, and included items when relevant.&lt;/li&gt;
        &lt;li&gt;Update media when a selected variant materially changes appearance.&lt;/li&gt;
        &lt;li&gt;Do not place product names, specifications, or care instructions only inside images.&lt;/li&gt;
        &lt;li&gt;Load the primary product image promptly; defer below-the-fold media when appropriate.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Use the &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/mobile-seo-checklist&quot;&gt;mobile SEO checklist&lt;/a&gt; to confirm that galleries, selectors, tables, sticky actions, and supporting content remain usable on the smaller layout.&lt;/p&gt;

      &lt;h2 id=&quot;8-match-product-data-to-the-visible-offer&quot;&gt;8. Match Product data to the visible offer&lt;/h2&gt;
      &lt;p&gt;Add Product markup to a page about a specific product or deliberate variant group, not to a category containing unrelated products. Google's &lt;a href=&quot;https://developers.google.com/search/docs/appearance/structured-data/product&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Product structured data introduction&lt;/a&gt; distinguishes product snippets from merchant listings and notes that supported search appearances can include price, availability, ratings, shipping, and return information. Eligibility does not guarantee a rich result.&lt;/p&gt;
      &lt;p&gt;For a page where customers can purchase, follow the current &lt;a href=&quot;https://developers.google.com/search/docs/appearance/structured-data/merchant-listing&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;merchant listing requirements&lt;/a&gt;. Start with accurate identity and offer data, then add applicable properties the store can keep current:&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;product name, image, description, brand, and stable identifiers;&lt;/li&gt;
        &lt;li&gt;offer URL, active price, currency, availability, and condition;&lt;/li&gt;
        &lt;li&gt;shipping or return information when supported and accurate;&lt;/li&gt;
        &lt;li&gt;ratings and reviews only when visible and about the marked-up product;&lt;/li&gt;
        &lt;li&gt;variant grouping that matches the page and URL behavior.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Validate the markup, then compare it with the rendered page and merchant feed. The correct test is not merely &amp;ldquo;no critical errors.&amp;rdquo; It is &amp;ldquo;the marked-up offer is the offer a customer can actually select and buy.&amp;rdquo;&lt;/p&gt;

      &lt;h2 id=&quot;9-release-one-representative-template-set&quot;&gt;9. Release one representative template set&lt;/h2&gt;
      &lt;ol&gt;
        &lt;li&gt;&lt;strong&gt;Select the sample.&lt;/strong&gt; Use one category, one subcategory, a simple product, a variant group, an unavailable product, and a discontinued product.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Inspect initial and rendered output.&lt;/strong&gt; Confirm titles, headings, canonical, links, content, media, selection state, Product data, and purchase state.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Test the crawl path.&lt;/strong&gt; Start at the parent navigation and reach every sample product through ordinary anchors.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Test mobile interaction.&lt;/strong&gt; Use real selector, gallery, filter, accordion, comparison, cart, and inquiry paths.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Compare systems.&lt;/strong&gt; Reconcile the visible page, structured data, merchant feed, sitemap, inventory source, and Search Console inspection.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Expand only after the sample passes.&lt;/strong&gt; Roll out the corrected template, then crawl the affected URL pattern and watch for new duplicates or missing products.&lt;/li&gt;
      &lt;/ol&gt;
      &lt;p&gt;If a defect appears across every product or category, fix the shared source. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://floxolab.com/seo/guides/technical-seo-fixes-agencies-wont-touch&quot;&gt;template-level technical SEO guide&lt;/a&gt; explains how to name the generator, owner, rollback path, and post-release test.&lt;/p&gt;

      &lt;h2&gt;What not to do&lt;/h2&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Do not paste one long keyword paragraph above every product grid.&lt;/strong&gt; Orient the shopper and expose the inventory.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not make products discoverable only through search or interaction.&lt;/strong&gt; Build crawlable category and pagination paths.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not create a separate indexable URL for every selectable state by accident.&lt;/strong&gt; Choose and enforce a variant model.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not canonicalize distinct useful products to a category.&lt;/strong&gt; Consolidate only genuine duplicate or alternate URLs.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not mark up data customers cannot see or verify.&lt;/strong&gt; Structured data must match the visible offer.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not delete temporarily unavailable products by default.&lt;/strong&gt; Separate temporary stock state from permanent removal.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not hide specifications inside images or PDFs.&lt;/strong&gt; Keep decision-critical facts in accessible HTML.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Do not publish a template change across the full catalog without a representative sample and rollback path.&lt;/strong&gt;&lt;/li&gt;
      &lt;/ul&gt;

      &lt;h2&gt;Verification checklist&lt;/h2&gt;
      &lt;ul&gt;
        &lt;li&gt;Each category has a distinct scope, useful inventory, and meaningful narrowing controls.&lt;/li&gt;
        &lt;li&gt;Each product page identifies the item and exposes price, availability, options, specifications, delivery, and returns as applicable.&lt;/li&gt;
        &lt;li&gt;Every intended product is reachable through crawlable category or pagination links.&lt;/li&gt;
        &lt;li&gt;Related links represent compatibility, substitution, support, or a real next decision.&lt;/li&gt;
        &lt;li&gt;The store uses one documented URL and canonical model for variants.&lt;/li&gt;
        &lt;li&gt;Temporarily unavailable and permanently removed products follow different rules.&lt;/li&gt;
        &lt;li&gt;Primary media uses standard HTML, useful alt text, dimensions, responsive sources, and a fallback URL.&lt;/li&gt;
        &lt;li&gt;Visible offer data, Product markup, merchant feed, inventory source, and selected variant agree.&lt;/li&gt;
        &lt;li&gt;Category pages do not use Product markup for a mixed inventory set.&lt;/li&gt;
        &lt;li&gt;Representative desktop and mobile templates pass before catalog-wide release.&lt;/li&gt;
        &lt;li&gt;A post-release crawl finds no new duplicate titles, conflicting canonicals, broken links, or orphan products.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;The page templates are ready when a shopper can move from a meaningful category to a specific product decision, and the same relationship remains clear in links, URLs, media, offer data, and rendered HTML.&lt;/p&gt;

      &lt;h2 id=&quot;evidence-basis&quot;&gt;Evidence basis&lt;/h2&gt;
      &lt;p&gt;Google's ecommerce navigation, URL structure, Product, merchant listing, product variant, and image guidance were checked from official documentation on August 23, 2026. The page-job map, template sample, release sequence, and availability decisions are FloxoLab implementation frameworks, not Google ranking factors or guarantees.&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/specialty/ecommerce/help-google-understand-your-ecommerce-site-structure&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;Google Sea&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/25633/product-and-category-page-seo</guid>
<pubDate>Sat, 29 Aug 2026 03:50:01 +0000</pubDate>
</item>
<item>
<title>SaaS Analytics and Product Intelligence for Data-Driven Growth</title>
<link>https://coderlegion.com/20297/saas-analytics-and-product-intelligence-for-data-driven-growth</link>
<description>&lt;h2 id=&quot;quick-overview&quot;&gt;Quick Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SaaS analytics transforms scattered product data into usable insights&lt;br&gt;
for retention, revenue, and roadmap decisions.&lt;/li&gt;
&lt;li&gt;Product intelligence links user behavior to business results through&lt;br&gt;
event tracking and cohort analysis.&lt;/li&gt;
&lt;li&gt;The right analytics stack lowers churn by identifying friction points&lt;br&gt;
before they affect revenue.&lt;/li&gt;
&lt;li&gt;Real-time dashboards help teams shift from reactive reporting to&lt;br&gt;
proactive product decisions.&lt;/li&gt;
&lt;li&gt;Choosing tools that work with your current dev workflow saves&lt;br&gt;
engineering time in the long run.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Have you ever launched a feature, waited several weeks for results, and still been unable to determine whether it was effective? You are not alone. Most SaaS teams possess extensive user data but lack the appropriate systems to convert that data into actionable decisions. Dashboards exist; however, they are frequently disconnected, outdated, or fail to address the pertinent questions.&lt;/p&gt;
&lt;p&gt;Product intelligence is crucial, not for collecting more data but for linking existing data to key questions. Why do users disengage after onboarding? Which features support retention? Where does your team focus on seldom-used features? Let's explore modern SaaS analytics, what makes a valuable product intelligence stack, and how teams use these insights to grow without guessing.&lt;/p&gt;
&lt;h2 id=&quot;why-saas-analytics-is-the-backbone-of-product-decisions&quot;&gt;Why SaaS Analytics Is the Backbone of Product Decisions&lt;/h2&gt;
&lt;p&gt;SaaS analytics tracks user engagement from sign-up to cancellation, including event monitoring, funnel analysis, cohort behavior, feature adoption, and revenue. Effective analytics focus on context—like whether increased active users perform key actions or if changes in session length reflect disengagement or improved efficiency. Combining behavioral data with business context helps teams interpret signals accurately instead of reacting to distractions. &lt;/p&gt;
&lt;p&gt;Many growing companies work with a &lt;a rel=&quot;nofollow&quot; href=&quot;https://wpwebinfotech.com/saas-development/&quot;&gt;SaaS development agency&lt;/a&gt; to set up this layer correctly from the beginning. Retrofitting analytics into an established codebase is much harder than planning for it from day one. Proper instrumentation, event classification, and data pipeline setup lay the groundwork for every insight that follows. &lt;/p&gt;
&lt;p&gt;This is also where teams begin to recognize how choices regarding data infrastructure have broader effects. A product built with clear, well-documented event schemas not only produces better reports but also speeds up every future integration, A/B test, or customer segmentation effort.&lt;/p&gt;
&lt;h2 id=&quot;how-product-intelligence-connects-data-to-decisions&quot;&gt;How Product Intelligence Connects Data to Decisions&lt;/h2&gt;
&lt;p&gt;Product intelligence takes raw analytics data and adds the &quot;why&quot; behind user behavior. While analytics tells you what happened, such as when a user clicked a button, completed a workflow, or abandoned a session, product intelligence explains why it happened and what to do next.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This usually involves several key components working together:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Event tracking and tagging:&lt;/strong&gt; Every important user action gets logged &lt;br&gt;
with context, including timestamp, user segment, device, and session&lt;br&gt;
details. Without consistent tagging rules, it becomes nearly &lt;br&gt;
impossible to analyze this data at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cohort and segmentation analysis:&lt;/strong&gt; Grouping users by signup date,&lt;br&gt;
plan tier, acquisition channel, or behavior pattern reveals trends&lt;br&gt;
hidden in the aggregated data. A feature might be very popular with&lt;br&gt;
enterprise users but ignored by free-tier accounts, and that&lt;br&gt;
difference is important for prioritizing efforts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Funnel and retention curves:&lt;/strong&gt; Mapping the path from trial to paid&lt;br&gt;
conversion, or from first login to regular use, shows exactly where&lt;br&gt;
users encounter obstacles. These drop-off points are often where&lt;br&gt;
product teams find the most effective areas for improvement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature adoption tracking:&lt;/strong&gt; Understanding which features get used&lt;br&gt;
regularly and which remain unused helps teams avoid the mistake of&lt;br&gt;
building more without removing what doesn’t work.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When these components connect through a unified data layer rather than being scattered across different tools, teams stop debating opinions in meetings and start looking at evidence.&lt;/p&gt;
&lt;h2 id=&quot;building-an-analytics-stack-that-doesn-t-slow-down-your-team&quot;&gt;Building an Analytics Stack That Doesn't Slow Down Your Team&lt;/h2&gt;
&lt;p&gt;A common mistake is adding analytics tools to a product after it launches. This often leads to more technical debt than valuable insights. Engineering teams end up managing multiple SDKs, duplicate event schemas, and different data definitions across departments.&lt;/p&gt;
&lt;p&gt;A better approach starts with defining a shared event taxonomy before implementing any tools. This involves getting agreement from product, engineering, and growth teams on what qualifies as a &quot;conversion,&quot; how to name user properties, and which events are critical versus optional. This initial agreement not only improves reporting accuracy, but it can also &lt;a rel=&quot;nofollow&quot; href=&quot;https://tivazo.com/blogs/boost-efficiency-with-top-web-development-tips/&quot;&gt;boost web development efficiency&lt;/a&gt; by reducing the back-and-forth between teams trying to solve mismatched data definitions later.&lt;/p&gt;
&lt;p&gt;Most modern tech stacks rely on a customer data platform (CDP) to centralize event collection. This platform then feeds into analytics tools for dashboards and reporting, as well as operational tools for triggering emails, in-app messages, or sales alerts. This separation of collection and activation allows teams to avoid being tied to a single vendor's reporting limitations.&lt;/p&gt;
&lt;p&gt;API-first analytics platforms have become the norm because they enable engineering teams to send data once and route it to any downstream tool. This approach eliminates the need to implement separate tracking code for each tool, reducing both implementation time and long-term maintenance.&lt;/p&gt;
&lt;h2 id=&quot;turning-insights-into-action-real-world-applications&quot;&gt;Turning Insights Into Action: Real-World Applications&lt;/h2&gt;
&lt;p&gt;Data sitting in a dashboard doesn't grow a business. Here's how teams actually use these insights: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reducing onboarding drop-off:&lt;/strong&gt; By mapping the exact steps where new&lt;br&gt;
users leave during setup, teams can find out if the issue is &lt;br&gt;
confusion with the interface, lack of clear value, or technical &lt;br&gt;
problems like slow loading times.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prioritizing the roadmap with usage data:&lt;/strong&gt; Instead of focusing on the&lt;br&gt;
loudest customer requests, teams can compare feature requests with&lt;br&gt;
actual usage patterns from similar user groups. This helps predict&lt;br&gt;
the impact before committing engineering resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identifying expansion revenue opportunities:&lt;/strong&gt; Usage-based triggers,&lt;br&gt;
such as a user nearing their plan limit or using a feature that&lt;br&gt;
typically leads to upgrades, can highlight accounts that are ready&lt;br&gt;
for a sales conversation or an in-app upsell prompt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spotting churn risk early:&lt;/strong&gt; Declining engagement scores, less&lt;br&gt;
frequent logins, or incomplete key workflows often happen weeks&lt;br&gt;
before someone cancels. Catching these signs early gives customer&lt;br&gt;
success teams a chance to intervene.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The common thread among all these points is that &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.sisense.com/glossary/saas-analytics/&quot;&gt;SaaS analytics&lt;/a&gt; works best when it is part of daily workflows, rather than reviewed quarterly in a static report.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;SaaS analytics and product intelligence are essential for growing software companies. They serve as the foundation for making decisions based on evidence instead of guesswork. From clean event tracking to cohort-based retention analysis, the aim is to connect what users do with why they do it. This connection helps create a product that users want to keep using. Teams that invest in this foundation early move faster, waste less engineering time on features that go unused, and catch problems before they become costly.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions&quot;&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;h3 id=&quot;1-what-is-the-difference-between-saas-analytics-and-product-analytics-&quot;&gt;1. What is the difference between SaaS analytics and product analytics?&lt;/h3&gt;
&lt;p&gt;SaaS analytics looks at business-level metrics like MRR, churn rate, and customer acquisition cost. Product analytics focuses on in-app user behavior, such as feature usage and session flows. Most modern platforms combine both for a full view.  &lt;/p&gt;
&lt;h3 id=&quot;2-what-metrics-matter-most-for-saas-growth-&quot;&gt;2. What metrics matter most for SaaS growth?&lt;/h3&gt;
&lt;p&gt;Key metrics include monthly recurring revenue (MRR), churn rate, customer lifetime value (CLV), feature adoption rate, and net revenue retention. The right mix depends on whether the emphasis is on acquisition, retention, or expansion.  &lt;/p&gt;
&lt;h3 id=&quot;3-how-do-i-choose-the-right-analytics-tool-for-my-saas-product-&quot;&gt;3. How do I choose the right analytics tool for my SaaS product?&lt;/h3&gt;
&lt;p&gt;Look for tools that integrate well with your current tech stack and support the level of event tracking you need. They should not require constant engineering help to manage. API-first platforms usually scale better as needs change.  &lt;/p&gt;
&lt;h3 id=&quot;4-can-small-saas-startups-benefit-from-product-intelligence-or-is-it-only-for-large-companies-&quot;&gt;4. Can small SaaS startups benefit from product intelligence, or is it only for large companies?&lt;/h3&gt;
&lt;p&gt;Small teams often gain the most benefit because early data helps confirm product decisions before scaling. The key is to start with a few important metrics rather than trying to track everything at once.  &lt;/p&gt;
&lt;h3 id=&quot;5-how-often-should-saas-teams-review-analytics-data-&quot;&gt;5. How often should SaaS teams review analytics data?&lt;/h3&gt;
&lt;p&gt;Important metrics like activation rates and churn signals should be watched continuously or weekly. Broader strategic metrics like retention cohorts are usually reviewed monthly or quarterly to identify trends.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/20297/saas-analytics-and-product-intelligence-for-data-driven-growth</guid>
<pubDate>Thu, 11 Jun 2026 12:29:38 +0000</pubDate>
</item>
<item>
<title>Every Feature Proposal Is an Argument: What 1958 Philosophy Teaches Product Teams</title>
<link>https://coderlegion.com/19538/every-feature-proposal-is-an-argument-what-1958-philosophy-teaches-product-teams</link>
<description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a rel=&quot;nofollow&quot; href=&quot;https://vibeagentmaking.com/blog/every-feature-proposal-is-an-argument/&quot;&gt;vibeagentmaking.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;80% of features in B2B software are rarely or never used. 12% drive 80% of daily usage. This isn't a prioritization-framework problem. It's an argumentation problem.&lt;/p&gt;
&lt;h3 id=&quot;the-hidden-warrant&quot;&gt;The Hidden Warrant&lt;/h3&gt;
&lt;p&gt;In 1958, S. Toulmin published &lt;em&gt;The Uses of Argument&lt;/em&gt;, decomposing practical argument into claims, grounds, warrants, and rebuttals. The part product teams almost always skip is the &lt;strong&gt;warrant&lt;/strong&gt; -- the usually-unstated principle linking data to conclusion.&lt;/p&gt;
&lt;p&gt;&quot;We should build SSO&quot; is the claim. The 62% request rate is the grounds. The warrant -- &quot;enterprise feature requests reliably predict enterprise revenue&quot; -- is never stated, never inspected, and might be wrong.&lt;/p&gt;
&lt;h3 id=&quot;where-arguments-die&quot;&gt;Where Arguments Die&lt;/h3&gt;
&lt;p&gt;Product management produces hidden warrants at scale:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Customer requests predict usage.&lt;/em&gt; Pendo's 80% stat says otherwise.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Competitor parity drives retention.&lt;/em&gt; More often, the competitor shipped it because their customers asked too, and nobody used it there either.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Our biggest customer's feedback generalizes.&lt;/em&gt; The biggest customer is, by construction, an outlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kohavi's 1/3 rule: when warrants are actually tested, one in three ideas is positive, one in three is flat, one in three is negative.&lt;/p&gt;
&lt;h3 id=&quot;why-rice-isn-t-enough&quot;&gt;Why RICE Isn't Enough&lt;/h3&gt;
&lt;p&gt;Frameworks that make warrants visible (Kano, Opportunity Scoring) are discovery tools. Frameworks that hide warrants (RICE, ICE) are ranking tools. A culture relying on RICE alone stacks ranked claims on unexamined warrants.&lt;/p&gt;
&lt;h3 id=&quot;the-hippo-problem&quot;&gt;The HiPPO Problem&lt;/h3&gt;
&lt;p&gt;The HiPPO rarely brings grounds. She brings a claim and a silent warrant: &lt;em&gt;I have taste.&lt;/em&gt; The fix: require a warrant section in every proposal regardless of seniority. The HiPPO now writes her reasoning down where it can be cross-examined.&lt;/p&gt;
&lt;h3 id=&quot;what-changes-monday&quot;&gt;What Changes Monday&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Every proposal has a &lt;strong&gt;warrant section&lt;/strong&gt;: &quot;These grounds support this claim because [causal theory].&quot;&lt;/li&gt;
&lt;li&gt;Every proposal has a &lt;strong&gt;rebuttal section&lt;/strong&gt;: &quot;This feature will have failed if [condition] by [date].&quot;&lt;/li&gt;
&lt;li&gt;Reviewers attack the warrant, not the data.&lt;/li&gt;
&lt;li&gt;Same template for the HiPPO and the intern.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A small improvement in warrant quality compounds hard against that 80% baseline.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19538/every-feature-proposal-is-an-argument-what-1958-philosophy-teaches-product-teams</guid>
<pubDate>Wed, 03 Jun 2026 00:42:25 +0000</pubDate>
</item>
<item>
<title>AI Makes Us Faster. Agile Keeps Us Pointed in the Right Direction.</title>
<link>https://coderlegion.com/18394/ai-makes-us-faster-agile-keeps-us-pointed-in-the-right-direction</link>
<description>&lt;p&gt;AI coding tools are changing the development loop.&lt;/p&gt;
&lt;p&gt;With tools like Claude Code, Cursor, and GitHub Copilot, a solo developer can build screens, wire APIs, generate logic, and deploy much faster than before.&lt;/p&gt;
&lt;p&gt;That is exciting.&lt;/p&gt;
&lt;p&gt;But it also creates a new problem.&lt;/p&gt;
&lt;p&gt;If we can build faster, we can also move in the wrong direction faster.&lt;/p&gt;
&lt;p&gt;That is why I started thinking about Agile again.&lt;/p&gt;
&lt;p&gt;Not as a set of meetings.&lt;br&gt;
Not as Scrum rituals.&lt;br&gt;
Not as a way to increase velocity.&lt;/p&gt;
&lt;p&gt;But as a way to validate direction.&lt;/p&gt;
&lt;h3 id=&quot;speed-does-not-replace-direction&quot;&gt;Speed does not replace direction&lt;/h3&gt;
&lt;p&gt;Before AI, implementation was often the bottleneck.&lt;/p&gt;
&lt;p&gt;Even if a team knew what to build, actually building it took time. That slow process naturally created moments to think, question, and refine the direction.&lt;/p&gt;
&lt;p&gt;Now the implementation loop is much faster.&lt;/p&gt;
&lt;p&gt;You describe a screen, and code appears.&lt;br&gt;
You describe an API, and endpoints are generated.&lt;br&gt;
You describe a workflow, and an assistant can produce a working draft.&lt;/p&gt;
&lt;p&gt;That speed is useful. But it can also hide a dangerous pattern.&lt;/p&gt;
&lt;p&gt;You ship one feature, then immediately see the next one.&lt;br&gt;
Then the next.&lt;br&gt;
Then another.&lt;/p&gt;
&lt;p&gt;Before asking whether the current feature actually solved a real problem, you are already building the next thing.&lt;/p&gt;
&lt;p&gt;Fast completion is not the danger.&lt;br&gt;
Fast certainty is.&lt;/p&gt;
&lt;h3 id=&quot;agile-was-never-just-about-moving-faster&quot;&gt;Agile was never just about moving faster&lt;/h3&gt;
&lt;p&gt;Agile is often misunderstood as a fast development methodology.&lt;/p&gt;
&lt;p&gt;Run sprints.&lt;br&gt;
Do standups.&lt;br&gt;
Track velocity.&lt;br&gt;
Ship often.&lt;/p&gt;
&lt;p&gt;But the deeper point of Agile is not speed.&lt;/p&gt;
&lt;p&gt;It is feedback.&lt;/p&gt;
&lt;p&gt;Build something small enough to test.&lt;br&gt;
Show it to real users.&lt;br&gt;
Observe what changes.&lt;br&gt;
Adjust direction before the cost of being wrong becomes too high.&lt;/p&gt;
&lt;p&gt;A sprint without feedback is just Waterfall with shorter cycles.&lt;/p&gt;
&lt;p&gt;This matters even more in the AI era.&lt;/p&gt;
&lt;p&gt;AI can accelerate the “build” part of the loop. But it does not automatically answer the more important questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Who is this for?&lt;/li&gt;
&lt;li&gt;What problem does it solve?&lt;/li&gt;
&lt;li&gt;Is this problem painful enough?&lt;/li&gt;
&lt;li&gt;Did the user actually need this?&lt;/li&gt;
&lt;li&gt;What did we learn after shipping?&lt;/li&gt;
&lt;li&gt;Are we improving the product, or just adding more features?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those questions still belong to people.&lt;/p&gt;
&lt;h3 id=&quot;for-solo-developers-and-founders&quot;&gt;For solo developers and founders&lt;/h3&gt;
&lt;p&gt;This is especially important for solo developers and indie founders.&lt;/p&gt;
&lt;p&gt;AI makes it easier to build an MVP in a day.&lt;/p&gt;
&lt;p&gt;But an MVP is not just a smaller product.&lt;br&gt;
It is a smaller piece of evidence.&lt;/p&gt;
&lt;p&gt;A landing page can be an MVP.&lt;br&gt;
A manual workflow can be an MVP.&lt;br&gt;
Five user interviews can be an MVP.&lt;/p&gt;
&lt;p&gt;The goal is not to prove that you can build something.&lt;br&gt;
The goal is to test whether the problem is real.&lt;/p&gt;
&lt;p&gt;For founders, Agile is less about team process and more about hypothesis validation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Problem hypothesis&lt;/li&gt;
&lt;li&gt;Customer hypothesis&lt;/li&gt;
&lt;li&gt;Channel hypothesis&lt;/li&gt;
&lt;li&gt;Pricing hypothesis&lt;/li&gt;
&lt;li&gt;Retention hypothesis&lt;/li&gt;
&lt;li&gt;Feature hypothesis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the problem hypothesis is wrong, building more features will not save the product.&lt;/p&gt;
&lt;h3 id=&quot;for-teams-using-ai&quot;&gt;For teams using AI&lt;/h3&gt;
&lt;p&gt;In teams, AI can increase output quickly.&lt;/p&gt;
&lt;p&gt;More tickets closed.&lt;br&gt;
More pull requests opened.&lt;br&gt;
More features shipped.&lt;/p&gt;
&lt;p&gt;But more output does not always mean more product value.&lt;/p&gt;
&lt;p&gt;A team can ship eight AI-assisted features in a sprint and still see no change in retention, activation, or user satisfaction.&lt;/p&gt;
&lt;p&gt;That is why the Definition of Done also needs to evolve.&lt;/p&gt;
&lt;p&gt;In the AI era, “done” should not only mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;code reviewed&lt;/li&gt;
&lt;li&gt;tests passed&lt;/li&gt;
&lt;li&gt;deployed successfully&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It should also ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can the team explain the AI-generated code?&lt;/li&gt;
&lt;li&gt;Does this feature solve a specific user problem?&lt;/li&gt;
&lt;li&gt;Is there a way to observe whether it works?&lt;/li&gt;
&lt;li&gt;Did we define what we expect to learn?&lt;/li&gt;
&lt;li&gt;Will this change inform the next decision?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI can help us build faster.&lt;br&gt;
But direction still needs to be verified.&lt;/p&gt;
&lt;h3 id=&quot;agile-as-a-direction-validation-loop&quot;&gt;Agile as a direction validation loop&lt;/h3&gt;
&lt;p&gt;The way I now understand Agile is simple:&lt;/p&gt;
&lt;p&gt;Question → Hypothesis → Build → Observe → Adjust&lt;/p&gt;
&lt;p&gt;AI can accelerate Build.&lt;br&gt;
It may also help with Observe.&lt;/p&gt;
&lt;p&gt;But Question, Hypothesis, and Adjust still require human judgment.&lt;/p&gt;
&lt;p&gt;That is where Agile still matters.&lt;/p&gt;
&lt;p&gt;Not because teams need more rituals.&lt;br&gt;
Not because every company needs Scrum.&lt;br&gt;
Not because velocity should go up.&lt;/p&gt;
&lt;p&gt;But because faster development makes wrong direction more expensive.&lt;/p&gt;
&lt;p&gt;I wrote a longer Deep Dive on this idea here:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dechive.dev/en/deep-dive/ai-era-agile-verification&quot;&gt;https://dechive.dev/en/deep-dive/ai-era-agile-verification&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/18394/ai-makes-us-faster-agile-keeps-us-pointed-in-the-right-direction</guid>
<pubDate>Wed, 20 May 2026 04:54:12 +0000</pubDate>
</item>
<item>
<title> The Indie Hacker’s Manifesto: Stop Coding, Start Shipping</title>
<link>https://coderlegion.com/15805/the-indie-hackers-manifesto-stop-coding-start-shipping</link>
<description>&lt;h3 id=&quot;i-strategy-finding-the-arbitrage-of-mediocrity-&quot;&gt;I. Strategy: Finding the &quot;Arbitrage of Mediocrity&quot;&lt;/h3&gt;
&lt;h4 id=&quot;1-the-differentiation-framework&quot;&gt;1. The Differentiation Framework&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The &quot;Goldilocks&quot; Niche:&lt;/strong&gt; Don’t go so niche that the market doesn’t exist. If there’s zero competition, there’s likely zero money. Aim for &quot;Niche but Scalable.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensional Attacks:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attack Open Source:&lt;/strong&gt; Most OSS tools are powerful but &quot;ugly,&quot; hard to configure, and lack support. Your opportunity? Build a &lt;strong&gt;Better UI/UX Wrapper&lt;/strong&gt; that provides a &quot;plug-and-play&quot; experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unbundle the Giants:&lt;/strong&gt; SaaS giants (Salesforce, Adobe, Jira) are bloated, expensive, and forced subscriptions. Your opportunity? Build a &lt;strong&gt;Lightweight, Privacy-First, One-Time Payment&lt;/strong&gt; alternative for just &lt;em&gt;one&lt;/em&gt; specific feature.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The 3-Star Arbitrage:&lt;/strong&gt; Scour Product Hunt or the App Store for famous products with a &lt;strong&gt;3.2-star rating&lt;/strong&gt;. Read the complaints. Fix that &lt;em&gt;one&lt;/em&gt; specific pain point and release it as a standalone micro-tool.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-geopolitical-arbitrage&quot;&gt;2. Geopolitical Arbitrage&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Willingness to Pay (WTP):&lt;/strong&gt; Target markets with high disposable income and a culture of paying for software (North America, DACH region, UK). &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ignore Low-Value Noise:&lt;/strong&gt; Don't waste your support time on markets that demand &quot;free&quot; unless you are building a non-profit.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;ii-development-escaping-the-productivity-porn-trap&quot;&gt;II. Development: Escaping the &quot;Productivity Porn&quot; Trap&lt;/h3&gt;
&lt;h4 id=&quot;3-the-embarrassment-principle&quot;&gt;3. The &quot;Embarrassment&quot; Principle&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core Logic Only:&lt;/strong&gt; If a feature doesn't solve the primary pain point, it’s a distraction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Reid Hoffman Rule:&lt;/strong&gt; &quot;If you are not embarrassed by the first version of your product, you’ve launched too late.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-the-developer-s-comfort-zone&quot;&gt;4. The Developer’s Comfort Zone&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stop Building Tools for Yourself:&lt;/strong&gt; Spending three weeks writing a &quot;custom Twitter bot&quot; instead of actually talking to users is just &lt;strong&gt;procrastination disguised as work.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The 70/30 Rule:&lt;/strong&gt; Spend &lt;strong&gt;30%&lt;/strong&gt; of your time coding and &lt;strong&gt;70%&lt;/strong&gt; marketing. Great code that nobody finds is just a graveyard of wasted hours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code Freeze:&lt;/strong&gt; Once you launch, stop touching the CSS. Unless it’s a critical bug, put the keyboard away and pick up the megaphone.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;iii-marketing-weaponizing-distribution&quot;&gt;III. Marketing: Weaponizing Distribution&lt;/h3&gt;
&lt;h4 id=&quot;5-high-roi-channels&quot;&gt;5. High-ROI Channels&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Channel &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Why it Works &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;The Catch&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Reddit&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;High intent, niche subreddits. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;They hate &quot;Salesmen.&quot; Must provide value.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;X / Twitter&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;The home of &quot;Building in Public.&quot; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Requires consistent personality.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Hacker News&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Can trigger massive viral traffic. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Highly critical audience. No marketing fluff allowed.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Product Hunt&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;The &quot;Grand Opening&quot; of the tech world. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Only lasts 24 hours. Needs a launch strategy.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;6-fighting-the-algorithm&quot;&gt;6. Fighting the Algorithm&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Human-to-Human (H2H):&lt;/strong&gt; Platforms hate &quot;Corporate&quot; ads. Use &lt;strong&gt;Storytelling&lt;/strong&gt;. Talk about your failures, your tech stack, or &quot;The one thing I learned building X.&quot; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Incognito Test:&lt;/strong&gt; Always check your posts in &lt;strong&gt;Incognito/Private mode&lt;/strong&gt;. If you don't see it, you've been shadowbanned or filtered. Don't wait for stats—verify visibility immediately.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;iv-the-moat-trust-amp-passive-traffic&quot;&gt;IV. The Moat: Trust &amp;amp; Passive Traffic&lt;/h3&gt;
&lt;h4 id=&quot;7-trust-engineering&quot;&gt;7. Trust Engineering&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Show, Don't Tell:&lt;/strong&gt; In an era of AI scams, trust is the only currency. Offer &quot;Local-First&quot; processing, &quot;No-Tracking&quot; guarantees, or high-quality interactive Demos that don't require an email signup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero-Friction Entry:&lt;/strong&gt; Reduce the &quot;Aha! Moment&quot; time. If I have to confirm my email and set up a profile just to see how your tool works, I'm already gone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;8-aieo-ai-engine-optimization-&quot;&gt;8. AIEO (AI Engine Optimization)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Programmatic SEO:&lt;/strong&gt; Create landing pages for &quot;Long-tail&quot; keywords (e.g., &quot;Best lightweight Alternative to X for Mac&quot;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The llms.txt Standard:&lt;/strong&gt; Deploy an &lt;code&gt;llms.txt&lt;/code&gt; file in your root directory. This provides a clean, markdown-based summary for LLMs (ChatGPT, Perplexity, Claude) to read. When a user asks an AI for a &quot;tool that does X,&quot; you want the AI to recommend &lt;em&gt;you&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;v-post-launch-surviving-the-trough-of-sorrow-&quot;&gt;V. Post-Launch: Surviving the &quot;Trough of Sorrow&quot;&lt;/h3&gt;
&lt;h4 id=&quot;9-the-72-hour-rule&quot;&gt;9. The 72-Hour Rule&lt;/h4&gt;
&lt;p&gt;After the initial launch buzz, your traffic will drop to near-zero. &lt;strong&gt;This is normal.&lt;/strong&gt; Do not panic. Do not rewrite the codebase. Stick to your marketing plan for at least three days before making a pivot.&lt;/p&gt;
&lt;h4 id=&quot;10-the-asset-mindset&quot;&gt;10. The Asset Mindset&lt;/h4&gt;
&lt;p&gt;Everything you build—the domain, the code snippets, the backlinked landing pages—is &lt;strong&gt;Digital Real Estate.&lt;/strong&gt; Even if the product fails to generate revenue today, the &quot;Domain Authority&quot; and the &quot;Skill&quot; you’ve built are assets for your next ship.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;The Bottom Line:&lt;/strong&gt; Be a &lt;strong&gt;Marketer who knows how to Code&lt;/strong&gt;, not a Programmer who &quot;tries&quot; to Market.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://we1.top&quot;&gt;author&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://airouter.me&quot;&gt;web&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://nestifyapp.org&quot;&gt;Organization&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;buildinpublic-indiehackers-solopreneur&quot;&gt;BuildInPublic #IndieHackers #Solopreneur&lt;/h2&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/15805/the-indie-hackers-manifesto-stop-coding-start-shipping</guid>
<pubDate>Sat, 25 Apr 2026 11:39:31 +0000</pubDate>
</item>
<item>
<title>What to Build Next After You've Vibe-Coded Your First App</title>
<link>https://coderlegion.com/13354/what-to-build-next-after-youve-vibe-coded-your-first-app</link>
<description>&lt;p&gt;You vibe-coded your app. It's live. People can use it. And now you're sitting in front of a blank roadmap with twenty ideas and no idea which one actually matters.&lt;/p&gt;
&lt;p&gt;Your Replit project or Lovable app got you here faster than you expected. The AI generated the code, you iterated on it, you shipped. That part was almost fun. But now the adrenaline of launching has worn off and you're facing a different kind of problem.&lt;/p&gt;
&lt;p&gt;You could add a notification system. You could build an admin dashboard. You could integrate with Stripe. You could redesign the onboarding. You could add a team feature. You could build out the mobile version. Any of these could be the thing that unlocks growth. Or any of them could be a week wasted on something nobody wanted.&lt;/p&gt;
&lt;p&gt;Every day you spend building the wrong thing is a day of runway you don't get back. And if you're a non-technical founder, figuring out &quot;what's the right thing&quot; feels like guessing in the dark. Your dev team or your AI tools can build whatever you tell them to build. The hard part is telling them the right thing.&lt;/p&gt;
&lt;p&gt;Building a product has never been easier. AI code tools and no-code platforms made the construction part cheap and fast. But that speed made something else very visible: the real risk was never building. The real risk is building the wrong thing. And the cost of being wrong just accelerated because now you can waste a sprint in days instead of months.&lt;/p&gt;
&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; href=&quot;https://wednesday.is/servicing/launch/sprint-zero?utm_source=dev.to&quot;&gt;Wednesday Solutions&lt;/a&gt;, we've spent 15+ years helping founders - especially non-technical founders - figure out what to build and why. Our Sprint Zero process replaces the blank roadmap with a Traction Roadmap: we map your funnel with real data, identify where it's leaking, run user conversations to find the root cause, and hand you 2-3 scoped sprints with success metrics - all in about two weeks. We carry a &lt;a rel=&quot;nofollow&quot; href=&quot;https://clutch.co/profile/wednesday-solutions?sort_by=date_desc&amp;amp;utm_source=dev.to#reviews&quot;&gt;4.8/5.0 rating on Clutch across 20+ reviews&lt;/a&gt;, mostly from founders who were staring at the same blank roadmap you are right now. We recently helped a vibe-coded app go from launch to &lt;a rel=&quot;nofollow&quot; href=&quot;https://clutch.co/go-to-review/539153e1-8980-49f6-8fac-d0f8a77aab34/396710&quot;&gt;$50,000 in revenue in one week&lt;/a&gt; - not by building more, but by building the right thing.&lt;/p&gt;
&lt;p&gt;Here's the system for making that call with confidence.&lt;/p&gt;
&lt;h3 id=&quot;step-1-pick-the-one-number-that-decides-what-you-build&quot;&gt;Step 1: Pick the one number that decides what you build&lt;/h3&gt;
&lt;p&gt;When you sit down to plan what's next, the instinct is to think in features. &quot;We should add notifications.&quot; &quot;Let's build a dashboard.&quot; &quot;Competitors have a calendar view, we need one too.&quot;&lt;/p&gt;
&lt;p&gt;The problem is that none of those are connected to why your business isn't growing.&lt;/p&gt;
&lt;p&gt;Instead, pick the one number that matters most right now. Not ten numbers. One. And make it something specific.&lt;/p&gt;
&lt;p&gt;How many people come back a second time after signing up? How many people who start using the product actually get to the good part? How many free users become paying users? How many users are still active after 30 days?&lt;/p&gt;
&lt;p&gt;If you're not sure which number to pick, ask yourself: if I could only change one thing about this business in the next 90 days, what would make the biggest difference to survival? That's your number.&lt;/p&gt;
&lt;p&gt;Now every decision about what to build connects to that number. If a feature doesn't have a clear path to moving that number, it goes on the shelf - no matter how cool it sounds, no matter how easy it would be to vibe-code in a weekend.&lt;/p&gt;
&lt;h3 id=&quot;step-2-talk-to-your-users-before-you-build-for-them&quot;&gt;Step 2: Talk to your users before you build for them&lt;/h3&gt;
&lt;p&gt;Here's where most founders go wrong. They brainstorm features, look at competitors, read product blogs, and pick something that feels right. Then they build it and wonder why nothing changed.&lt;/p&gt;
&lt;p&gt;The fastest path to knowing what to build is talking to the people who use your product - or who tried it and left.&lt;/p&gt;
&lt;p&gt;Pick up the phone or jump on a video call with five to ten of your actual users. And when you do, don't ask about your product. Ask about their life.&lt;/p&gt;
&lt;p&gt;&quot;Walk me through the last time you tried to [the thing your product helps with].&quot; &quot;What was annoying about that?&quot; &quot;What did you try before you found us?&quot; &quot;What almost made you give up?&quot;&lt;/p&gt;
&lt;p&gt;You're not looking for feature requests. You're listening for patterns. When three different users describe the same frustration in different words, that's your signal. Write those down. Those are the real problems you should solve next.&lt;/p&gt;
&lt;p&gt;This is hard if you're not used to it. Your instinct will be to pitch, to explain, to defend your product. Resist. Just listen. The gold is in what they say when you stop talking.&lt;/p&gt;
&lt;h3 id=&quot;step-3-understand-what-your-product-was-actually-hired-to-do&quot;&gt;Step 3: Understand what your product was actually hired to do&lt;/h3&gt;
&lt;p&gt;Your users didn't download your app because they wanted software. They were trying to make progress on something specific in their life or work. Your app was their attempt at making that progress.&lt;/p&gt;
&lt;p&gt;That progress has three layers, and most vibe-coded apps only serve one of them.&lt;/p&gt;
&lt;p&gt;The first is the practical layer. The task they need to get done. &quot;I need to track my invoices.&quot; Most apps handle this fine.&lt;/p&gt;
&lt;p&gt;The second is the emotional layer. How they want to feel. &quot;I want to feel like I'm on top of my business instead of drowning in paperwork.&quot; Most apps completely ignore this.&lt;/p&gt;
&lt;p&gt;The third is the social layer. How they want to be perceived. &quot;I want my clients to see me as professional and organized.&quot; Almost no early-stage app touches this.&lt;/p&gt;
&lt;p&gt;When you listen to those user conversations, pay attention to all three layers. The practical needs tell you what features to build. The emotional needs tell you how to design the experience. The social needs tell you how to position the product.&lt;/p&gt;
&lt;p&gt;The feature that moves your number might not be a new capability at all. It might be making the existing capability feel different - more reassuring, more professional, more like progress.&lt;/p&gt;
&lt;p&gt;This is a specific blind spot for vibe-coded apps. The AI tools are great at generating functional features - screens, buttons, flows. They have no ability to design for how something makes a user feel. That layer is entirely on you, and it's usually the missing piece.&lt;/p&gt;
&lt;h3 id=&quot;step-4-score-your-options-before-you-build-any-of-them&quot;&gt;Step 4: Score your options before you build any of them&lt;/h3&gt;
&lt;p&gt;Now you've got real problems from real users, connected to the one number you're trying to move. The temptation is to jump straight to a solution. Don't.&lt;/p&gt;
&lt;p&gt;For every user need you uncovered, score two things on a 1-to-10 scale. How important is this to them? How well does their current approach handle it - including your app and whatever they used before?&lt;/p&gt;
&lt;p&gt;High importance plus low satisfaction is where you build next. That's the gap where your users are underserved and would notice if you filled it.&lt;/p&gt;
&lt;p&gt;This sounds simple but it's ruthlessly effective at killing pet features. That Stripe integration you've been wanting to build? If users rate payment as low importance right now because they're not even staying long enough to pay, it doesn't matter. The confusing first screen that loses 60% of new users in the first minute? If that scores high importance and low satisfaction, that's your next sprint.&lt;/p&gt;
&lt;h3 id=&quot;step-5-come-up-with-three-solutions-test-cheap-then-build&quot;&gt;Step 5: Come up with three solutions, test cheap, then build&lt;/h3&gt;
&lt;p&gt;For every problem worth solving, force yourself to come up with at least three different ways you could solve it. The first idea is almost never the best one. It's just the most obvious.&lt;/p&gt;
&lt;p&gt;Maybe users are dropping off during onboarding. You could build a tutorial walkthrough. You could simplify the first screen to show only one action. You could send a welcome email that explains the three things to do first. Those are very different solutions with very different costs and timelines.&lt;/p&gt;
&lt;p&gt;Before you build any of them, find the cheapest way to test whether the idea works.&lt;/p&gt;
&lt;p&gt;If you think a welcome email would help, write it yourself and send it manually to the next ten signups. See if their behavior changes.&lt;/p&gt;
&lt;p&gt;If you think the first screen is confusing, jump on a call with three new users, share their screen, and watch them try to use the product. You'll see exactly where they get stuck.&lt;/p&gt;
&lt;p&gt;If you think a new feature would keep people coming back, describe it to five users and ask &quot;would this change anything for you?&quot; Watch their reaction carefully. Energy and specifics mean something. &quot;Yeah, that's cool I guess&quot; means nothing.&lt;/p&gt;
&lt;p&gt;The point is that you should never spend real development time on something you haven't tested cheaply first. Every feature should have evidence behind it, not just a hunch.&lt;/p&gt;
&lt;h3 id=&quot;step-6-check-for-the-signal-before-you-scale&quot;&gt;Step 6: Check for the signal before you scale&lt;/h3&gt;
&lt;p&gt;After you've built and shipped something based on real user evidence, don't immediately jump to the next feature. First, check whether what you shipped actually moved the number.&lt;/p&gt;
&lt;p&gt;Did retention go up? Did more users reach the moment of value? Did conversion improve?&lt;/p&gt;
&lt;p&gt;If yes, you're learning. Do more of what worked. Go deeper on the same problem. Make the solution even better for the same people.&lt;/p&gt;
&lt;p&gt;If no, that's learning too. Go back to step 2. Talk to more users. The problem you identified might be right, but the solution might not be. Or the problem might matter less than you thought and a different one matters more.&lt;/p&gt;
&lt;p&gt;This loop - talk to users, identify problems, test solutions cheap, build the winner, check the number - is the system. It replaces the blank roadmap with a process that gets sharper every cycle. Each time through, you learn something that makes the next decision better.&lt;/p&gt;
&lt;p&gt;There's a simple test for whether you've found the thing that matters. Ask your users: &quot;How would you feel if you could no longer use this product?&quot; When 40% or more say they'd be very disappointed, you've earned the right to scale. Until then, keep running the loop.&lt;/p&gt;
&lt;h3 id=&quot;a-note-about-when-the-codebase-is-the-blocker&quot;&gt;A note about when the codebase is the blocker&lt;/h3&gt;
&lt;p&gt;Everything above assumes you can iterate on your product quickly. For some vibe-coded apps, you can't - not because you're slow, but because the codebase is too fragile.&lt;/p&gt;
&lt;p&gt;If making a change to the onboarding breaks the payment flow, if you can't add analytics without a significant rewrite, if the architecture is so tangled that a one-day change takes a week of debugging - then the code is blocking your ability to learn. And if you can't learn, the loop above doesn't work.&lt;/p&gt;
&lt;p&gt;The right approach is to assess the product and the codebase at the same time. If the foundation needs rebuilding, do that first. Not a full rewrite from scratch - just enough stability that you can iterate safely. Then run the loop.&lt;/p&gt;
&lt;h3 id=&quot;the-roadmap-isn-t-a-list-it-s-a-loop-&quot;&gt;The roadmap isn't a list. It's a loop.&lt;/h3&gt;
&lt;p&gt;The difference between founders who grow and founders who stay stuck isn't that the first group picks better features. It's that they have a system for figuring out what to build next - and it starts with users, not with brainstorming sessions.&lt;/p&gt;
&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; href=&quot;https://wednesday.is/servicing/launch/sprint-zero?utm_source=dev.to&quot;&gt;Wednesday Solutions&lt;/a&gt;, we run this exact loop with founders through Sprint Zero. In two weeks, we map your AARRR funnel with whatever data you have, identify the primary leaky stage, run at least five user conversations, and deliver a Traction Roadmap - a diagnosis of what's broken and 2-3 scoped Vibe Sprints to fix it. Each sprint targets one funnel stage, ships a scoped outcome in two weeks, and has a success metric defined before work begins. Outcome not met, you don't pay. That's how confident we are in the process.&lt;/p&gt;
&lt;p&gt;We also run a lightweight tech assessment as part of Sprint Zero, so you'll know whether your vibe-coded codebase can support the changes or whether the foundation needs work first. No 50-page report. Just a clear answer: can we iterate on this, or do we need to shore it up?&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://clutch.co/go-to-review/539153e1-8980-49f6-8fac-d0f8a77aab34/171910&quot;&gt;Anuj Kejriwal, founder of Spotwriters&lt;/a&gt;, described working with us: &quot;The most impressive and unique thing about Wednesday was their ability to grasp exactly what we need. We are on track to get to our product in just 4 months. I have made numerous changes to the project since Day 0 and the team has swiftly incorporated these changes. They work really fluidly and are great at finding simpler solutions to complex problems.&quot;&lt;/p&gt;
&lt;p&gt;Your vibe-coded app got you to launch. Figuring out what to build next is the game now. And it's a game you win by listening, not by building faster. Check out how we helped a vibe-coded app go from launch to &lt;a rel=&quot;nofollow&quot; href=&quot;https://clutch.co/go-to-review/539153e1-8980-49f6-8fac-d0f8a77aab34/396710&quot;&gt;$50,000 in revenue in one week&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;questions-founders-ask-us&quot;&gt;Questions founders ask us&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;I used Lovable to build my app and launched it, but I have no idea what to do next. Where do I start?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Start by ignoring your feature backlog. The first thing to do after launch is talk to the people who signed up. Not a survey - actual conversations. Ask them what they were trying to do when they found your app, what their life looked like before they tried it, and what happened when they used it. You will learn more from five of these conversations than from a month of analytics. The patterns that emerge from those conversations tell you what to build next - and more importantly, what to stop building.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I vibe-coded my product and got my first users. How do I know if people actually want what I built?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Track actions, not opinions. If people say they love your product but don't come back, they don't actually love it. Look for three signals: do users return without you prompting them, do they tell other people about it without you asking, and would they be genuinely upset if you took it away tomorrow? If you surveyed your users right now and fewer than 40% said they would be very disappointed without your product, you have not found a fit yet. That is not a failure - it is a signal that you need to dig deeper into what specific users value most and double down on that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My vibe-coded app has users but none of them are paying. What should I change?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Free users who don't convert usually means one of two things: either they don't see enough value to pay, or the value they see feels like a nice-to-have rather than a must-have. The fix is not to add a paywall and hope. The fix is to find the users who use your product the most and figure out what is different about them. What specific problem are they solving with it? What would they have to go back to doing without it? Then rebuild your positioning, onboarding, and pricing around that specific use case. At &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.wednesday.is/servicing/launch?utm_source=dev.to&quot;&gt;Wednesday Solutions&lt;/a&gt;, we call this finding your tightest problem-solution fit before you scale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do I figure out which features to prioritize for my startup?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For every feature idea, ask two questions: how important is this to the people who use my product the most, and how well does their current solution handle it? If something is very important to them and nothing else does it well, that is your opportunity. If something is important but they already have a good workaround, skip it. This prevents the most common trap seed-stage founders fall into - building features that seem exciting but don't move the needle on retention or revenue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is my vibe-coded codebase going to be a problem when I try to scale?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe, but probably not in the way you think. Most vibe-coded apps don't fail because of code quality - they fail because the founder rebuilt for scale before they had anything worth scaling. The right sequence is: first prove that users want what you've built and will pay for it, then assess whether the code can handle the growth. A lightweight tech check - not a full rewrite - is usually enough to tell you if your foundation holds for the next 6 months. If it does, focus on product. If it doesn't, scope a targeted rebuild of just the parts that will break. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.wednesday.is/servicing/launch?utm_source=dev.to&quot;&gt;Wednesday Solutions&lt;/a&gt; includes this assessment as part of every Sprint Zero engagement.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;If you've vibe-coded your first app and you're not sure what to build next, we run &lt;a rel=&quot;nofollow&quot; href=&quot;https://wednesday.is/servicing/launch/sprint-zero?utm_source=dev.to&quot;&gt;Sprint Zero&lt;/a&gt; engagements for exactly this moment. Two weeks. One deliverable: a Traction Roadmap that tells you what's broken, why, and what to fix first. See what other founders have said about working with us on &lt;a rel=&quot;nofollow&quot; href=&quot;https://clutch.co/profile/wednesday-solutions?sort_by=date_desc&amp;amp;utm_source=dev.to#reviews&quot;&gt;Clutch&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/13354/what-to-build-next-after-youve-vibe-coded-your-first-app</guid>
<pubDate>Mon, 23 Mar 2026 05:22:36 +0000</pubDate>
</item>
<item>
<title>Looking to Connect with Devs/Builders to Start Something Together</title>
<link>https://coderlegion.com/4479/looking-to-connect-with-devs-builders-to-start-something-together</link>
<description>&lt;p&gt;I’m a solo builder. I’m &lt;strong&gt;looking to connect&lt;/strong&gt; with like-minded devs who want to explore startup ideas together — maybe even apply to Y Combinator if it feels right.(Area mainly is AI)&lt;/p&gt;
&lt;p&gt;Not pitching any fixed idea right now — just &lt;strong&gt;open chats, bouncing thoughts&lt;/strong&gt;, and seeing if there’s a good vibe to build with someone. &lt;strong&gt;If you’re curious, motivated, and want to work&lt;/strong&gt; on something meaningful, let’s connect!&lt;/p&gt;
&lt;p&gt;Drop a comment or &lt;strong&gt;DM me&lt;/strong&gt; here. I’d love to talk.&lt;/p&gt;
</description>
<category>Data Science</category>
<guid isPermaLink="true">https://coderlegion.com/4479/looking-to-connect-with-devs-builders-to-start-something-together</guid>
<pubDate>Fri, 08 Aug 2025 05:37:40 +0000</pubDate>
</item>
</channel>
</rss>