Philosophy

Why Every Developer Needs to Learn Marketing (My Experience)

Mar 25, 2026
8 min read
E.A
Emmanuel Asika

Great code doesn't guarantee success. As a dev pivoting to Indie Hacking, I learned that marketing is just system engineering. Here's how to debug your growth.

Here is a hard truth that cost me about three years of my life:

The best code does not win.

If you are reading this, you are probably like me. You love the editor. You love the feeling of a perfectly typed interface in TypeScript. You get a dopamine hit when your Vercel deployment goes from yellow to green. We obsess over the "how". Is it scalable? Is the architecture clean? Should I use Supabase or roll my own Postgres on Docker?

But while we are debating the merits of Server Components versus Client Components, someone with a WordPress site and a relentless Twitter strategy is eating our lunch.

I used to be a high-volume freelancer. I churned out sites for clients who made a lot of money. I thought they were paying me because I was a wizard at PHP and CSS.

I was wrong.

They were paying me because I was a utility. I was the plumber. They were the architects of the business. They knew how to get customers, and I was just the guy installing the pipes. When I decided to pivot to Indie Hacking and Cloud Engineering, I realized I had no idea how to actually make money without a client handing it to me.

This is my deep dive into why you, as a developer, need to stop coding for a second and learn how to sell.

The Field of Dreams Fallacy

"Build it and they will come" is the biggest lie in tech. It works in movies. It does not work in SaaS.

When I started building my first real SaaS product (moving away from client work), I spent two months on the authentication flow. Two months. I wanted it to be perfect. I integrated Supabase Auth, set up row-level security policies that were tight as a drum, and built a custom UI with Tailwind and Shadcn that looked beautiful.

I launched it. I tweeted about it once.

Crickets.

Zero signups. Not even spam bots.

The realization hit me hard. I had built a "product" in the engineering sense, but I hadn't built a business. I had built a ghost town with really nice infrastructure.

As engineers, we use code to avoid doing the uncomfortable work of talking to humans. We tell ourselves that if we just add one more feature, the users will magically appear. If we just refactor this component to be more performant, the growth hockey stick will happen.

It won't.

Reframing Marketing: It's Just System Engineering

Here is how I finally tricked my brain into liking marketing. I stopped calling it "marketing" and started viewing it as System Engineering.

Think about it. A marketing funnel is just a state machine.

  1. State A (Unaware): The user doesn't know you exist.
  2. State B (Aware): They saw a tweet or a search result.
  3. State C (Interest): They clicked the link.
  4. State D (Conversion): They swiped their card.

Your job isn't to "schmooze" people. Your job is to debug the transition between these states. If 1000 people enter State B and zero people enter State C, you have a bug. The bug isn't a NullReferenceException. The bug is your copy, your value proposition, or your load speed.

When I view marketing as a debugging process, it becomes a technical challenge. And I love technical challenges.

The Developer's Unfair Advantage: Programmatic SEO

Most marketers have to hire writers. They have to guess at keywords. They have to manually build pages.

We have a superpower. We can loop.

I am currently studying for my Masters in Cloud Computing here in Ireland, and one thing became clear when studying distributed systems: automation wins. You can apply the same logic to SEO.

Instead of writing 50 blog posts manually, you can identify a dataset that your potential users are searching for, and generate 5,000 pages programmatically.

If you are using Next.js, this is trivial. You don't need an expensive CMS. You just need a database and generateStaticParams.

Here is a stripped-down example of how I approach this with the App Router. Let's say I'm building a tool for Cloud Engineers to compare AWS instance prices.

// app/aws-prices/[instanceType]/page.tsx import { createClient } from '@/utils/supabase/server'; import { notFound } from 'next/navigation'; // This function generates the static paths at build time // Meaning: Instant load speeds, Google loves it. export async function generateStaticParams() { const supabase = createClient(); const { data: instances } = await supabase .from('aws_instances') .select('slug'); return instances?.map((instance) => ({ instanceType: instance.slug, })) || []; } // The actual page component export default async function InstancePage({ params }: { params: { instanceType: string } }) { const { instanceType } = params; // Fetch data specifically for this page const data = await getInstanceData(instanceType); if (!data) return notFound(); return ( <article className="prose lg:prose-xl mx-auto"> <h1>AWS {data.name} Pricing and Specs</h1> <p> Is the {data.name} the right instance for your workload? Let's compare it against the {data.competitor}... </p> {/* Dynamic pricing table component */} <PricingTable data={data} /> </article> ); }

A marketer cannot do this. They have to hire us to do this. If you learn how to do this for yourself, you are dangerous.

You are leveraging your coding skills to create a wide surface area for luck. Every page is a lottery ticket. The more code you write to generate value, the more tickets you hold.

Technical SEO is Not Optional

Since I'm moving into Cloud Engineering, I care about performance. It turns out, Google cares too. Core Web Vitals are a ranking factor.

This is where the "Freelancer" in me helps. I know that a slow site kills conversions. But now, using modern stacks like Next.js, we have tools that make technical SEO a breeze, yet most devs ignore them because they are "boring."

Take JSON-LD Schema. It’s invisible code that tells search engines what your page is. Is it a product? A course? A job posting?

If you aren't injecting structured data, you are invisible.

Here is how I inject dynamic schema into my layouts. This isn't just metadata; this is feeding the robot exactly what it wants to eat.

// components/JsonLd.tsx export default function JsonLd({ data }) { return ( <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(data), }} /> ); } // Usage in a page const schema = { "@context": "https://schema.org", "@type": "SoftwareApplication", "name": "My SaaS Tool", "applicationCategory": "BusinessApplication", "operatingSystem": "Web", "offers": { "@type": "Offer", "price": "29.00", "priceCurrency": "USD" } };

Implementing this properly can double your click-through rate from Google. It’s pure code. It’s logical. But it’s marketing.

Building in Public: The Social Algorithm

I used to be private. I thought my code should speak for itself.

But the algorithm doesn't read GitHub repos. It reads engagement.

"Building in Public" is the concept of sharing your wins, losses, and code snippets while you build. It feels weird at first. You feel like a fraud. You think, "Who cares that I just fixed a div centering issue?"

People care. Other developers care. And surprisingly, potential customers care because it shows life.

When I share a screenshot of a dashboard I'm building with Supabase and Tailwind, I'm not just showing off UI. I'm signalling consistency. I'm signalling that I am capable of solving problems.

But here is the nuanced part that many Indie Hackers miss: Don't just complain.

Share value. Share the "Aha!" moments.

If you spent 4 hours fighting an AWS Lambda timeout issue, write a thread about how you fixed it. That is marketing. You are marketing your competence. You are establishing authority.

When I tweet about Cloud Engineering concepts I'm learning in my Masters program, I'm attracting people interested in that domain. If I launch a product in that domain later, I already have an audience.

The "Ship Fast" Mentality vs. Engineering Perfection

This is the hardest pill to swallow.

Marketing requires speed. Engineering requires precision. These two forces are constantly at war inside my head.

In the freelance world, I couldn't ship buggy code. The client would fire me. In the SaaS world, if you wait until the code is bug-free, you are too late.

I have had to learn to embrace "Shameful Code."

Maybe the database schema isn't normalized perfectly. Maybe I'm using any in a few TypeScript files because the types were getting too complex and I needed to ship the feature by Friday.

The market does not care about your clean code. They care about the solution.

I force myself to push to production before I feel ready. If I am comfortable, I waited too long. This speed is marketing. Being first to market, or updating faster than the competition, is a feature.

Analytics: The Feedback Loop

You cannot optimize a system you do not monitor. In Cloud, we use CloudWatch or Azure Monitor. In marketing, we use analytics.

But don't just slap Google Analytics on and call it a day. As a dev, you should instrument your app to track behavior.

I want to know exactly where people drop off. Did they click "Sign Up" and then bail when they saw the credit card form?

I build custom event tracking into my apps. Since I use Supabase, sometimes I just log critical events to a separate table so I can run SQL queries on my funnel.

-- A simple tracking table for the paranoid developer create table events ( id uuid default gen_random_uuid() primary key, event_name text not null, user_id uuid references auth.users, metadata jsonb, created_at timestamp with time zone default now() );

Then in my code:

const logEvent = async (name: string, meta: object) => { await supabase.from('events').insert({ event_name: name, metadata: meta }); }

This gives me raw data. I don't have to trust a third-party dashboard. I can see that 50 users tried to use the "Export to PDF" feature, but it failed. That tells me two things:

  1. The feature is broken (Engineering fix).
  2. Users really want PDF export (Marketing insight - highlight this feature once fixed).

The Psychology of Pricing

Developers are terrible at pricing. We look at the cost of the server (AWS bill: $15/month) and think charging $5/month is reasonable.

We price based on cost. Marketers price based on value.

If your SaaS saves a business 10 hours a week, and they pay their employees $50/hour, you are saving them $2,000 a month. You can charge $100/month and it is a steal.

I struggled with this. I felt guilty charging for software that "wasn't that hard to write." But the difficulty of the code is irrelevant. The problem solved is everything.

Conclusion: The Full Stack includes Marketing

We talk about being "Full Stack" as knowing the frontend and the backend. Knowing React and Postgres.

I don't think that's enough anymore.

The real Full Stack is: Product + Engineering + Marketing + Sales.

You can be the best engineer in the room, but if you can't articulate why your work matters, or get it in front of the people who need it, you will always be working for someone who can.

I am still learning. Every day I fight the urge to open VS Code and refactor something that doesn't need refactoring. I have to force myself to open Twitter, to write blog posts (like this one), to tweak landing page copy.

But the freedom I'm chasing - the ability to build what I want, live where I want, and not trade hours for dollars - lies on the other side of marketing.

So, keep learning Next.js. Keep studying Cloud architecture. But take an hour this week to learn about copywriting. Learn about SEO. Learn about funnels.

Your code deserves to be used. Go find the users.

#why#IndieHacker

Read Next