--- name: rea-growth description: Use when the user wants to know how a company gets its users, reverse engineer a competitor's growth or distribution, copy what a winning company does on each channel, or study a brand's content strategy (titles, thumbnails, covers, captions, graphics) on YouTube, TikTok, Instagram, X, LinkedIn or Reddit. Also for "how did X grow", "teardown of X's marketing", "what content works for X". --- # REA growth A company in, a playbook out: when it grew, which moves did it, how its content is made on each channel and what wins there, and ten plays the user can copy, each with a ready prompt. Runs on treg. If it isn't set up (`treg --version` fails), read https://treg.to/llms.txt and follow it to install and sign in, then come back here. ## Modes | Mode | When | Steps | Delivers | |---|---|---|---| | **full** (default) | "how does TARGET grow", "teardown", "what to copy" | 0-12 | `playbook.md` + `playbook.html` + CSVs | | **content** | titles, thumbnails, covers, captions, graphics, "what content works", and nothing about growth | 0, 1 (handles only), 7, 13 | `content.md` + `content.html` + CSVs | ## How the steps connect - Step 1 gives the path families step 4 maps keywords to, the social handles step 7 reads, and the non-user touchpoints step 11 traces. - Step 2 gives the dates (launches, funding, pixels first seen) step 3 lines up with traffic. - Step 3 marks the inflection. Steps 4-7 and 12 compare before vs after it. - Steps 4-8 each cover one channel group: search and AI answers, ads, who talks about TARGET, TARGET's own content, the product loop. Step 12 reads them all by channel. - Step 9 says what TARGET scales next; step 10 lines every move up against how fast TARGET grew; step 11 orders everything along the customer's path; step 12 turns it into plays. Step 13 is content mode's shorter ending. ## Rules - Every finding is **SEEN** (a call result or an image shows it; link it) or **INFERRED** (reasoned from what was seen; say from what). Nothing seen → "not seen", never guessed. - Public evidence only. Create no accounts, fill no forms, contact no one. - Before an endpoint's first call: `catalog_get` it, quote its price, check it fits the cap. Every DataForSEO endpoint takes a JSON array body: [{…}]. - Free first: `treg.web.search` and `treg.web.extract` with header `X-Treg-Route-Prefer: tinyfish`. Blocked page → the route tries the next vendor; still blocked → list it as blocked, move on. - An endpoint fails → `catalog_search` the same job, try one alternative → else "unavailable". - Python does all math; every number shown comes from code output. Date every count. - ◆ After each step: 3-line finding + what the next step checks + est. cost → continue | skip | stop. ## 0 · Setup INPUT: mode | target domain | user's company + domain | user's stage (pre-launch / early revenue / scaling) | budget cap (default $3) | country (US → location_code 2840, language_code en). Content mode: mode | target | channels (default all six) | cap; the user's company is optional and only feeds the "for your company" part of step 13. Ask for anything missing before the first call. No target → `treg.web.search` {"q":"fastest growing startups 2026"} → propose 3, let the user pick. ## 1 · The site — ~$0.001 (page reads free) - `treg.web.map` {"url":"https://TARGET"} → every URL. Group by path family (use cases, templates, integrations, partners, pricing, docs, blog, changelog, compare/vs). - `treg.web.extract` {"url":…} on home, about, pricing, sign-up, onboarding or getting-started doc, referral/affiliate/partner page, changelog. Record: sign-up method (SSO, email, card up front?), waitlist or invite codes, what is free, trial length and how it ends (days or credits), plans and prices, the first thing a new user is told to do, every place a non-user meets the product (shared outputs, public pages, embeds, badges, invites, emails sent to outsiders). - Handles: every official social account linked from the site (footer, about, press page) and the founders' X handles (about page, else `treg.web.search` {"q":"TARGET founder"}). A handle not linked from the site counts only if its bio links back to TARGET. - Content mode: read home and about only, collect the handles, go to step 7. ## 2 · Stack, partners, news — ~$0.16 - `predictleads.companies.technology_detections` {company_id_or_domain} → analytics, ad pixels, A/B testing, referral/affiliate, lifecycle email, chat. Keep score ≥ 0.9 and not behind_firewall (the rest includes sites their users build). A pixel = SEEN; what they run on it = INFERRED. - `predictleads.companies.connections` → partners, integrations, investors. - `predictleads.companies.news_events` + `predictleads.companies.financing_events` → launches, press, funding, reported revenue (label it "reported"). ## 3 · When it grew — ~$0.15 - `dataforseo.x.dataforseo-labs-google-historical-rank-overview-live` [{"target":"TARGET","location_code":2840,"language_code":"en","date_from":<24 months ago>}] → monthly organic + paid traffic estimate. - Traffic by channel: `akta.x.website-traffic` {"company":"TARGET"} needs the team's own Akta key; without one, say "unavailable" and use the organic vs paid split above. - Mark the inflection (largest sustained step up). Line up step 2's launches, funding and the first-seen dates of ad pixels against it. ## 4 · Search and AI answers — ~$0.14 - `dataforseo.google.domain.ranked_keywords` [{"target":"TARGET","location_code":2840,"language_code":"en","limit":1000,"order_by":["ranked_serp_element.serp_item.etv,desc"]}] → keyword, URL, position, volume. Map URLs to step 1's path families; brand vs non-brand share; families that ranked before the inflection. - 3 buyer questions for the category → `cloro.ai-search.chatgpt.scrape` {"prompt":…,"country":"US"}: order brands are named, which pages are cited. ## 5 · Ads — ~$0.03 - Meta: `scrapecreators.x.v1-facebook-adlibrary-search-companies` {"query":"TARGET name"} → pick the page whose ig_username or category matches → `scrapecreators.x.v1-facebook-adlibrary-company-ads` {"pageId":…,"status":"ACTIVE","trim":true} (searchResultsCount = active total; first page sorted by impressions). - Google: `serpapi.google.ads.transparency` {"engine":"google_ads_transparency_center","text":"TARGET","num":40} (search_information.total_results = creative count; total_days_shown = how long each ran). - LinkedIn: `adyntel.linkedin.search.ads.company` {"company_domain":"TARGET"}. - TikTok: `anyapi.tiktok.ad_library_search` {"advertiserName":…} (no region with advertiserName). - Per network: active count, oldest still running (60+ days = winner), hook, offer, landing page (read it with `treg.web.extract`). No ads → SEEN "no ads on this network". ## 6 · Who talks about TARGET — ~$0.005 - X: `anyapi.x.search.posts` {"query":"from:FOUNDER","queryType":"Top"} and {"query":"TARGET min_faves:300 -from:FOUNDER","queryType":"Top"}. - YouTube: `anyapi.youtube.search` {"query":"TARGET category","sortBy":"popular"}. - Reddit: `scrapecreators.reddit.search.posts` {"query":"TARGET","sort":"top","timeframe":"year","trim":true}, next page with `after`. - Label each item founder/team | creator (#ad or sponsored = paid) | user | press. Top 10 by engagement, dated against the inflection. Note every contest, hackathon, quote-post campaign, waitlist or invite-code drop. ## 7 · TARGET's own content, channel by channel — ~$0.05 + image reads (free) Step 6 is what others say; this step is what TARGET publishes and how it is made. Run it for every handle from step 1. Five parts: pull, rank, look, read against the checklist, write up. **Pull.** Per channel, the latest 60 posts or the past 6 months, whichever comes first, page by page; stop early if the cap would be passed. Save the rows to `rea//posts.csv` with the date pulled. | Channel | Call (and how to page) | Keep | |---|---|---| | YouTube | `scrapecreators.x.v1-youtube-channel-videos` {"handle":"handle","sort":"latest"}, next page with `continuationToken`; once more with "sort":"popular" (first page) for the all-time best | title, thumbnail, views, published, length; Shorts vs long | | TikTok | `crawl4ai.tiktok.user.videos` {"account":"handle","limit":60} (up to 100 in one call) | description, hashtags, cover, plays, saves, shares, length, sound | | Instagram | `scrapecreators.instagram.user.posts` {"handle":"handle"}, next page with `next_max_id` | kind (reel, carousel, photo), image, caption, likes, comments | | X | `anyapi.x.user.posts.timeline` {"handle":"handle"} (about 20 a page), next page with `cursor` = previous `nextCursor`; media with `tikhub.x.twitter-web-fetch-user-media` {"screen_name":"handle"}, paged by `cursor` | text, views, likes, reposts, media | | LinkedIn | `harvestapi.linkedin.company.posts` {"companyUniversalName":"slug","scrapePostedLimit":"6months","page":1}, then page 2, 3…, passing `paginationToken` when returned | text, images, document carousels, reactions; staff reposts vs page posts | | Reddit | TARGET's own account if it has one; otherwise step 6's Reddit rows (content mode: run step 6's Reddit call here) | title, subreddit, self or link post, score, comments | **Rank.** Engagement per channel: views on YouTube, TikTok and X; likes + comments on Instagram; reactions on LinkedIn; score on Reddit. Drop posts under 7 days old (not settled). With Python, mark the top quarter and the bottom half. Compare only within a channel, never across. Under 20 posts → report them, call no pattern ("too few posts to call a pattern"). **Look.** Download the thumbnail, cover, first slide or image of every top-quarter post and of 5 bottom posts into `rea//` at once (TikTok and Instagram links expire within hours), then open each file. An image that does not download is "not read", never described from its caption. **Read** each image and title against the channel's checklist. What the image shows is SEEN; why it might work is INFERRED. - **YouTube.** Title: length, number or money, first person ("I built…"), question, brackets, the promise. Thumbnail: face and its emotion, words on it (count; ≤ 4 is usual), product or outcome shown, before/after split, contrast and main colour, logo. Do title and thumbnail repeat or add to each other? Shorts vs long, length. - **TikTok.** Cover: the frame chosen, the words on it. Hook: first line of the description, on-screen text of the opening. Format: talking head, screen recording, slideshow, skit, green screen. Sound: trending or original. Length, hashtag count, posting rhythm. - **Instagram.** Mix of reels, carousels, photos, and which kind wins. Cover or first slide: headline size, words, template. Carousels: slide count, what the last slide asks. Caption: the line before "more". The grid as a whole: repeated colours, fonts, frames, logo's place. - **X.** The first line (before "Show more"), length, thread or single, media: none, product screenshot, chart or metric card, video, meme. Founder vs brand account: which outperforms; do numbers (revenue, users) drive the best posts? - **LinkedIn.** The two lines before "see more", format (text, image, document carousel, video), people vs product in the image, company page vs staff posts promoted (match against step 5's LinkedIn ads). - **Reddit.** Title pattern (question, story, "I made…"), subreddits, self vs link, whether the account says who it works for. **Write up**, per channel: - **Pattern.** 3-5 traits the top quarter shares and the bottom half lacks, each counted ("8 of 9 top thumbnails show a face, 2 of 12 bottom ones"). Counted on the images = SEEN; why = INFERRED. - **House style.** What repeats across every post: colours (named, hex read off the images), fonts or lettering, templates, logo's place, recurring formats or series. - **Formulas.** The 2-3 fill-in templates behind the top titles, covers or hooks ("I built [outcome] in [short time] with TARGET"), one real example each. - **What changed** before vs after step 3's inflection, where the dates allow (full mode). ## 8 · Links and loops — ~$0.05 - `dataforseo.web.backlinks.summary` [{"target":"TARGET","include_subdomains":true}] → referring domains; referring_links_tld shows links from the product's own user subdomains (e.g. *.TARGET-app.com). - `dataforseo.web.anchors.list` [{"target":"TARGET","limit":40,"order_by":["referring_domains,desc"]}] → one anchor on thousands of domains ("Edit with", "Made with", "Powered by") = a product loop; its first_seen dates it. Drop link-seller anchors (SEO, backlinks, Telegram). - Read 3 pages carrying the loop anchor with `treg.web.extract`: what the badge says, where it links. ## 9 · What is next — ~$0.04 - `predictleads.companies.job_openings` {company_id_or_domain} → keep openings last seen in the past 30 days; growth, SEO, paid, lifecycle, community, devrel, partnerships, sales, content, design, video and country roles → the channel each scales. ## 10 · Moves vs growth — no calls Which moves lined up with growth speeding up, and how fast each move itself spread. Python only; every input is already pulled. - **Moves.** One row per dated move from steps 2 and 5-8: launch, raise, founder or brand post, creator video, ad start, loop anchor first_seen, new content format. Keep channel, date, link and reach (views, likes, score). - **Growth speed.** From step 3's monthly traffic: growth % month over month and its change (speeding up or slowing). From step 4's brand keywords: their `keyword_info.monthly_searches` summed per month, a second demand signal. - **Spread speed.** Per post: engagement ÷ days since posting, ranked within its channel only. Top quarter = fast spreader. - **Line up.** Per move: growth in the 2 months before vs the month of and the 2 after, for traffic and for brand searches; the lift is after minus before. Moves under a month apart form one cluster; credit the cluster, never one move inside it. - **Per channel.** Monthly count of moves, and of fast spreaders, against growth 0, 1 and 2 months later: Spearman correlation and the months it rests on. Under 12 months or under 5 moves on a channel → list the rows, call no correlation. - Write up: the 3 moves or clusters with the largest lift, the channel whose moves lead growth (and by how many months), fast spreaders that moved nothing. Each lift is SEEN as numbers; that the move caused it is INFERRED (monthly data, moves overlap, growth has other causes). - Save `rea/moves-vs-growth.csv`. ## 11 · The path — no calls One row per stage, each cell SEEN or INFERRED with links: Get noticed (founder posts, press, podcasts, ads, search, AI answers, own content) → Sign up (method, card, waitlist/invites, partner links) → First win (the first action, time to it) → Pay (plans, trial end rule, free limits) → Share (what reaches non-users: shared outputs, invites, badges, referrals). ## 12 · The playbook — no calls - Ten plays, ordered by evidence × timing (started before the inflection) × lift (step 10) × fit for the user's stage. Each: the play (one line + stage) | evidence (SEEN/INFERRED + links) | effort (day / week / quarter) | time to first result + the metric | cost to try | THE PROMPT: a paste-ready prompt for the user's agent that starts the play for the user's company (concrete: pages to build, rules to draft, events to add, lists to find, posts to make). At least one play per channel where step 7 found a pattern; its prompt carries that channel's formula and house style, filled in for the user's product. - Things to skip: 2-3 plays that look good but the evidence does not support, and why. - Timeline: every dated move (launch, raise, founder post, creator video, ad start, loop anchor first_seen, hire, new content format) in date order, against the traffic curve from step 3, each with its lift and spread speed from step 10. - By channel (X, YouTube, TikTok, Instagram, Reddit, LinkedIn, ads, search and AI answers, the product loop): the moves TARGET made there, its pattern and house style from step 7, what worked (the number that moved, SEEN) and what did not (flat or complained about), each linked. - 14-day plan per channel the user should use: day by day, what to post (with the formula to use), set up or test, and the one number to check on day 14. - Method notes: endpoints called, blocked sites, images not read, the date of every count, total data cost, interpretations marked INFERRED, no affiliation with TARGET. Report the bill: balance before minus after, and per step. - Deliver `playbook.md` + one-file `playbook.html` (light/dark, every source linked, a contact sheet per channel of top and bottom thumbnails side by side, the traffic curve with every move pinned and its lift, a "Copy the prompt" button per play) + the CSVs. End with the first play to run this week. ## 13 · Content report (content mode) — no calls - Per channel: sample size and dates, the pattern, the house style, the formulas, the top 5 posts linked. - Across channels: the brand's shared style, and where one channel breaks it. - For the user's company (when given): per channel, 5 ready titles or covers written from the formulas, and one paste-ready prompt for the user's agent that makes the first post in that style. - Method notes as in step 12, plus channels with too few posts. - Deliver `content.md` + one-file `content.html` (light/dark, a contact sheet per channel of top and bottom thumbnails side by side, every post linked) + the CSVs.