WEBVTT - How I shipped a $5k/mo consulting funnel in one hour

1
00:00:00.000 --> 00:00:01.749
How I shipped a $5k/mo consulting funnel in one hour

2
00:00:01.749 --> 00:00:07.870
Most personal sites end with a mailto: link and a sentence that says "available for select engagements." The buyer drafts an email, hesitates over the price they don't know, and closes the tab. Conversions: zero.

3
00:00:07.870 --> 00:00:09.793
I replaced the mailto: with three productized offers at public prices.

4
00:00:09.793 --> 00:00:11.892
Each one is bookable with a USDC deposit on Base via x402.

5
00:00:11.892 --> 00:00:14.340
Buying the engagement now costs the same number of clicks as buying a coffee.

6
00:00:14.340 --> 00:00:16.439
It took an hour. The whole thing is 550 lines of code.

7
00:00:16.439 --> 00:00:16.963
The three offers

8
00:00:16.963 --> 00:00:17.488
/services lists three:

9
00:00:17.488 --> 00:00:22.734
Agent-Ready Audit — $1,500 flat. 48-hour async. Written report on MCP exposure, agent discoverability, x402 readiness, and bot policy. One pull request with the smallest change that moves the needle.

10
00:00:22.734 --> 00:00:26.931
x402 Integration Sprint — $2,500 flat. One week. x402 middleware wired into your stack, one MCP tool wrapping your API, smoke tests, recorded walkthrough.

11
00:00:26.931 --> 00:00:31.303
Senior Agent-Infra Retainer — $5,000/month. Two-month minimum. Three async consults per week, code review on any PR touching agent infra, one architecture note per month.

12
00:00:31.303 --> 00:00:35.850
Deposits are $150, $250, and $500 — one tenth of the headline price. They're credited toward the first invoice and refundable if I decline the work.

13
00:00:35.850 --> 00:00:36.200
Why deposits

14
00:00:36.200 --> 00:00:37.599
A free intro call is a coin flip.

15
00:00:37.599 --> 00:00:38.473
The deposit screens out tire-kickers.

16
00:00:38.473 --> 00:00:41.446
Someone who pays $150 in USDC to audit their repo is going to take the call seriously.

17
00:00:41.446 --> 00:00:43.720
Someone who won't part with $150 was never going to send the contract.

18
00:00:43.720 --> 00:00:47.392
I learned this from the $50 consult filter pattern other indie consultants use to filter inbound, and from running a $0.

19
00:00:47.392 --> 00:00:48.616
10 USDC paywall on the skills marketplace.

20
00:00:48.616 --> 00:00:52.814
Same principle, two orders of magnitude up: the price moves the conversation from "you should pitch me" to "I've already paid, what's the scope."

21
00:00:52.814 --> 00:00:53.513
The code is boring

22
00:00:53.513 --> 00:00:54.562
The full funnel is four files:

23
00:00:54.562 --> 00:00:56.486
src/pages/services.astro — the listing page (308 lines, mostly copy and CSS).

24
00:00:56.486 --> 00:00:57.186
src/pages/services/sprint/book.ts — 34 lines.

25
00:00:57.186 --> 00:00:57.885
src/pages/services/audit/book.ts — 33 lines.

26
00:00:57.885 --> 00:00:58.585
src/pages/services/retainer/book.ts — 34 lines.

27
00:00:58.585 --> 00:01:00.333
src/lib/service-booking.ts — 141 lines, shared by all three booking endpoints.

28
00:01:00.333 --> 00:01:02.257
Each route file is a thin wrapper. Here's the entire sprint/book.ts:

29
00:01:02.257 --> 00:01:04.006
That's the whole file. The shared helper does three things:

30
00:01:04.006 --> 00:01:04.181
1.

31
00:01:04.181 --> 00:01:04.530
Calls x402.

32
00:01:04.530 --> 00:01:05.405
enforce() with the deposit price.

33
00:01:05.405 --> 00:01:09.077
If the request doesn't have a payment header, the helper returns the 402 challenge and the agent's x402 client settles automatically.

34
00:01:09.077 --> 00:01:09.952
Humans hit a payment page.

35
00:01:09.952 --> 00:01:10.127
2.

36
00:01:10.127 --> 00:01:14.673
On payment success, logs the purchase to D1 and writes a flagged row into contact_messages so the booking shows up in the admin inbox within seconds.

37
00:01:14.673 --> 00:01:14.848
3.

38
00:01:14.848 --> 00:01:18.171
Returns a confirmation HTML page with a booking token, the deposit amount, the credited total, and what happens next.

39
00:01:18.171 --> 00:01:18.696
No account system.

40
00:01:18.696 --> 00:01:19.220
No Stripe webhook.

41
00:01:19.220 --> 00:01:19.570
No queue.

42
00:01:19.570 --> 00:01:20.095
No email service.

43
00:01:20.095 --> 00:01:24.816
The booking is one HTTP round-trip with a payment in the middle, and the side effect is a row in the inbox I already check every morning.

44
00:01:24.816 --> 00:01:25.866
Why USDC on Base, not Stripe

45
00:01:25.866 --> 00:01:26.215
Three reasons.

46
00:01:26.215 --> 00:01:30.413
I'm an unbanked founder. Stripe wants a US bank account in good standing. USDC wants a wallet address. The wallet is faster to provision.

47
00:01:30.413 --> 00:01:35.309
Settlement is instant. The deposit lands in my hardware wallet (0x0E4d...1028) before the buyer sees the confirmation page. There's no two-day hold, no chargeback window, no payout schedule.

48
00:01:35.309 --> 00:01:37.408
It's the same payment rail I already accept on the skills marketplace.

49
00:01:37.408 --> 00:01:38.457
One wallet, one network, one currency.

50
00:01:38.457 --> 00:01:39.506
An agent that bought a $0.

51
00:01:39.506 --> 00:01:42.129
10 skill from me yesterday can book a $5,000 retainer today with the same client.

52
00:01:42.129 --> 00:01:47.201
For a buyer who wants a fiat invoice, I can arrange one through a partner. The default is USDC because the default is what most agent-shaped buyers will use.

53
00:01:47.201 --> 00:01:48.425
The same rail for agents and humans

54
00:01:48.425 --> 00:01:49.474
The booking endpoints are not bot-only.

55
00:01:49.474 --> 00:01:55.420
An agent operating on behalf of a CTO can call GET /services/sprint/book with an x402 payment header, settle the deposit, and receive the confirmation HTML — same flow as a human clicking the link.

56
00:01:55.420 --> 00:01:58.393
The booking token returned in the response is the receipt the agent hands back to its principal.

57
00:01:58.393 --> 00:02:04.514
I haven't seen this happen yet. The market for agent-purchased professional services is roughly empty. But the surface is built, the price is public, and the protocol is the same one Claude Code already speaks.

58
00:02:04.514 --> 00:02:05.039
What's at risk

59
00:02:05.039 --> 00:02:06.787
Honest pricing signal: zero purchases at the time of writing.

60
00:02:06.787 --> 00:02:07.837
The blog is eight days old.

61
00:02:07.837 --> 00:02:08.711
The /services page launched yesterday.

62
00:02:08.711 --> 00:02:12.558
The funnel is live and the booking flow is verified end-to-end on Base mainnet, but no one has paid for anything yet.

63
00:02:12.558 --> 00:02:15.182
This post is the first time the URL has been linked outside the site itself.

64
00:02:15.182 --> 00:02:16.930
Three things have to be true for this to convert:

65
00:02:16.930 --> 00:02:17.105
1.

66
00:02:17.105 --> 00:02:18.329
The traffic has to find the page.

67
00:02:18.329 --> 00:02:20.428
I'm relying on inbound from posts, the footer, /hire, and direct shares.

68
00:02:20.428 --> 00:02:20.953
No paid acquisition.

69
00:02:20.953 --> 00:02:21.128
2.

70
00:02:21.128 --> 00:02:22.876
A reader has to recognize the offers as a fit.

71
00:02:22.876 --> 00:02:26.899
The audience is senior eng, CTOs, and founders at Seed–Series B AI startups who want x402/MCP/agent infra and don't have the in-house time.

72
00:02:26.899 --> 00:02:27.423
That audience exists.

73
00:02:27.423 --> 00:02:28.647
I haven't proven they read this blog.

74
00:02:28.647 --> 00:02:28.822
3.

75
00:02:28.822 --> 00:02:30.396
The crypto-native deposit has to not be a blocker.

76
00:02:30.396 --> 00:02:33.719
If half the buyers I'd otherwise close on bounce off the wallet step, the funnel needs a fiat fallback.

77
00:02:33.719 --> 00:02:34.593
I'll know in a month.

78
00:02:34.593 --> 00:02:38.091
If none of the above turn out true, I rip out the productized offers and go back to a mailto:.

79
00:02:38.091 --> 00:02:40.889
The cost of running this experiment is one hour of code and a half-day of writing.

80
00:02:40.889 --> 00:02:43.862
The cost of being wrong is the same as the cost of being right and ignored: nothing.

81
00:02:43.862 --> 00:02:44.736
What to do with this

82
00:02:44.736 --> 00:02:48.584
If you're building agent infra and want a pair of senior eyes on it, /services has the three ways to hire me.

83
00:02:48.584 --> 00:02:49.108
Pricing is public.

84
00:02:49.108 --> 00:02:49.633
Deposits are USDC.

85
00:02:49.633 --> 00:02:51.731
The deposit is credited if we proceed and refunded if I decline.

86
00:02:51.731 --> 00:02:58.027
If you're not sure your site is ready for agents at all, the free agent-readiness check at /tools/agent-readiness gives you the same scoring rubric I use on the audit, run on your URL with no paywall.

87
00:02:58.027 --> 00:03:01.000
If you want to copy the funnel, the source is at github.com/integrate-your-mind/mondello-dev. It's four files. Steal it.
