threadify-go-make-money · git:20261020.7ffad50 · 2026-10-20 · sha256 c86ad92422bb363c
threadify-go-make-money git:20261020.7ffad50B
Immutable. This exact content never changes and is served at /api/v1/blob/c86ad92422bb363c.
---
name: threadify-go-make-money
description: Give Claude your real money goal, not a task. Go Make Money reads your raw Threads money data through Threadify (posts, tracked clicks, signups, offers and the page your links land on), finds the biggest leak in your funnel with receipts, tests your own belief about why, has a different model judge the diagnosis, lists the 3 claims a skeptical buyer would doubt, argues three decisions and ships fix #1 after one exact yes, then saves a goal ledger so the next run grades the fix on the same numbers. Use when someone says "go make money", "get me to N paying customers by <date>", asks where their funnel leaks, or why clicks do not turn into signups.
---
# Go Make Money
"Claude, go make money" usually fails because Claude cannot see the money. Go Make Money gives it eyes and hands: your goal goes in, your raw Threadify rows get read, a script does every number, and one fix ships after your yes.
It is free: the workflow runs in your agent on your computer. The reads, the offer, the Auto Plug and the scheduled post run on your Threadify account.
Follow [Threadify-001: setup and first-loop video](references/threadify-001.md) before the first connected call. A connection never authorizes a change. Only the owner's exact "yes" to the fix card does.
Resolve `scripts/` and `references/` paths against the directory containing this SKILL.md. The script is `node scripts/go-make-money.mjs` (Node 18+, no npm packages); every command prints JSON and the agent never does funnel sums in its head.
## Rules
- Follow [demo feedback rules](references/demo-feedback-rules.md) for the whole run. If `~/.threadify/owner-overlay.md` exists, read it too and follow it; it is private, so never quote it into posts, files you publish or receipts.
- **Outcome, not task.** Work from the goal. At every step ask "what has to happen next for the goal?", not "what was I asked to do?".
- **Raw rows, never summaries.** Every count comes from per-link and per-post rows through the script. A tool summary is only a cross-check (`summary_check`).
- **Unknown stays unknown.** A number the tools did not return is UNKNOWN, never 0. An unknown baseline is labelled "needs real baseline". A small sample is called a small sample.
- **No guarantees.** Never promise revenue, customers or results. Say "attributed", not "caused". Say "signups" or "conversions" exactly as the rows label them; say "paid" only for rows with a sale.
- **Privacy.** Aggregates only. Never print, save or show signup names or emails, credentials, tokens or account ids.
- **Public copy** (posts, Auto Plugs, offer text, page copy): no em dashes, lowercase with proper nouns kept, one CTA, plain words. It must pass `go-make-money.mjs check-copy`. Threadify writes posts with `generate_content`; the agent may only lowercase them and proves `lower(original) == lower(final)` with `scripts/casing-guard.mjs`.
- **One fix, one yes.** Show the exact change, ask "yes" once, then do it and read it back. Never publish now. Never merge a pull request.
## Steps
1. **Goal (altitude).** Call `get_connection_defaults` first and say only "@handle · timezone". If a ledger exists (`node scripts/go-make-money.mjs ledger read`), do step 9's grade first, before anything else. Take the owner's goal; the default prompt shape is "go make money: get me to <N> paying <customers/members> by <date>". Ask once for the current number if it is not readable from the owner or their own data: "How many paying <metric> do you have today? Say unknown if you're not sure." Run `node scripts/go-make-money.mjs goal --dir <run> --text "<goal>" --current <N or unknown>` (run folder `./go-make-money/<YYYY-MM-DD>/`). Say its `line`: `required_net_new_per_week = ceil((goal - current) / weeks_left)`, or UNKNOWN with "needs real baseline".
2. **Raw data (depth).** Read through Threadify and save each result as returned in `<run>/raw/`: `read_post_performance` (`days: 30`, `include_full_text: true`, a `limit` above `total_matched`; also `days: 90` if it is one more call), `read_link_attribution` (`days: 30`, a `limit` high enough for every link), `get_growth_signal`, `list_offers`, and `read_conversion_setup` or `check_conversion_tracking`. Optional files the owner put in `data/` (for example YouTube analytics JSON with average % viewed, a retention curve and CTA timestamps) are read too. Run `node scripts/go-make-money.mjs funnel --dir <run> --attribution <run>/raw/attribution-30d.json --performance <run>/raw/performance-30d.json --dest <the owner's own site host> --days 30` (the owner's site is where a signup can happen; leave out `--dest` only when unsure, and say so). Show its `table` as is: views -> clicks -> signups -> paid, with each step's rate. If conversion tracking is not measurable, signups and paid are UNKNOWN; say so. Fetch the public page the tracked links point to: `node scripts/go-make-money.mjs page-text --url <destination> --out <run>/page.txt` (public pages only, no logins).
3. **The leak.** Name the single biggest drop from the script's `leak` with its receipts (the exact rows it prints): "The leak: <from> -> <to>: <out> of <in> (<rate>%)." The leak is the step furthest below its rule-of-thumb yardstick (views -> clicks 1%, clicks -> signups 5%, signups -> paid 5%); a step with fewer than 20 going in is a small sample and is not named the leak while a bigger step exists. The yardsticks only compare steps; they are not targets or promises.
4. **Challenge one belief.** Ask one question: "Why do you think this happens?" Then test the answer against the raw rows and say supported, not supported or unknown, with the evidence:
- "The link lands on a page that doesn't match what the post or video promised": write the promise (the post text, or the video title and the line where the link is mentioned) to `<run>/promise.txt` and run `belief --dir <run> --kind page-mismatch --promise <run>/promise.txt --page <run>/page.txt`. Show the score and the promise words missing from the page.
- "People don't get far enough to see the CTA": run `belief --dir <run> --kind cta-reach --youtube data/<file>.json` (add `--cta-seconds N` if the owner says when the CTA is). A retention curve is strong evidence; an average view duration alone is weak and is labelled so; no data is unknown.
- Any other belief: test it against the saved raw rows the same way (which rows, which numbers), and say unknown when the rows cannot answer it. Never agree just because the owner said it.
5. **Outside judge.** Write a two to four sentence diagnosis to `<run>/diagnosis.txt` (the leak, the belief verdicts, what you think is going on). Run `node scripts/go-make-money.mjs judge --dir <run>`. It sends only the diagnosis and the raw funnel table (never the chat) to a different model: `codex exec -s read-only "<prompt>"` when Codex is installed, otherwise a fresh Claude instance with no prior context. It has a hard 4-minute limit. Say which judge ran (`judge_label`, `model`), its verdict (agree or dispute) and its reasons. Show a dispute in full; never hide it. If it was stopped or gave no verdict, say so in one line and carry on.
6. **Range: the short seller.** Do what a short seller does: read the offer and the landing page looking for what will not hold up. Write `<run>/short-seller-input.json` as `{"claims": [{"quote": "<exact words from the page>", "doubt": "<why a skeptical buyer would doubt it>", "evidence": "<the row, number or missing proof that would make them doubt it>"}]}` with exactly 3 claims, and run `short-seller --dir <run> --file <run>/short-seller-input.json --page <run>/page.txt`. Every quote must be on the page word for word (the script checks).
7. **Three decisions.** Write `<run>/decisions-input.json` with exactly 3 decisions that attack the leak: `{"decisions": [{"title", "fix_kind": "offer" | "post" | "landing-page-pr" | "other", "for": [...], "against": [...], "impact": 1-3, "speed": 1-3, "reversibility": 1-3}]}`, and run `rank-decisions --dir <run> --file <run>/decisions-input.json`. Show the three ranked by impact on paid conversion x speed x reversibility, each with its for and against. Then run `report --dir <run>` and open `<run>/report.html` (step 10).
8. **Ship fix #1 with one exact yes.** Follow [the fix step](references/fix.md) for the top-ranked decision. Allowed actions only: (a) update or create the Threadify offer, its Auto Plug and tracked link so the destination and the copy match the promise; (b) one post written by Threadify `generate_content` about the decision, casing guard, then `schedule_post` at the best time after the yes; (c) optional: when the site's git repo is open in this session, a small landing-page copy change on a new branch and a pull request (`gh pr create`), printing the PR URL and preview URL. Never merge it. Show the exact change, ask "yes" once, do it, read it back, and write the readbacks to `<run>/fix.json`.
9. **Make it durable.** Save the goal ledger: write `<run>/ledger-entry.json` with `goal` (`number`, `metric`, `deadline`), `baseline` (number or "UNKNOWN"), `pace`, `leak` (`step`, `upstream`, `downstream`, `rate_pct`), `decision`, `fix` (`kind`, `ids`: offer id, schedule id, PR URL), and `date`, then `ledger save --entry <run>/ledger-entry.json` (it saves to `~/.threadify/go-make-money/ledger.json` and refuses an entry with an email in it). **On the next run, read the ledger first**: run steps 2's reads and `funnel`, then `ledger grade --dir <run>` and say its `line` (the same step, before vs now, attributed not caused) before anything else.
10. **The report.** `node scripts/go-make-money.mjs report --dir <run>` writes `<run>/report.html`: the goal, a big leak card, the funnel table, the belief verdicts, the judge, the short seller, the three decisions and the fix readbacks. Serve it on this computer only (`python3 -m http.server 8051 --bind 127.0.0.1 --directory <run>` in the background) and open `http://127.0.0.1:8051/report.html` with the host's browser tool, or `open -a "Google Chrome" http://127.0.0.1:8051/report.html` (macOS). Confirm it opened. Re-run `report` after the fix and the ledger so the page shows them. Stop the server when the run ends.
## When something is missing
No Threadify connection: say "Connect Threadify at threadify.app so Claude can see your posts, clicks and signups" and stop after the goal. No tracked links or no clicks in 30 days: say so plainly, show the funnel with UNKNOWNs and make decision 1 "add one tracked link to the next post". Conversion tracking not set up: say signups are UNKNOWN and offer `setup_conversion_tracking` as a decision (it needs its own yes). No Codex and no `claude` command line: say the outside judge could not run, and carry on without inventing a verdict. Auto Plug tier-blocked: follow the fix step and offer the post without a plug. A scheduled post is not a published post, a click is not a sale, and an opened pull request is not a shipped page.