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>
341 lines
14 KiB
Markdown
341 lines
14 KiB
Markdown
# 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 $80–110/hr; they
|
||
pay a domain specialist $150–250/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 4–6 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 1–2: review and ship the v1 site (above checklist)
|
||
- [ ] Day 3: announce on LinkedIn/Twitter — short post, one sentence
|
||
about positioning, link to home
|
||
- [ ] Day 4–5: 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.*
|