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

341 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 link**`src/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.*