Files
fivedevs.com/STRATEGY.md
Chris Smith a7c05104af flatten new-site/ to repo root and remove old hugo site
Moves the Next.js app's contents from new-site/ to the repository
root and deletes the previous Hugo site (assets/, content/, themes/,
hugo.toml, etc.). Also retires the AWS Amplify config and old
Netlify _redirects file — the new site deploys to Vercel.

Updates STRATEGY.md path references to drop the new-site/ prefix.
LICENSE preserved.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 13:14:01 +02:00

14 KiB
Raw Permalink Blame History

Five Devs — Positioning & 30-Day Content Strategy

This document is the strategy behind the v1 site. Treat it as a living document — update it as the work changes shape.


Positioning

One-line: Senior PHP help for the unglamorous, mission-critical glue between your store, your warehouse, and your books.

Why this and not "PHP generalist":

  • The real testimonials are all in this lane (Pritikin, Americold, Fortune Fulfillment).
  • Premium hourly rates ($150/hr+) come from domain expertise, not from raw PHP skill. Buyers will pay a senior generalist $80110/hr; they pay a domain specialist $150250/hr because the alternative is hiring an in-house team.
  • Aaron & Joel at nocompromises.io own the "Laravel maintenance subscription" lane already. Differentiate by going deeper on a vertical they don't claim (e-commerce/3PL ops) rather than competing on the same playbook.
  • Generalist work will still come in via referrals. Sharp positioning doesn't shrink your top-of-funnel as much as people think — it changes who shows up at the bottom of it.

Three engagement shapes (live on /services):

  1. Project sprint — fixed scope, fixed price after paid discovery
  2. Monthly retainer — reserved senior hours, the long tail
  3. Block of time — 40/80/160-hour blocks usable over 6 months

Pricing strategy: don't put numbers on the site yet. Quote on the call. Once the rate has crept comfortably to $150/hr, then publish a "from $X" anchor on the services page — that's the move that filters out unqualified leads at the top of the funnel.


What's on the site (v1)

  • / — Home: hero, services teaser, real client logo strip, 4 testimonials, CTA
  • /services — three engagement tiers, plain-language pricing note
  • /work — index + two case studies (Pritikin Foods, Americold)
  • /about — voice, tools, story, mailing address
  • /contact — Cal.com booking link, contact form, email, address
  • /blog — index + 3 seed posts

Things YOU need to do before launch

These are placeholders / wiring tasks I couldn't do without you:

  1. Cal.com linksrc/app/contact/page.tsx currently points to https://cal.com/cgsmith/intro. Set up your Cal.com account, create a 20-minute "Intro call" event type, and update that constant.

  2. Email address — the site uses chris@fivedevs.com throughout. Either set up that mailbox (Google Workspace / Fastmail) or global-replace to whatever you actually want public.

  3. Case study sign-off — re-read the Pritikin and Americold case studies. They're written from public testimonials only, no confidential details. But you should still confirm with each client before the site goes live — a quick "hey, mind if I tell this story on my site?" email goes a long way and often becomes its own testimonial moment.

  4. Photo / avatar — drop a real headshot into /public/chris.jpg and add it to the About page. Even a phone selfie outdoors is fine — the absence of a face is the single thing that makes a freelancer site feel cold.

  5. Domain + DNS — when ready to flip, point fivedevs.com at Vercel (or stay on AWS Amplify and add the Next.js Amplify config).

  6. Optional: contact form upgrade — the form currently opens the visitor's email client via mailto:. Works on day 1, looks slightly amateur. Upgrade to a real server action when convenient (10 lines of Resend code).

  7. Stripe Payment Links — the Services page now has self-serve checkout for the retainer and the three block sizes. The site reads four URLs from environment variables; until they're set, the buttons fall back to "Talk first" and route to /contact.

    Soft-launch sale: 50% off is currently active and shows the crossed-out regular price next to the discounted price. Each Stripe Payment Link should be configured at the sale price while the soft launch runs.

    Setup (~15 min in the Stripe Dashboard):

    1. Stripe Dashboard → Products → + Add product — create four products. Use these names and prices (all USD, the sale amounts that are charged today):

      Product Type Price (sale) Regular
      Five Devs Retainer Recurring $2,500/mo $5,000/mo
      40-Hour Block One-time $2,750 $5,500
      80-Hour Block One-time $5,250 $10,500
      160-Hour Block One-time $10,000 $20,000
    2. Stripe Dashboard → Payment Links → + New — create one Payment Link per product. For each link:

      • After payment: "Don't show confirmation page. Instead, send customers to" → https://fivedevs.com/thank-you
      • Collect customer info: name, email, billing address
      • Allow promotion codes: off (the price already includes the discount)
      • Tax behavior: if you've enabled Stripe Tax, leave on; otherwise inclusive vs. exclusive doesn't change anything for B2B customers in most US states.
    3. Copy each Payment Link URL (looks like https://buy.stripe.com/abc123) into your local .env.local (use .env.local.example as a template):

      NEXT_PUBLIC_STRIPE_RETAINER=https://buy.stripe.com/...
      NEXT_PUBLIC_STRIPE_BLOCK_40=https://buy.stripe.com/...
      NEXT_PUBLIC_STRIPE_BLOCK_80=https://buy.stripe.com/...
      NEXT_PUBLIC_STRIPE_BLOCK_160=https://buy.stripe.com/...
      

      And paste the same four into your Vercel project's Environment Variables (Project Settings → Environment Variables → add for Production and Preview).

    4. Test once. Use Stripe's test mode link first, then flip to live. Stripe's test card is 4242 4242 4242 4242, any future expiry, any CVC.

    Ending the soft-launch sale (later):

    1. Edit src/lib/pricing.ts and set sale.active = false. The crossed-out prices and badge disappear.
    2. Create new Payment Links in Stripe at the regular prices and update the four env vars to point at them.
    3. Redeploy.

    What sales tax do you owe? Nevada doesn't tax most professional services to other businesses, so for most B2B customers there's nothing to collect. If you take on significant work for clients in tax-aggressive states (CA, WA, TX) or sell internationally, enable Stripe Tax — it figures it out per-transaction for $0.50/transaction. Talk to a CPA before you cross $250K/year.

  8. Client logos — the home page strip currently uses styled text wordmarks for the eight named clients (Americold, Butcher Box, Perfect Bar, Pritikin Foods, Potawatomi Business Development, Fortune Fulfillment, Vanderose Farms, PERC Engage). Two things to do before publishing real logo marks:

    • Get permission. Email each company a one-liner: "I'd like to list you as a past client on my site — happy to send a mockup; let me know if you'd prefer me not to." Most will say yes; a couple of CPG brands (Butcher Box, Perfect Bar) may require formal sign-off via PR/legal. Fortune 500 and tribal entities (Americold, Potawatomi) often have specific usage requirements — ask first.
    • Source the assets. Download proper SVGs from each brand's press kit / "About Us" media page, drop into public/logos/<slug>.svg, then update src/components/client-logos.tsx to render <img> for entries with a logo field. Style: grayscale by default, brighten on hover, max-height ~32px.
    • Note: don't use the Clearbit Logo API — HubSpot shut it down in late 2024. Brandfetch and Logo.dev are paid alternatives if you want a managed solution; otherwise self-host the SVGs.

30-day content plan

The goal of the next month is two things, in this order:

  1. Get the site live with a real face on it.
  2. Publish enough writing that when someone types "[your name] PHP developer" or "PHP developer for 3PL integration" into Google or asks an LLM, something of yours shows up.

You only need 46 posts to start moving the needle. Quality over volume. Each post should answer a specific question a buyer would actually type.

Week 1 — Launch + one post

  • Day 12: review and ship the v1 site (above checklist)
  • Day 3: announce on LinkedIn/Twitter — short post, one sentence about positioning, link to home
  • Day 45: Write Post #4 (see below). One per week is the cadence.

Week 2 — Post #5

  • "What 'integrating with a 3PL' actually means in practice"
  • Long-form, technical-but-readable. Walks through the actual data flows (orders out, ASNs in, inventory snapshots, rate quotes).
  • Target reader: ops director at a $5M$50M DTC brand who's about to switch fulfillment partners.

Week 3 — Post #6

  • "Five questions to ask before signing a Magento maintenance contract" (or Shopify Plus, or BigCommerce — pick the platform you see most in your pipeline)
  • Format: short, punchy, pitch-adjacent. The kind of thing that gets shared in operator Slack groups.

Week 4 — Post #7 + outreach

  • "How I structure block-of-time engagements (and why)" — meta-post about the work, modeled on Aaron & Joel's transparent posts about their model.
  • Outreach: send one personalized note per day (5 total) to someone in your network who runs a small e-commerce or logistics business. Not "looking for work" — "I'm publishing again, here's a piece you might find useful."

Already-shipped seed posts

These are live in src/content/blog/:

  1. "Why I take 'glue work' seriously (and you should too)" — manifesto / positioning post. The thing to link from your bio.
  2. "How to hire a senior PHP developer (without getting burned)" — the buyer's guide. Long-tail SEO + great share fodder for founders considering hiring.
  3. "A pre-launch checklist for connecting your store to a 3PL" — demonstrates expertise; works as a bookmark/leadmagnet.

Lead-capture levers (cheap & high-leverage)

In rough order of effort vs payoff:

  1. Update LinkedIn headline to match the home page positioning, exactly. ("PHP for e-commerce + 3PL operations" — not "Senior PHP Developer".)
  2. Add the Cal.com link to your LinkedIn About section. Make booking a call a one-click action from anywhere you exist online.
  3. Update GitHub profile README with the same one-liner + a link.
  4. Pin the "How to hire a PHP dev" post to your Twitter/X profile.
  5. Submit the site to relevant directories:
    • Laravel Artisan (if doing Laravel work)
    • PHP-FIG members directory (long shot)
    • The Codeable / Toptal alternative directories
  6. Newsletter (later, not now). Once you have 6+ posts, set up a simple email signup. Don't bother before that — there's nothing to subscribe to.
  7. Speak at one Laravel/PHP meetup or conference in the next 6 months. Even a 10-minute lightning talk on a real war story from the Pritikin or Americold work. Conference speaking is the single highest-leverage move for moving from $75 → $150/hr.

How to talk about the rate

When the call gets to "what do you charge":

  • Don't lead with the number. Lead with the engagement shape. ("For projects like what you're describing, I usually structure it as a fixed-price sprint after a paid discovery week. The discovery is $X; the sprint is quoted from there.")
  • Anchor on outcomes. ("The work usually pays for itself within Y months because [specific operational savings].")
  • State the hourly with a context, not a defense. ("My hourly is $150 — you're paying for fifteen years of e-commerce/3PL work and the fact that I'm reading your codebase, not directing a junior.")
  • Have a "no" ready. ("If your budget is closer to $X, I can recommend two people who do excellent work in that range — happy to introduce you.")

The faster you can say "no" cleanly, the easier "yes" gets.


What I won't put on the site

  • Stock photos of "developers." Nothing erodes a freelance brand faster.
  • Lorem ipsum. None of it. Real copy or no copy.
  • A "process" page with seven generic steps. Every consultancy has one. They convert nobody. The case studies do this job better.
  • Pricing tiers in dollars — yet. Not until you're consistently closing at $150/hr.


What's wired for SEO / LLM discoverability

  • JSON-LD structured data on every important page:
    • Home → Organization
    • About → Person (with knowsLanguage: [English, German] and knowsAbout listing your tech stack)
    • Services → multiple Service objects, one per engagement option, with the current sale prices
    • Each blog post → Article + BreadcrumbList
    • Each case study → Article + BreadcrumbList
  • /sitemap.xml — auto-generated from the route list and the blog/work registries (src/app/sitemap.ts)
  • /robots.txt — allows everything except /thank-you; points at the sitemap (src/app/robots.ts)
  • /llms.txt at site root (public/llms.txt) — the emerging convention for telling LLM crawlers what to index. Update this when you add or rename pages.
  • OG metadata — title/description templates set in root layout. Add a public/og-image.png (1200×630) to make it visually richer.

What you should still do once live:

  1. Submit sitemap to Google Search Console + Bing Webmaster Tools.
  2. Run any new page through Google's Rich Results Test (https://search.google.com/test/rich-results) to confirm the JSON-LD parses cleanly.
  3. Re-check /llms.txt quarterly as you publish — it doesn't auto-update.

Guarantees

Four are wired and visible on Home (full section) and Services (compact strip):

  1. 30-day money back on first month
  2. 30-day post-handoff bug-fix
  3. One-business-day response
  4. You own everything (full IP transfer, no subcontracting)

Edit them in src/components/guarantees.tsx.

"How I work" principles

Five principles render on the About page (HowIWork component). Edit in src/components/how-i-work.tsx.


Last updated: 2026-04-30.