Use the RISER operator toolkit with an evidence trail
RISER NATION CORP — IF YOU AREN'T BUILDING, YOU ARE DESTROYING
Working curriculum for lesson 03.4. Video recording to be added. This review combines toolkit procedures, field practice, both catalog entry registers and the original source appendices. Source claims and implementation limitations are explained alongside the teaching. Final coverage review remains open.
Start with the actual contents
The assigned files (54).zip contains a nested riser-suite-v3.zip and three repeated HTML files. There are fourteen leaf-file instances but eleven unique assets. Duplicates are not extra tools or extra source completions. The unique contents are the Suite Index; Operator's Flow in HTML and Markdown; Idea Capture; Buyer Decision Style; MVO Decision Engine; Marketing Plan Generator; Pain Discovery Tool Catalog; Client Acquisition Tool Catalog; Pain Discovery Tools Markdown reference; and the MVO explainer Word document.
The index's “ten artifacts” headline does not match the eleven unique files. Its instructions to deploy HTML or obtain an API key are historical source instructions, not commands performed by this lesson. These assets were reviewed statically; their presence is not proof of an installed, tested live service.
Assigned source archive: complete RISER toolkit
Choose the artifact for the work you are doing
Read Operator's Flow to locate the work and its intended output. Use Idea Capture to describe the business, and Buyer Decision Style to examine hypotheses about how a buyer evaluates it. Use the MVO engine as a structured questioning aid. Use the Marketing Plan Generator to draft a plan, the pain catalog to identify possible research tools, and the acquisition catalog to examine distribution options for professional services. The Word script supports a recorded explanation; it is not a recorded video.
The index proposes a foundation sequence, then asset building, acquisition, and ongoing operations/iteration. It also marks Pain Discovery, Offer Hypothesis and MVP/Service Definition step pages as still to build. Standalone phase-four and phase-five widgets are not supplied. Do not create dead links or describe these planned tools as live.
Numbering conflicts matter: Operator's Flow calls Step 1.2 Pain Discovery, while the standalone Step 1.2 is Buyer Decision Style. The index uses other shifted references. Match the asset by its name and function, retaining the original labels in the appendix, rather than silently changing the twelve-course map.
Source: RISER-Suite-Index.html within the original archive
Transfer outputs explicitly and verify what was saved
The index describes local browser storage, copying output between tools, printing to PDF and optional hosting. The inspected tools do not all use the same storage key. Sharing an origin alone does not make their data structures interchangeable. For a practical handoff, copy the intended output, paste it into the next tool's appropriate input, and check that the content is intact. A save message is not a verified backup; several scripts ignore storage-write failures.
Some tools call Anthropic directly and store a user-supplied API key in browser storage. This review did not enter a key or execute a paid request. The index's model names, per-use cost estimates, provider availability and hosting claims are historical and unverified here. Do not promise those costs or expose a personal key in a public lesson. Preserve source code as an inert appendix, not automatically executing code embedded beneath a training video.
The source's assertion that no generated material can be fabricated is stronger than its code supports. Prompt instructions express an intention, not an enforcement guarantee. Every generated claim, quotation, price and named example still needs human checking.
Source: Suite Index operating notes and underlying tool scripts
Idea Capture — write a business hypothesis that can be checked
The Step 1.1 page asks for five connected elements: who the buyer is, what problem they face, how your solution addresses it, the price tier, and why you are suited to deliver it. Its prompt targets approximately 150–220 words; the index describes about 200. Choose the applicable business-model option and supply the actual context you know. Mark missing information rather than inventing credentials, demand or customer results.
An authored practice exercise is to read the paragraph to another person and ask them to restate the buyer, problem and proposed service. A clear restatement shows communication clarity, not validated demand. Revise vague terms into concrete descriptions supported by your actual experience.
The inspected readiness check accepts thirty characters of idea text, a business-model selection and a key of at least twenty characters. That is a minimum input check, not evaluation of the idea. The code checks for an output paragraph but does not enforce the promised word count or truthfulness. Its progress animation is not evidence that research or validation occurred. Review the returned paragraph before saving or reusing it.
Source: RISER-Step-1.1-Idea-Capture.html, inputs, prompt and validation code
Buyer Decision Style — use the four styles as hypotheses
The Step 1.2 tool proposes Blueprint, Action, Nurturing and Knowledge styles, a dominant and secondary style, and cold/warm/hot communication guidance. It also generates activating and repelling phrases, likely objections, mismatch warnings and caveats. Treat these as hypotheses to compare with buyer conversations, not a psychological diagnosis or proof of how everyone in a segment decides.
For an authored application, ask what evidence a particular buyer requests, how they describe a decision, and what questions remain unresolved. Use the style suggestion to draft alternatives, then check those alternatives against actual responses. Do not turn a generated phrase into a supposedly verbatim customer quotation.
The source claims lineage from DISC, Cialdini and Schwartz and says it is not licensed B.A.N.K. methodology. That statement does not establish that its own style mapping is validated. Brand familiarity and customer awareness are also different concepts; do not collapse them simply because both can be described with stages.
The code validates field presence more than meaning and defaults an unrecognized style to Knowledge. It supplies no actual seller-style input, so its seller/buyer mismatch warning can be hypothetical. Caveats are not guaranteed by every validation path. Review the returned structure and evidence before accepting its profile.
Source: RISER-Step-1.2-Buyer-Decision-Style.html and its complete prompt/code
Marketing Plan Generator — inspect each of the ten outputs
The generator takes a profession and avatar, proposes sharpening choices, asks four questions and drafts a plan. Its four question areas are geography, pricing, acquisition source and bottleneck, with fallback options when question generation fails. The profession autocomplete is a convenience list, not a verified market taxonomy. A minimally accepted input is not a validated business.
Read each output separately: avatar, three pains, four to six gathering places, three ranked channels, lead magnet, hook/headline/body, 30/60/90-day plan, offer angle, three outreach drafts, and caveats. Verify any named place, audience statement or channel claim. The source's outreach formats include LinkedIn, cold email and a Reddit reply; generating draft text does not authorize sending it or establish suitability for those communities.
Its Reddit, Google, LinkedIn, AnswerThePublic, SparkToro and PainOnSocial buttons open searches or assist copying. They do not perform and verify research on the user's behalf. The generated plan can include representative quotations without consistently labeling them in the display. Keep hypothetical wording visibly separate from real customer evidence.
The code mainly checks top-level fields, not all requested counts, claims or nested types. A failed generation can leave an older plan in state, so inspect the actual content and identifying context before saving it. Its saved-plan list is capped at thirty, potentially dropping the oldest entries, and loading a plan does not necessarily refresh all input controls. Export or preserve important work independently rather than relying on a name in the saved list.
Source: RISER-Marketing-Plan-Generator.html, ten-section prompt, search helpers and storage behavior
Operator's Flow — interpret the sequence before applying it
The HTML and Markdown versions contain the same substantive wording. The introduction says eighteen steps, while the body contains twenty-two across five phases. Its indicative schedule is weeks 1–4 for foundation, 5–8 for assets, 9–12 for acquisition and week 13 onward for ongoing work. Claims about completing foundation in seven days, first conversations in week three or first clients in weeks six to ten have no supplied outcome data. Treat them as source planning expectations, not promises.
The source grades tools Real, Useful With Caveats or Mostly Theater. These are the author's judgments, not certifications. It favors bounded tasks such as extracting data, summarizing transcripts and drafting replies for review over autonomous strategic work. Its claims about provider availability, API access, platform enforcement, prices and professional rules require current primary verification before use. No source instruction to contact buyers, download leads or activate a system is executed by reading this lesson.
Source: Operator's Flow introduction, HTML and Markdown originals
Step 1.1 — Idea Capture
Produce a paragraph identifying buyer, problem, solution, price tier and why you can deliver. The source asks for roughly 200 words and a read-back test: another person should be able to explain the business, audience and reason to buy. Use your skills, work history and credentials as inputs, but do not substitute a credential list for a clear customer outcome. Revise jargon, feature lists and overly broad audiences. The source proposes quarterly review and revision when customer feedback contradicts the original buyer or problem. AI-generated enthusiasm is not validation.
Source: Operator's Flow Step 1.1
Step 1.2 — Pain Discovery
Produce three to five evidence-backed pain themes using the buyer's own language. The source proposes one week of three research tracks: five to ten direct conversations; reading relevant public discussions; and tool-assisted scanning. Its interview questions ask about frustration, the last concrete incident, attempted solutions, and what did or did not work. Preserve exact quotes and their source links, separately from interpretation.
The completion target is at least twenty real quotes grouped into three to five themes, with another reader able to recognize the same themes. Tag each as burning, meaning an immediate crisis or deadline, or chronic, meaning persistent friction. The source requires two leading burning themes and says all-chronic themes indicate a wrong offer or audience. Teach this as its prioritization heuristic, not proof that chronic problems cannot support a valuable service. The source's claim that AI gets pain intensity wrong about one-third of the time has no supplied evaluation.
Avoid relying on one thread, skipping conversations or selecting only evidence flattering the existing idea. Transcription and synthesis tools can assist, but a plausible generated persona is not customer evidence. Review the document quarterly as context changes. The catalog and MVO pain/avatar tools support organization; neither certifies quote authenticity or demand.
Source: Operator's Flow Step 1.2, research tracks and completion criteria
Step 1.3 — Offer Hypothesis
Write one page naming the offer, price, deliverables, outcome, timeline and buyer contribution. Use the four value-equation concepts to examine desired outcome, credible proof, delay and effort. The source's illustrative named mechanism is a fourteen-day forensic audit; it is an example, not a service promised by this curriculum. Specify what makes the mechanism useful rather than relying on a memorable name.
Record a falsifiable kill criterion before launch. The source example proposes revising an offer if no paid engagement occurs within sixty days of active outreach, potentially reducing price by 25%. Those numbers are an example, not a recommended universal threshold. The claim that first pricing instincts are usually only 40–60% of market price is unsupported. Examine actual evidence before changing price.
The completion check is a clear thirty-second explanation another person can restate. Review after the first five buyer conversations if clarity or price objections appear. AI can simulate objections, but simulated reactions are not actual buyer responses. The source mentions message-testing services and prices without current verification. Its MVO gate-number cross-references are inconsistent with the shipped engine; use the gate names and actual fields instead.
Source: Operator's Flow Step 1.3 and source examples
Step 1.4 — MVP / Service Definition
Translate the offer into a deliverable: a scope of work for services, a prototype for software or a defined package for productized services. The one-page scope includes what is included and excluded, timeline, communication cadence, revisions, out-of-scope handling and payment terms. Decide what is templated, custom or outside your service. For a package, state its name, exact deliverables, price, timeline and customer eligibility.
Completion means both provider and buyer can understand what will be delivered. Avoid vague ongoing-guidance promises, missing revision limits or deliverables without a working process. The source proposes reviewing scope after the first three engagements. Drafting or signing tools can assist; they do not establish that the agreement fits every situation. Do not build elaborate automation before understanding real delivery work.
Source: Operator's Flow Step 1.4
Step 2.1 — Competitive Intelligence
Build a one-page comparison of three to five competitors, with the procedure specifically asking for five. Examine their offer, visible price, positioning, lead magnet, hook and case studies. Separate observable claims from guesses about what is working. Record one strength, one weakness and a supportable distinction for each competitor. Credentials or tenure may be difficult to match; clearer positioning or scope may be an opportunity to test.
Refresh quarterly. Avoid excessive collection without a decision, copying an offer or treating a dashboard as insight. The source names technology, traffic, archive and scraping tools as possible aids, but their outputs and access conditions require checking. No scraping or competitor download has been executed here.
Source: Operator's Flow Step 2.1
Step 2.2 — Brand and Asset Minimum Viable Set
The proposed set is a wordmark or logo, professional headshot, one-page bio, color palette and one-page service overview. The bio should state actual credentials, three concrete prior accomplishments, appropriately anonymized when needed, and whom you serve. The completion check is a presentable professional profile, directory-listing draft and shareable service overview.
The source delays further branding until five clients and gives specific design budgets and tool prices. Treat these as author preferences and dated estimates, not necessary spending or current quotes. Avoid spending weeks polishing a logo while leaving the service unclear. Any claim that a directory requires a particular photo standard needs verification with that directory; the source's preference is not an established universal rule.
Source: Operator's Flow Step 2.2
Step 2.3 — Lead Magnet: Gift First
Create a narrow asset solving one micro-problem: the source suggests a diagnostic checklist, calculator, review template or short evaluation guide. It should be useful even if the recipient never buys. Test usefulness with two real buyers as the source proposes, preserving their actual feedback. A disguised sales deck does not fulfill the same promise.
The source contrasts an overly long forty-page document with a single tip, but length alone does not establish usefulness. Choose the form that lets the audience complete the promised task. Its tool examples cover drafting, layout and delivery; none substitutes for subject-matter review. The Marketing Plan Generator's fifth section supplies a recommendation, not a verified completed lead magnet.
Source: Operator's Flow Step 2.3
Step 2.4 — Sales or Service Page
Build a page for the specific buyer, rather than assuming a general homepage does the same job. The source sequence is hook, problem, limitations of alternatives, mechanism, proof, offer, real bonuses, guarantee or risk reversal, and CTA. Its 800–1,500-word range is a planning suggestion, not a search-ranking rule. Explain alternatives fairly and use only evidence-backed proof and meaningful terms.
Completion means a reader can understand whether the offer fits and what to do next. Avoid self-focused language, a hidden offer, vague next steps and unsupported social proof. The source lists page builders and tracking tools, but this project remains in the authorized GHL environment. More expensive tracking is not automatically warranted; first define the question and required evidence. No source tool recommendation overrides the existing platform choice.
Source: Operator's Flow Step 2.4
Phase 3 — Turn assets into actual conversations
The source prioritizes warm outreach, a named Dream 100 list, ongoing content and only then paid distribution. It also starts content in week one, so its instruction not to run channels in parallel is not absolute even within the document. Treat the sequence as a proposed focus strategy. Its objective is conversations with identifiable potential buyers rather than awareness alone. None of these instructions authorizes sending outreach from this lesson.
Source: Operator's Flow Phase 3 introduction
Step 3.1 — Warm Network Outreach
The source targets five to fifteen conversations and twenty to fifty possible introductions. It proposes a four-to-six-sentence note explaining the work, asking for a specific relevant introduction, offering something useful in return and including the lead magnet. Its completion target is notes sent within seven days with replies and introductions tracked. These are planning quantities, not expected response guarantees or instructions to contact everyone automatically.
A specific request is easier to interpret than a general request for help. Adapt the Marketing Plan Generator's draft to the actual existing relationship rather than treating a cold template as personal correspondence. The source favors an existing inbox, LinkedIn and a simple tracker over automated warm outreach. Review relevance and recipient expectations before any real communication; no messages were sent here.
Source: Operator's Flow Step 3.1
Step 3.2 — Dream 100 List Building
Create a working research table with name, title, firm, geography, contact route and one specific reason the person fits. The source targets one hundred real people, verified contact details for seventy and specific notes for fifty. Its forensic-engineer example allocates twenty-five construction-defect attorneys, twenty-five insurance-defense attorneys, fifteen subrogation managers, fifteen mechanical-contractor GCs, ten property-management firms and ten technical-committee chairs. The firms category conflicts with the requirement for named people; identify an appropriate role/person before treating an organization as a completed contact record.
The source's prospect-list use of Dream 100 should be distinguished from audience-access or partnership uses of the concept. Preserve the actual objective of each list. Research tools and public records can assist, but guessed email patterns are not verified addresses. The listed prices, enrichment capabilities and platform restrictions are not current verified facts in this lesson. Avoid replacing specific relevance with bulk automation. The claim that stopping at thirty is inherently inadequate is an author rule, not a demonstrated mathematical threshold.
Source: Operator's Flow Step 3.2 and segment allocation
Step 3.3 — Dream 100 Outreach Cadence
The proposed schedule is six touches over eight weeks, mixing appropriate channels and using a real contextual signal. It suggests fifteen touches per workday and placing the lead-magnet offer on touch two or three rather than touch one. The completion criterion, however, requires only four touches per person over eight weeks. Preserve this discrepancy rather than pretending the quantities are identical.
The source calls 8–15% interested-conversation response normal, below 5% a messaging problem, and above 25% possible targeting luck. These are unsupported benchmarks and causal interpretations. Define the denominator and inspect the actual evidence; a rate alone does not prove why people responded. More touches are not automatically better or appropriate. Honor stop requests and platform rules in any actual implementation.
Its email infrastructure, domain warm-up, authentication and professional-solicitation passages are source claims requiring current official and jurisdiction-specific review before use. A separate domain or sending tool does not guarantee deliverability or compliance. This lesson preserves and explains the proposed cadence without activating it, purchasing tools or sending messages.
Source: Operator's Flow Step 3.3, cadence, benchmark claims and operational cautions
Step 3.4 — Content Distribution Cadence
Choose a primary platform based on actual buyer presence. The source favors LinkedIn for professional services and names industry publications as alternatives, but its “almost always” recommendation is not universal evidence. Its twelve-week schedule is Monday pain posts of 150–300 words, Wednesday mechanism posts of 200–400 words and Friday proof or case-study posts of 250–500 words, on consistent days and times.
Use observed pain, actual expertise and appropriately sanitized evidence. Record reach and meaningful buyer responses alongside publishing consistency. The assertions that silent eight-week readership is the dominant pattern or that AI saves 30–50% of editing time are unverified. The useful distinction is between assistance with drafting/formatting and the evidence and judgment the author must supply. Repurposing tools require substantive original material; a large generated content inventory does not itself establish credibility.
Avoid premature platform expansion, sporadic posting and generic claims detached from the audience. Review progress against a stated objective rather than assuming twelve weeks automatically proves success. The source's Identity Commoditization argument is examined in its closing section and will be retained there.
Source: Operator's Flow Step 3.4, full weekly cadence and AI tradeoffs
Step 3.5 — Paid Channels
The source defers paid acquisition until manual channels produce measurable conversation, closing and value evidence. It proposes ten closed clients, often six to twelve months of preparation, one initial platform, a monthly cap, and cutting spend when CAC exceeds 0.33 times LTV. These are its operating heuristics, not universal financial advice. Define whether LTV means revenue or contribution and distinguish observed from projected value before interpreting such a ratio.
Its suggested platform choice depends on buyer presence or search behavior; no platform is selected or funded here. The completion check is a measurable acquisition cost under the chosen threshold and a predictable conversion rate over sixty days. “Predictable” is not statistically defined in the source. Claims about boosted posts and native optimization outperforming other tools are not substantiated. The practical exercise is to document the evidence and constraints for a proposed test, not to assume paid distribution fixes a weak offer.
Source: Operator's Flow Step 3.5
Phase 4 — Document delivery while learning from real engagements
The source begins operations alongside acquisition once a client signs. Its purpose is consistent delivery, knowledge capture and quality as workload grows. Predictions about rapid client growth or seventy-hour weeks are illustrative warnings, not measured outcomes. The following four steps specify actual artifacts to create.
Source: Operator's Flow Phase 4 introduction
Step 4.1 — Client Onboarding SOP
Document the path from agreement to first deliverable using the scope of work and experience from initial engagements. Include a welcome-message template, kickoff agenda, information checklist, project-folder template, communication agreement and payment workflow. The source's goal is a consistent first fourteen days without repeatedly inventing routine material.
Treat the claimed day of setup and day saved per later client as an unverified estimate. Preserve room for client-specific needs. Avoid missing information, absent kickoff agendas and forgotten invoices. Tools can store procedures, recordings and reminders, but templates do not replace relationship-building. No client onboarding or payment collection is initiated here.
Source: Operator's Flow Step 4.1
Step 4.2 — Delivery SOP
Map delivery from start through final work and offboarding. Include artifact templates, quality checks, internal review, time tracking and client communication points. For technical work, preserve citation and qualification requirements appropriate to that work rather than assuming a generic template is sufficient.
The source proposes a 30–50% time reduction on a second similar engagement. This is a target claim without supporting data, not the definition of acceptable quality. Measure actual time and error outcomes. Avoid shipping unchecked drafts or discovering only afterward that delivery effort exceeded the offer's assumptions. Drafting and note tools can assist with known patterns; their presence does not prove the service can be automated end to end.
Source: Operator's Flow Step 4.2
Step 4.3 — Knowledge Management
Capture reusable, approved material after engagements: effective emails, reviewed report sections, objection responses and sanitized cases. The source suggests thirty minutes of capture, tagging and filing, with a retrieval target of finding a relevant prior artifact within sixty seconds. It predicts a library that makes future work sixty percent complete after twelve months; that percentage is not established evidence.
Use meaningful names and tags, retain context and permissions, and distinguish a reusable pattern from confidential client detail. Avoid both capturing nothing and storing everything without navigation. Notion, Obsidian and other systems are examples; choosing software does not create the knowledge practice. This lesson does not assume access to every file in the user's vault.
Source: Operator's Flow Step 4.3
Step 4.4 — Tech Stack Hygiene
Create an inventory of tools, purpose, cost, access holders, stored data and review dates. Review quarterly and identify unused subscriptions or fragmented workflows. The source's completion aspiration is no forgotten tools, surprise charges or misplaced files; verify records rather than treating that aspiration as guaranteed.
Its examples of eight to fifteen tools, $30–100 subscriptions and a $2,000 monthly threshold for management software are source estimates, not purchase recommendations. Record sensitive-data locations and check actual access and provider information when reviewing the stack. A recommendation to retire a tool is not permission to cancel a subscription or delete its data. No such action is taken in this curriculum work.
Source: Operator's Flow Step 4.4
Step 5.1 — Monthly Metrics Review
Build a one-page dashboard from CRM, email, accounting and time records. Include all eight source measures: conversations started, qualified opportunities, closed engagements, average deal value, lifetime value, customer acquisition cost, hours per engagement and revenue per hour. Define the reporting period and calculation basis consistently. Revenue per hour is not profit per hour, and projected lifetime value is not realized revenue.
The source proposes updating on the first Monday monthly, reviewing for thirty minutes and choosing one change. Avoid collecting dozens of measures without a decision or equating impressions with business results. Impressions may still be useful context; the source's criticism of vanity metrics does not make every reach measurement meaningless. A dashboard is complete only when its numbers are traceable and its proposed action is explicit.
Source: Operator's Flow Step 5.1 and all eight measures
Step 5.2 — Quarterly Buyer Feedback
Ask recent clients what worked, what did not, what they would change and what they might need next. Record with permission, preserve exact language and compare patterns without selecting only satisfied clients. The output calls for at least five clients per quarter, but the procedure schedules four thirty-minute calls. These quantities conflict; choose and document a practical plan rather than claiming both were fulfilled automatically.
Use transcription and synthesis as aids, with the original context retained. Feed meaningful findings into offers, content and delivery procedures. Collecting feedback without examining a change is not the intended outcome. A customer quote belongs in public teaching only when its use is appropriate and accurately represented.
Source: Operator's Flow Step 5.2, including the five-client/four-call discrepancy
Step 5.3 — A/B Testing
The source proposes testing high-volume sales pages, lead magnets, subject lines and creative. Define the hypothesis before launch, isolate the intended change, document the result and retain the variant and reasoning. Its suggested thresholds are one thousand monthly visits per asset, up to four weeks per test and four deliberate cycles per year. These are planning heuristics, not a statistical guarantee: significance also depends on event rates, effect size, design and the analysis method.
A four-week stop can produce an inconclusive result. Do not automatically label the better-looking number a winner. Avoid testing many changes while claiming to isolate one cause, stopping as soon as a desired result appears, or losing the record of what was tested. Native or specialist testing tools are implementation examples; no test was launched here, and source claims about third-party optimization quality are not independently established.
Source: Operator's Flow Step 5.3 and testing thresholds
Step 5.4 — Offer and Positioning Refresh
Use metrics, buyer feedback and competitor changes to review the offer, price, positioning and audience. The source proposes one full day annually and an explicit end-of-year decision: retain the offer or specify what changes. Revisit whether the buyer's problem, delivery capability and supporting evidence still match the original foundation.
Document what to keep, evolve and retire. Avoid changing purely from boredom or making a cosmetic refresh without customer evidence. The source's prediction that neglected offers become stale within eighteen to twenty-four months is not supported by data here; the actionable practice is a documented review, not a universal expiry date.
Source: Operator's Flow Step 5.4 and Phase 5 introduction
Step 5.5 — Scale Decision
Choose deliberately among serving more clients in the same niche, bringing the same offer to an adjacent niche, or remaining solo. The source calls the first vertical and the second horizontal scaling; preserve those local definitions rather than assuming every framework uses the same terms. It suggests eighteen-plus months of operating data, but supplies no evidence that this is a necessary or sufficient threshold.
For more capacity in the same niche, it proposes associate practitioners, documented delivery, training and quality control. For an adjacent niche, pilot it and revisit Phase 1 assumptions. For staying solo, it suggests increasing prices; that is a proposal to evaluate, not an automatic requirement or guarantee of better margins. Write the decision and conditions for reconsideration. Avoid hiring before defining the desired role or the delivery process. No hiring, price change or expansion is activated by this lesson.
Source: Operator's Flow Step 5.5
Close all five feedback loops
- Metrics to pain discovery: a decline in conversations or closes triggers investigation of audience, message and other causes. The source assumes shifted buyer pain; that is one hypothesis, not the only explanation.
- Buyer feedback to lead magnet, sales page and offer: use genuine language to clarify answers, objections and unmet needs. Preserve the quote's context and supporting reference.
- A/B results to assets and content: retain supported findings and revise underperforming patterns, including uncertainty when a test was inconclusive.
- Knowledge library to content and lead magnets: reuse approved, sanitized cases and recurring questions. Client confidentiality and meaning survive the handoff.
- Annual refresh to the full foundation: reconsider audience, problem, offer and scope together when evidence warrants a change.
The source frames these as scheduled review meetings, not autonomous magic. Its closing discipline is to complete foundation work, define abandonment conditions, examine measures monthly, hear buyers quarterly, refresh annually and avoid adding tools instead of doing the work. No new reminder or automation is created from these source instructions.
Source: Operator's Flow five Feedback Loops and closing checklist
Interpret Identity Commoditization as a hypothesis about differentiation
The source argues that similar AI prompts can produce similar messaging, making providers harder to distinguish and encouraging price comparisons. It calls this Identity Commoditization and describes price-floor collapse as a likely consequence. This is an author argument, not a demonstrated universal causal result or a verified forecast about 2026.
Its five proposed defenses are: use AI to edit and synthesize the operator's own thinking; provide relevant prior work and distinctive context; personally own high-stakes artifacts; include authentic evidence such as an appropriate technical diagram, image or case detail; and compare three recent messages with three competitor examples quarterly. Apply these with judgment. Do not upload confidential reports or expose case identifiers merely to make content distinctive. Personal authorship also does not remove the need to verify facts.
The blanket “never generate, only refine” position is the source's preference. The practical quality requirement is accountable human review, genuine evidence and useful specificity. The stated 30–50% time savings is unverified; measure actual effort and quality rather than promising that improvement to every learner.
Source: Operator's Flow Identity Commoditization section and five defenses
Reconcile the artifact map with the shipped files
The source's closing table maps pain discovery to the pain catalog and MVO pain/avatar gates; offer work to MVO and marketing-plan offer angle; MVP definition to the full MVO sequence; competitive intelligence to a purported Competitive Moat gate; lead magnet to marketing-plan section five; warm outreach to section nine; Dream 100 to the acquisition catalog; cadence to that catalog's outreach/CRM category and section nine; and content to gathering-place, channel, hook and schedule sections.
Retain the full original table in the appendix, but do not treat its gate numbers or section numbers as authoritative. The shipped MVO Gate 03 is Profitable Problem, not Competitive Moat; the tool's output order must be checked by actual field name. Both artifacts can inform work without providing the exact function promised by an outdated cross-reference. Clickable links in the published lesson must lead to the actual supporting asset or original archive, not invented missing pages.
Source: Operator's Flow closing artifact table; compare the archived tool implementations
MVO Decision Engine — understand what a verdict means
The rail has seventeen entries: Start, fifteen working gates and Brief. The source alternates sixteen and seventeen in its descriptions. The working sequence is Pain Discovery; Hungry Avatar; Idea/No Idea; Profitable Problem; Grand Slam Offer; Offer Stack; Core Four Distribution; Dream 100; Hook/Headline/Body; Persuasion Architecture; Deploy; Iterate; Pivot; Scale; and Repeat. The rail permits jumping between entries, so “sequential” describes the proposed learning order rather than enforced validation.
GO, NO and REWORK are outputs of authored rules applied to entered answers. They do not verify market demand, legal permission, statistical confidence or business viability. Distinguish an unanswered field, a low score, contradictory evidence and a verified failed test. The script sometimes collapses these into the same verdict.
Changing answers does not automatically invalidate saved verdicts. Re-evaluate affected gates before relying on the rail, summary or export. A gate can display freshly calculated reasons while the stored summary badge remains old. The tool's claim of automatic saving also needs verification in the actual browser; keep a separate record of important work.
Source: RISER-MVO-Widget-Direct.html, navigation, verdict and persistence implementation
Gate 00½ — Pain Discovery
Each of up to five pain cards records a title, 0–100 score, frequency, source community or URL, audience description, up to five verbatim quotes and solution seeds. The available frequency categories are daily/weekly, monthly, quarterly/seasonal and one-time/project. Select a lead card; optionally cluster related cards around it. Other cards remain supporting material. If research is unavailable, skipping is permitted, but downstream answers remain hypotheses.
The code requires a lead title of at least ten characters, an audience description of at least thirty, and qualifying quotes of at least ten characters. A passing score can come from any card scoring at least seventy, not necessarily the lead. It accepts three qualifying quotes even though some feedback asks for five, and eight quotes strengthens its “locked” message. These are interface rules, not evidence standards. Neither a typed score nor a copied quotation is independently authenticated.
Applying the lead card overwrites avatar text, maps its score to the intensity scale and sets problem frequency. It fills problem text or mechanism hints only when those are empty. The VOC vault lets you pull quotations into downstream fields, but its reusable entry does not reliably retain a precise source URL and insertion uses generic attribution. Preserve the original quote, source link, date and context alongside every teaching or business claim. Recheck the affected fields and verdicts after applying or editing a card.
Source: MVO Pain Discovery fields, lead/cluster/VOC helpers and verdict code
Gate 01 — Hungry Avatar
Describe who the buyer is and their specific pain in their own language, then rate purchasing power, market trajectory, reachability and pain intensity on four 1–10 scales. The source gives detailed role-and-context examples to contrast with vague labels such as all small businesses. Use relevant specificity, not invented demographics or financial details. A description of last Tuesday's work, a comparison with another experience tier, and observable common characteristics are its sharpening prompts.
The code checks both text fields for at least twenty characters, sums the four ratings and may add four points when the lead pain score is at least eighty-five with five quotes, capped at forty. GO starts at thirty-two, REWORK at twenty-four and NO below that. These self-entered scores are not validated purchasing power or market-growth measurements. The source's $1,000 spending guideline and “top-three pain means budget exists” claim are heuristics, not facts about every buyer.
External-verification buttons construct searches from the entered keywords. Reddit, Google, YouTube, X, Trends and job listings can provide research leads; the button itself has not verified the avatar. The AI sharpen feature critiques specificity and may suggest a rewrite. Check every added detail, label examples, and retain actual source evidence rather than accepting confidence of wording as confidence of truth.
Source: MVO Hungry Avatar definitions, examples, sharpening prompts and scoring
Gate 02 — Idea or No Idea
Write a one-sentence offer naming the audience, outcome, timeframe and objection. Select whether the market is crowded, has some competitors, has almost none, or would make you a first mover. Then answer the proposed $100-today question: can you name ten people, would you need to find them, or would reaching buyers require weeks of marketing? These are self-reports; imagining a buyer is different from receiving a payment.
The implementation accepts a thirty-to-two-hundred-character sentence. No competition or a negative payment-readiness choice returns NO; thin competition or uncertainty returns REWORK; a busy or moderately competitive market with the named-buyers choice can return GO. The feedback also proposes asking twenty people whether two would pay, a different count from the ten-person input. Neither check records an actual payment test.
Competition can be useful evidence of alternatives, but its presence does not prove demand for your specific offer, and its absence does not prove failure. Document the observed alternatives and what remains uncertain. Treat the source's strong first-mover warnings as its preference, not a universal law.
Source: MVO Idea/No Idea inputs, choices and verdict rules
Gate 03 — Profitable Problem
State the exact problem, its frequency, the cost of leaving it unsolved and what buyers currently do instead. Alternatives include competitors, informal help, searching or tolerating the problem. The recurrence options run from daily/weekly to monthly, quarterly/seasonal and one-time/project. The cost choices are high, moderate and low. Explain the evidence behind both choices rather than treating them as objective measurements.
The code checks the two text fields for at least twenty characters. Low cost returns NO. One-time problems or moderate cost return REWORK. Otherwise frequency weights of four, three, two or one combine with cost weights of four or two; a total of at least six produces GO. These rules favor recurrent high-cost problems but do not calculate actual profit, customer acquisition cost or fulfillment cost.
The source associates recurring problems with recurring revenue and one-time projects with reacquisition costs. Those are business-model considerations, not guarantees that subscriptions work or that project businesses are weak. The label Profitable Problem does not certify profitable unit economics.
Source: MVO Profitable Problem inputs and weighted verdict logic
Gate 04 — Grand Slam Offer
Describe the dream outcome and rate its strength; list real proof and rate perceived likelihood; choose time to first result; choose customer effort; and name the mechanism. Time choices are within twenty-four hours, the first week, the first thirty days, or months. Effort choices distinguish done-for-you, done-with-you, DIY with support, and largely self-directed work. The source's price bands and claims that one delivery style always has higher value are author assumptions, not verified market prices.
Use the conceptual outcome/likelihood/time/effort framework to identify where the offer needs stronger evidence or better delivery. The actual widget score is different: it multiplies the two 1–10 ratings, divides by the SUM of transformed time and effort values, and multiplies by ten. Time is mapped to 10, 8, 6 or 3 and effort to 10, 8, 5 or 3; each is subtracted from eleven before adding the denominator. The result can reach five hundred despite a display maximum of one hundred. GO begins at thirty-five, REWORK at twenty and NO below that. A high score is not a validated percentile or Hormozi's original equation.
The text checks use minimum lengths of twenty characters for outcome, ten for proof and thirty for mechanism. Length does not establish truth, differentiation or delivery capability. Replace vague promises with an actual supported result and relevant evidence. Preserve the flawed original formula in the appendix; do not silently turn it into a different scoring method.
Source: MVO Grand Slam Offer fields and implementation · Primary conceptual value-equation reference
Gate 04½ — Offer Stack
Enter the offer name; three to five proposed bonuses with a name, outcome and supportable standalone value; guarantee type and exact wording; scarcity mechanism; total stack value; and actual USD price. A useful bonus resolves a relevant next problem. A price anchor needs a defensible basis rather than an invented large number. The source's claims of a 30% naming conversion lift and guarantees halving or doubling conversion are not supported by data.
The guarantee choices are anti-guarantee/no refunds, conditional, unconditional, implied and none. These are source categories, not a universal ranking of appropriate terms. Explain exactly what is offered and what conditions apply; do not imply that a no-refund statement overrides applicable obligations. The scarcity choices are cohort cap, founding price, bonus expiry, launch window, fake urgency and none. Any limit must be real. An offer without scarcity is not inherently invalid, despite the source's negative framing.
The code accepts names of five to eighty characters, bonuses of at least sixty characters and guarantee text of at least twenty. It does not verify three to five actual bonuses. Fake urgency or no guarantee returns NO; no scarcity, a value-to-price ratio below three, or an implied guarantee returns REWORK. Other complete combinations can return GO. The suggested five-to-ten-times value anchor is an author heuristic, not a market valuation. Numeric parsing does not explicitly reject negative prices, so validate the actual amounts yourself. A passing gate is neither a guarantee review nor proof of profitability.
Source: MVO Offer Stack fields, choice labels and verdict code
Gate 05 — Core Four Distribution
Choose a primary channel: warm outreach, cold outreach, content for an existing audience, or paid ads. Write the volume assumptions and declare whether acquisition cost, lifetime value and payback are known, partly estimated or unknown. The source favors focus on one channel; claims that a channel is free, fastest or best for the first ten customers omit context and labor costs.
Its example of ten customers at 1% conversion implies one thousand opportunities. Spread over ninety calendar days that is about eleven per day, rounded up to twelve; a workday schedule produces a different daily target. More activity is not always the answer if fit, permission, delivery or economics are wrong.
The implementation checks a channel, thirty characters of volume explanation and an economics choice. Paid ads without “yes” returns NO; other complete combinations can pass without calculating CAC, LTV or volume. The stated one-third-of-twelve-month-LTV rule is not validated by the code. Define LTV consistently and retain actual evidence. No spend or messages are activated by choosing a channel in this lesson.
Source: MVO Core Four inputs, volume example and paid-channel rule
Gate 05½ — Dream 100
List specific people, podcasts, newsletters or groups the audience already follows, with real URLs and a reason for relevance. Choose the source's proposed strategy: build familiarity by contributing useful work, pay for appropriate distribution, or develop a mutually useful partnership. Draft a first message and choose the intended weekly contact category: twenty-plus, five-to-twenty, fewer than five, or none. The overlapping boundary at twenty is an original labeling ambiguity, not a meaningful difference in evidence.
The UI requests twenty-five entries, but the code only checks at least one hundred characters and ten newline-separated lines. Empty or irrelevant lines can therefore satisfy a structural count without making a useful list. First-message text needs thirty characters; no-volume returns NO, low-volume REWORK, and higher categories can pass. Names, URLs, relationship fit and consent are not verified.
The source's gift-first rule, ninety-day invitation expectation and claims of network density by particular months are prescriptions or predictions without supplied evidence. A useful contribution does not create an obligation to respond or buy. The source also conflicts with Operator's Flow over whether the first outreach should include a gift. Choose a context-appropriate approach and record the rationale rather than treating either prescription as universal.
Source: MVO Dream 100 fields, strategy options and implementation · ClickFunnels Dream 100 explanation
Gate 06 — Hook, Headline and Body
Write the hook, headline and body, then classify the CTA as a named asset/outcome, an action plus topic, or generic wording. The source's hook examples include an audience question, a pattern interrupt and a statistic. A statistic such as its illustrative 47% must not be copied into real marketing without evidence. The three-second framing is not a universal measurement of attention.
The headline template combines outcome, timeframe and objection. The body skeleton is problem, what is working, named mechanism, proof and specific CTA. The source suggests fewer than one hundred words for ads and 250 for landing pages, while its Operator's Flow suggests 800–1,500 for a service page. Treat these as different writing contexts, not one consistent enforced limit.
The code checks hook length of twenty-to-two-hundred characters, headline length of twenty-to-250 characters and body length of at least eighty characters. It does not enforce the word limits, verify evidence or assess the actual CTA text. A generic CTA choice produces REWORK, while the middle category can pass despite stronger feedback language. The claim that generic CTAs convert at half the rate is unsupported. Judge whether the next step truthfully matches the destination and audience need.
Source: MVO Hook/Body definitions and validation · ClickFunnels Hook, Story, Offer reference
Gate 06½ — Persuasion Architecture
State the central belief the offer requires, examine proposed objections about the mechanism, the customer's own situation and external conditions, and identify the useful resource offered before a sales request. These beliefs are hypotheses to explore, not permission to label every valid concern false. The source attributes its Big Domino and three-belief framing to Brunson; exact wording remains source attribution unless separately verified.
Then select five levers. Reciprocity ranges from a specific useful asset to generic or absent. Social proof ranges from five-plus similar-customer testimonials, to two-to-four, to zero-or-one/generic praise. Authority is strong, borrowed or thin. Unity is explicit, implicit or absent. Consistency is a multi-step journey or a direct ask. These choices omit other principles despite the broader source's references to seven principles; do not call the five-item score a complete or validated Cialdini assessment.
The code requires thirty characters for the central belief, sixty for the objection audit and twenty for the lead magnet, plus the five choices. It assigns up to two points each for reciprocity, social proof, authority, unity and a multi-step flow. No reciprocity or low social proof returns NO; otherwise fewer than six of ten returns REWORK and six or more can pass. Text length does not verify three distinct objections or genuine customer evidence.
The source's claims of one-third conversion without a gift, a 20% lift from shared identity and superiority of particular testimonial counts are unsupported. Use genuine, relevant proof and accurately attributed endorsements. Never fabricate testimonials to pass the gate. A free resource or a small commitment does not oblige a person to take a larger one. The purpose of clearer persuasion is an informed decision, not pressure that hides material conditions.
Source: MVO Persuasion fields, five scoring levers and verdict implementation
Gate 07 — Deploy
Record a specific launch date, cohort-size category, beta price, abandonment rule and readiness of four functions: lead capture, payment, delivery and measurement. The cohort options are five-to-ten, ten-to-twenty-five, twenty-five-to-fifty and fifty-plus, with overlapping boundaries. Source examples propose fewer than five paid customers in fourteen days or fewer than three in twenty-one days as pivot triggers. These are sample operating rules, not universal launch criteria.
The source asks for a date within thirty days, but the code accepts any nonempty date text. It rejects fewer than three functioning tools but can pass three of four despite the option promising REWORK. It parses a nonzero price without explicitly rejecting negative values. Prices from $500 to $900, an open-ended keep-going rule or the largest cohort trigger REWORK. The source's recommended $497–$997 service range partly overlaps its disfavored middle, illustrating why its pricing preferences should not be treated as a coherent pricing model.
Verify the actual end-to-end process, delivery capacity, dates and terms before a real launch. The claimed tenfold testimonial-density benefit from a smaller cohort is unsupported. A gate pass does not publish pages, test payment or prove that the offer can be fulfilled.
Source: MVO Deploy fields, overlapping ranges and actual validation
Gate 08 — Iterate
Select the amount of customer exposure, describe the dominant observed pattern, choose one outcome/likelihood/time/effort lever, identify awareness and sophistication hypotheses, and state the refund-feedback practice. The source's sample categories are fewer than ten conversations, ten-to-twenty, and twenty-to-thirty conversations or thirty-plus users. These overlap and do not establish statistical sufficiency. More observations help only when their meaning and relevance are understood.
Awareness choices are unaware, problem-aware, solution-aware, product-aware and most aware. The source suggests moving from problem explanation toward mechanism, proof and a clear offer as familiarity increases. Its sophistication choices progress from a new claim, to stronger claims, distinctive mechanisms, different mechanisms and identity/story. These are separate concepts. The help text sometimes conflates them by saying a most-aware audience needs a new mechanism. Do not automatically strengthen an unproven claim because the market has heard similar claims before. The source's dramatic weight-loss example is not an endorsed or supported result.
The five proposed refund questions ask what the buyer hoped to achieve, what caused them to step back, where they see the issue, what might have changed the experience, and whether they would refer someone. Ask for feedback respectfully; participation is not a prerequisite for processing a valid refund. The exact attributed Hormozi quotation is unverified. The “sometimes” choice can pass even though its label suggests REWORK; “never” returns NO. The smallest sample returns NO and the middle sample REWORK; a pattern description needs thirty characters. These structural checks do not validate the diagnosis.
For sophistication stages three through five combined with outcome or likelihood changes, the code adds a mechanism-renaming suggestion. A new name is not proof of a new or better delivery method. Record one deliberate change, its rationale and the evidence that would alter the decision.
Source: MVO Iterate fields, five awareness stages, five sophistication stages, refund questions and verdict rules
Gate 09 — Pivot or Hold
The three selections describe hook response, opt-in or buying-conversation response, and post-purchase outcomes. The source supplies illustrative benchmarks: cold-ad CTR 1–2%; organic engagement 1–3% of followers; cold landing-page opt-in 20–40%; sales-page purchase 1–3%; application/booking 5–15%; and refund bands below 5%, 5–10% and above 10%, with NPS also mentioned. These are unsupported broad thresholds, not standards for every campaign. Define comparable denominators, periods and events before interpreting them.
The code examines weak hook response first, then low opt-in, then negative post-purchase response. Consequently a hook warning can hide a more serious refund or delivery issue in the displayed verdict. Read all three measures together. The source's one-to-one diagnosis—low clicks means hook, low opt-ins means audience, refunds mean offer—is a hypothesis, not unique causal proof. Technical failures, mismatched expectations, measurement problems or multiple causes may also matter.
Do not assume a low refund rate certifies offer quality or justifies scaling. Preserve evidence of actual buyer outcomes and unresolved issues, then specify whether to revise the message, targeting, offer, delivery or measurement.
Source: MVO Pivot fields, source benchmarks and branch ordering
Gate 10 — Scale
Declare whether there are ten-plus customers from one channel, known economics and six-plus months of retention data; choose price, retention or volume as the proposed lever; and describe the bottleneck. The code checks a twenty-character bottleneck and declared choices. No signal returns NO, partial signal REWORK, and choosing volume also returns REWORK. Other complete cases can pass without inspecting actual records.
The source favors price first, retention second and volume third, but gives no universal evidence for that order. Its claim that a 10% price rise produces 50% more profit depends on starting margin, volume and costs. Its claim that 20% less churn doubles LTV is mathematically wrong under a simple inverse-churn model: reducing churn to 80% of its former level raises that modeled LTV by 25%, assuming everything else fixed. Real customer economics require more context.
The practical exercise is to identify a capacity or economics constraint, propose a controlled change and review its results. The source suggests reassessment at thirty days. A self-reported scale signal is not a spending authorization or a guarantee that a single bottleneck explains every problem.
Source: MVO Scale fields, rules and financial claims
Gate 11 — Repeat and compound
Describe the next customer problem, select a new offer for the same audience, an adjacent audience, a new channel or an entirely new business, and state whether the current offer is fully developed, still has room or simply feels boring. The source suggests asking twenty customers what they might buy next; stated interest is not a verified purchase commitment.
Name five proposed ladder positions: free resource; a $7–$97 entry offer; a $297–$1,997 core offer; recurring offer with monthly price; and a $5,000–$50,000-plus premium tier. Those prices are source examples, not required or validated bands. Record continuity participation as sixty-plus percent, twenty-to-sixty, below twenty or absent, and affiliate activity as active, informal or absent. The sixty-percent boundary overlaps in the labels.
The code requires thirty characters for the next problem and all decision choices. Boredom or absent continuity returns NO. A new business, fewer than three named rungs of five characters each, room remaining in the current offer, or no affiliate activity combined with less-than-strong continuity returns REWORK. It counts any three rungs, despite feedback asking specifically for free resource, core and continuity. A passing record does not verify ARR, retention or affiliate performance.
Claims of doubled or fivefold LTV, sixty percent of LTV left behind, eighty percent of profit at the premium tier, or seventy percent of business value abandoned are unsupported. Referrals and affiliates do not have zero acquisition cost when commissions, administration and support exist. A 30% commission is a source proposal, not a required or proven rate. Build an additional offer only around a real customer need and viable delivery; a subscription or affiliate program is not universally necessary.
Source: MVO Repeat fields, ladder, continuity/affiliate choices and verdict implementation
Brief, export and AI critique — preserve the complete evidence separately
The printable brief summarizes selected answers and the first three vault quotes. It omits some fields and does not guarantee a single printed page. Its badges use stored verdicts rather than reliably recomputing all decisions. JSON export preserves state and stored verdicts, but should not be confused with an independently verified evidence archive. Re-evaluate after changes and retain full source material, not only the brief.
The AI critique sends the current answer for a specificity score, critique, weakest element and suggested rewrite. The code accepts score and critique presence, clamps the score to 1–10, and does not require every promised field. Its prompt simultaneously prohibits invented facts and permits plausible examples when details are missing. Review any rewrite before inserting it, label hypothetical detail and restore precise quote provenance. Search links, AI critique and rule-based verdicts are three different functions; none automatically validates a market.
The saved API key is separate from exported state, but original research and buyer information can still be in that state. Check what you share. This lesson has not executed an API request or deployed the raw widget.
Source: MVO summary, exportJSON, runAiSharpen and state handlers
Record the explainer in eight sections without repeating its errors
The original Word document is a talking-head production script, version 3 dated April 2026, with an estimated 28–35-minute runtime. Its eight section estimates add to twenty-eight minutes: three, three, four, five, four, three, four and two. The instruction that every section is under five minutes conflicts with the five-minute fourth section. Treat all timings as estimates to verify by read-through.
Camera directions, B-roll instructions, gestures, pauses and graphics cues are production notes, not spoken lesson text. The original describes red italic directions and red bordered doctrine quotations. Preserve the Word original and its eighteen-row reference table; the plain transcript does not preserve all visual formatting. The archive contains a script, not an actual recorded video or audio file, so leave the training slot as a placeholder rather than claiming a recording exists.
Recording section 1 — Cold open and purpose
Explain the cost of building without testing and the value of a structured decision record. The original promises saving or compressing ninety days; replace that performance promise in a new recording with the truthful purpose of making assumptions and next tests explicit. Its credits to Hormozi, Brunson, Kennedy and Cialdini describe claimed conceptual influences, not their endorsement or authorship of the tool. The tool does not prove an idea will survive the market.
Source: MVO Widget Explainer Word document, section 1 and recording instructions
Recording section 2 — Architecture
Show the actual seventeen rail entries and explain the fifteen working gates grouped into detection, construction, deployment and compounding. Start and Brief are navigation entries. Demonstrate GO, NO and REWORK as rule outputs. Correct the source's claim that the widget prevents moving past flaws: the rail permits direct navigation, and even completed fields can contain unsupported assumptions. Do not call the gate sequence external validation.
Source: Word section 2; compare archived MVO navigation code
Recording section 3 — Pain Discovery
Demonstrate the seven card fields, the lead selector, optional clusters, quote vault and applying a lead to downstream fields. Explain the seven intended quote destinations: avatar pain, problem statement, dream outcome, hook, headline, body and reciprocity gift. Verify attribution after insertion because the tool can lose precise source context.
The script says the lead must score seventy; the code allows any qualifying card to supply that score. Its claim that customer language improves copy performance by 30–50% has no supplied evidence. A quote imported from an actual source can improve specificity, but a percentage lift is not established. Show skipped research as an explicit hypothesis state, not an equivalent evidentiary outcome.
Source: Word section 3 and MVO pain/VOC implementation
Recording section 4 — Market and offer gates
Walk through avatar, idea, problem, offer and stack using the detailed gate teaching above. Correct the spoken avatar boundary: thirty-two is included in GO, not only scores above thirty-two. Explain that the offer's computed score is an authored, flawed implementation that can exceed one hundred; it is not Hormozi's exact formula. Thirty-five is also included in GO. Named mechanisms and stack values require real delivery and evidence, not impressive labels.
The sample script library, its claimed closed deals and assigned $497 value are examples in the source, not verified products or results. The claim that naming identical content changes its value from $97 to $4,997 is unsupported. Do not record such claims as factual proof.
Source: Word section 4; compare MVO scoring and field definitions
Recording section 5 — Distribution, copy and persuasion
Explain one-channel focus, explicit volume assumptions, audience-access research and a truthful hook-to-offer sequence. Demonstrate the actual controls: the copy gate has three textareas and a CTA choice, not four textareas with quote buttons as the script says. The five-lever persuasion score is an authored rubric, not an empirically validated Cialdini score. Avoid repeating the script's unsupported CTA conversion uplift or follower count example as current fact.
Use source-grounded language and genuine proof. A generated calculator description, sample proposals or claimed deal values are not verified assets unless they actually exist and have been checked. The source's aggressive outreach thresholds and gift-first maxims do not authorize messaging or override recipient choice.
Source: Word section 5 and corresponding archived tool fields
Recording section 6 — Deploy and iterate
Demonstrate launch fields, tool readiness and the chosen test criterion without presenting a date string as a verified launch plan. Explain sample-size uncertainty and keep awareness separate from market sophistication. Correct the refund-interview discrepancy: the script says silent processing produces REWORK, while the actual code returns NO for the “never” choice. Neither verdict should delay a refund that must be processed.
The original's “done beats perfect every time” and volume claims are motivational rhetoric. A responsible launch still needs to fulfill its promise and function correctly. The lesson is to learn from a defined test, not to excuse avoidable defects or unsupported claims.
Source: Word section 6; compare Deploy and Iterate implementation
Recording section 7 — Pivot, scale and compound
Explain the difference between a diagnostic hypothesis and proven cause. The original suggests ten new hooks tested at one hundred impressions each; those are proposed counts, not guaranteed statistical power. Review customer outcomes even when an earlier hook warning appears. Correct the churn/LTV arithmetic and qualify the price/profit claim using the gate explanations above.
Present the five ladder positions as possible offer structures with the original example price bands, not requirements for every business. Correct the claim of fifty affiliate-generated customers at zero acquisition cost: commissions and operating effort can still be costs. The source's 80% premium-tier profit claim and guaranteed-moat language are unsupported.
Source: Word section 7 and the Pivot, Scale and Repeat source logic
Recording section 8 — Brief and next action
Show the actual brief and explain its selected content, first three quotes and potentially stale verdict badges. The source says it contains every decision and every evidence item in one page; the implementation does not. Keep the complete research record separately and inspect JSON before sharing. A GO badge reflects entered choices and rules, not confirmed commercial success.
Close with a concrete exercise: choose one hypothesis, complete its evidence record, inspect the rule's limitations and identify the next real-world test. Preserve the original closing rhetoric, approximate field count and all table rows in the appendix, but do not repeat unverified claims as the new lesson's guarantees. The video remains a placeholder until a recording is actually supplied and reviewed.
Source: Word section 8 and eighteen-row quick-reference table
Read the two catalogs by purpose, not as a shopping list
The pain catalog groups forty-one entries into seven tiers: eight Reddit/pain-mining entries, six audience-intelligence entries, seven VOC-synthesis entries, nine listening entries, four enterprise-listening entries, five idea/offer-validation entries and two quantitative-validation entries. Each group proposes a different input to the MVO workflow. Discovery, synthesis, monitoring, modeled critique, survey response and observed behavior are different forms of evidence; grouping them under validation does not make them interchangeable.
The original catalog says prices and links were verified in April 2026. That is a historical source claim, not a verification performed for this lesson. The accompanying eighty-entry teaching register preserves each original description, feature, benefit, price, flag, workflow destination and note with its resource link. Its entry-specific interpretation explains what can and cannot be inferred. Current product availability and plan details remain to be verified before any actual selection.
Source: Pain Discovery Tool Catalog, tier definitions and companion Markdown
Pain-catalog tiers and proposed uses
Tier one supplies candidate pain statements and original discussion references for Pain Discovery. Tier two investigates where an audience gathers and what it asks, feeding avatar and Dream 100 hypotheses. Tier three organizes interviews and feedback into traceable themes. Tier four monitors changing mentions for iteration and diagnosis. Tier five describes larger-scale versions of listening, with a source price range of $500–$5,000-plus monthly; enterprise size alone does not create stronger evidence. Tier six mixes AI-generated analysis, human message feedback and behavioral tests, which must remain clearly distinguished. Tier seven supplies surveys and interaction observations that can inform, but not uniquely determine, a diagnosis.
Search and tier/budget filters reorganize static records. They do not verify the provider, parse every price into a comparable monthly cost or generate new market evidence. The original flags identify additions, free options and enterprise categories; “essential” or a recommendation order is an author judgment, not an acceptance requirement for the learner.
Source: Pain Catalog seven tiers, filters and data records
Inspect all three proposed pain-research stacks
The source's Validation Starter combines PainOnSocial at $19/month, SparkToro at $38/month, F5Bot free and Typeform free, under a $60–$100 monthly heading. The stated paid components sum to $57 before any unlisted costs, taxes or plan differences. The document variously says the stack supports every gate or gates 00½ through 06, and elsewhere recommends speaking to five real customers before signing up. These are different author guidelines, not proof that a subscription supplies market evidence.
Its Iterate & Compound stack adds Dovetail at $0–$29/month, Brand24 at $99–$199/month and Hotjar at $39-plus to an approximately $60 starter base, with a $200–$400 heading. The displayed amounts imply approximately $198–$327-plus under those assumptions. The Markdown suggests adding synthesis after ten-plus customers and a listening tool for ongoing signals. Customer count alone does not establish that a paid platform is needed.
The Scale & Defend heading says $500-plus per month, but its listed example includes a roughly $300 prior stack, $540-plus for Wynter and $1,000-plus for enterprise listening, already $1,840-plus before a custom-priced synthesis tool. Wynter's entry says per test, while the stack says per month. Do not combine these units without stating testing frequency. The source's broader enterprise recommendations are historical scenarios, not purchasing instructions.
Source: Pain Catalog three stack tables and Markdown usage notes
Preserve the Markdown variant and its inconsistencies
The merged Markdown says thirty-four tools at the top but enumerates forty-one. Its final table correctly totals 8+6+7+9+4+5+2=41. Dropping four enterprise entries and Productboard, as suggested to reach thirty-four, would leave thirty-six. Retain all forty-one; do not delete records to force the mistaken headline count.
The document says the merged edition retains an original twenty and adds candidates from three prior AI responses. It deduplicates multiple Brandwatch, Sprout Social, Sprinklr, Productboard and Talkwalker URLs as products. Its plus symbol marks additions and its star marks enterprise pricing. The source reverses an earlier enterprise exclusion to preserve broader coverage. Those are provenance notes, not directions to buy the added products.
It excludes GummySearch based on a claimed November 30, 2025 shutdown; DemandDrop and MarketScope because the author could not verify them; and certain X listening tools because of claimed API uncertainty. Preserve those reasons as historical claims without treating them as current verified service status. The plain-text candidate domains are references to excluded products, not recommendations. Both HTML and Markdown originals remain in the complete appendix so their wording and resource lists can be checked.
Source: merged Pain Discovery Markdown, exclusions, legend and count table
Acquisition catalog: distinguish the six-step journey from seven categories
The acquisition catalog targets professional-service gatekeepers such as attorneys, adjusters and claims managers. Its introduction claims these buyers do not use certain channels and decide credibility within thirty seconds; those broad claims are unsupported. Actual buyer behavior needs investigation even when the practitioner has deep expertise.
Its six-step journey is identify the decision-maker; establish appropriate directory or roster visibility; provide useful education or another relevant first contribution; examine possible interest; hold a specific, evidence-backed buying conversation; and build repeat relationships through delivery, approved cases and professional participation. Its seven tool categories are visitor identification, directories, LinkedIn, contact data, legal/case research, outreach/CRM and reputation. The prose says six channels while the data has seven, and some entries feed a seventh Reputation step absent from the six-step journey. Keep those numbering systems separate.
Visitor identification is a signal with uncertainty, not a verified willingness to buy. Giving useful material does not create an obligation. Membership or speaking does not guarantee future leads, despite the tier's prediction that all such activities produce them in 2027 onward. The catalog is a proposed professional-services workflow, not proof of inevitable results.
Source: Client Acquisition Catalog introduction, buyer journey and seven tier definitions
Acquisition Dream 100 template
The original template allocates twenty-five construction-defect attorneys, twenty-five insurance-defense attorneys, fifteen subrogation managers, fifteen mechanical-contractor general counsel, ten property-management firms and ten technical-committee chairs. It names Travelers, Liberty Mutual, Chubb, Hartford, AIG and Zurich as examples for subrogation research, and ASHRAE, NFPA and ASCE for committee leadership. These organizations are source examples, not confirmed buyers or contacts.
The template asks for one hundred named people in the relevant specialty and geography, weekly work and quarterly refresh. Identify an actual relevant person when a category names a firm. The illustrative named attorney, Sarah Chen at a specified Phoenix firm, is unverified and must not become a purported real lead or testimonial. Claims that subrogation is the largest source of forensic work or that contractors are frequently sued are unsupported here. Research fit and context without inventing case history.
Source: Client Acquisition Catalog Dream 100 template and illustrative identity
Inspect all three acquisition-stack budgets
The Foundation Stack lists SEAK $545/year, JurisPro $399/year, LinkedIn free, Leadinfo €69/month and NAFE approximately $300/year. The annual dollar items total $1,244, or about $103.67/month, plus €69/month. That cannot honestly be presented as a $60–$120 all-in monthly budget without accounting for the separate currency and other charges. No exchange rate or current price is assumed.
Active Acquisition adds a source estimate of $120 for the prior stack, Sales Navigator $99, Apollo $59, an outreach tool from $39 and a free CRM, under $300–$500/month. The listed dollar subtotal is $317-plus using its own prior-stack estimate, but inherits that estimate's omissions. The Multi-Practitioner Firm example starts with about $500/month, adds custom contact-data pricing, referral fees per case, a CRM at $25–$69 per seat and monitoring from $50/month. Variable fees and seat counts prevent an exact total. The source's three-practitioner threshold and claim that earnings justify the spend are not established for this business.
The catalog excludes Reddit mining, enterprise listening, most VOC tools and generic marketing copilots as poor fits for its intended job. These are scope choices, not proof that no professional buyer ever uses those channels. Its anonymous veteran quote and directory-versus-LinkedIn return claims remain unverified. Preserve the full tables and all resource links; choose any future tools from actual requirements and verified terms rather than source rhetoric.
Source: Client Acquisition Catalog budget tables, operator note and exclusions
MVO field practice — additional teaching for lesson 03.4
Additional practice for the toolkit's field labels, options and examples. Use it alongside the gate procedures and implementation limitations already taught in the main script. Source examples are illustrative unless their evidence is explicitly established.
Hungry Avatar: explain why the specific examples differ
The original contrasts “small business owners” with marketing managers at SaaS companies at $5M–$20M ARR who are responsible for pipeline. The useful difference is the combination of role, operating context and responsibility. The revenue band is an example from the source, not a requirement for your audience. In your own record, supply only characteristics you can establish. Then ask whether those characteristics change the person's problem, buying process or ability to use the offer. Extra detail that makes no difference is not automatically better targeting.
The pain field contrasts wanting more clients with losing three hours every Friday reconciling Stripe. The second example names a recurring task, time cost and context, making it possible to investigate what happened. It is still an illustrative sentence until a real person said it. Do not place quotation marks around your own reconstruction and call it customer language. An authored practice task is to write the actual source beside a real quote and separately state your interpretation of the problem.
Read the four ratings separately. Purchasing power concerns actual capacity and demonstrated relevant spending; the source's $1,000 rule does not measure either on its own. Market trajectory concerns evidence of growth or contraction over a specified period; the source's “dying” to “exploding” scale is subjective language. Reachability concerns a relevant channel through which the audience can appropriately be reached; finding an account is not consent to contact it. Pain intensity concerns the buyer's priorities in context; being a top-three problem does not prove that money is available. Record the evidence and uncertainty for each rating before adding them. A large total assembled from guesses remains a set of guesses.
Supporting archive — Hungry Avatar labels, examples and scale help
Idea: use the sentence and competition choices as testable statements
The source's sentence format combines the audience, desired result, timeframe and objection. In practice, each slot creates a question: who actually has this need, what result can be supported, what delivery period is realistic, and which objection has been observed? A short sentence can still make a false promise. Revise unsupported parts before testing the wording.
For a crowded market, identify actual alternatives and evidence that people buy them. For the source's “some competitors, mostly mediocre” option, define the observable limitation instead of disparaging competitors. A thin market can reflect a narrow segment, poor discovery, new demand or weak demand. A first-mover claim needs a careful search for indirect substitutes and non-consumption. The source assigns favorable or unfavorable verdicts to these choices; the choice alone cannot establish which explanation is true. Its phrases about proven demand, weak supply and first-mover failure are assertions to investigate, not results of an analysis performed by the widget.
The $100-today question distinguishes ten identifiable people, possible people who still need to be found, and buyers requiring substantial discovery. Naming people demonstrates proximity only. Record separately whether anyone expressed interest, agreed to a defined purchase or actually paid under clear terms. The source references a Profitable Widget Playbook as its lineage; that title does not supply an additional verified playbook in this archive. Do not claim the imagined first version has been presold.
Supporting archive — Idea/No Idea sentence, option subtitles and $100 example
Profitable Problem: distinguish a category, a task and its economics
The original uses productivity as a category and inability to reach inbox zero as a concrete problem. The concrete wording creates something to investigate, but inbox zero may not be the buyer's actual goal. Ask what consequence the unfinished task causes and what successful work would look like. Do not choose a metric simply because it is easy to count.
Daily or weekly recurrence, monthly recurrence, seasonal recurrence and one-time projects imply different delivery rhythms. The source associates these with continuity, subscription, annual/service and transactional offers respectively. Those are possible designs, not necessary conclusions. A daily problem can be solved once; a project can generate referrals or later work. Model the actual service and customer behavior before promising recurring revenue or treating every transaction as a wholly new acquisition.
For high cost, the source lists lost money, customers or status; for moderate cost, friction, frustration and time; for low cost, inconvenience. Put observable consequences beside the selected label. Status loss can be hard to measure, and an hour of friction can have very different consequences for different buyers. The statement that problem cost sets price captures a positioning idea, but omits alternatives, willingness to pay, delivery costs and constraints. It is not a complete pricing formula.
The alternatives field includes competitors, asking a CPA, searching Google and tolerating the problem. These represent paid substitutes, trusted advice, self-service and non-consumption. Identify what the buyer actually does, why they choose it, and what switching would require. An alternative's existence does not make it inferior to your proposed offer.
Supporting archive — Profitable Problem help and all recurrence/cost choices
Grand Slam Offer: interpret every example without turning it into a guarantee
The source's vivid outcome example combines ten clients in ninety days, working from home and $2,000 monthly retainers. It teaches that quantity, timeframe, delivery context and price communicate more than a vague freedom claim. None of those results is substantiated for the learner. Replace the example with an outcome your actual offer can support, and separate controllable deliverables from customer results that depend on other factors.
The strength scale asks whether a person would pay ten times more to avoid five years of pain. This is a thought experiment, not observed willingness to pay or a calculation of market value. Its endpoints—mild benefit and life-changing outcome—are subjective. Use real buyer evidence to explain the rating rather than treating a vivid imagined future as a strong score.
The likelihood field lists case studies, screenshots, testimonials, personal results and third-party validation. For each item, identify what it actually proves, its context and any limits on generalization. A screenshot can omit costs or time; a testimonial can describe one person's experience. A larger collection is not automatically stronger proof. The separate likelihood rating asks how a skeptical buyer might interpret the evidence; it does not independently verify the claim.
The time choices are within twenty-four hours, one week, thirty days or several months. The source proposes a day-one quick win or interim wins when the main result takes longer. Make those wins useful and accurately described, not activity presented as the promised outcome. The claims that speed dominates other factors or slower results necessarily create high refunds are unverified generalizations.
The effort choices attach source price bands to done-for-you ($5,000–$50,000-plus), done-with-you ($1,000–$5,000), supported DIY ($97–$997) and self-paced delivery ($7–$297). Preserve them as illustrative bands. They are not verified prices, required tiers or proof that self-paced delivery has the highest churn. Compare customer work, provider capacity, quality, support and economics. Removing a task can help one buyer while reducing desired control for another. A mechanism should explain how the promised work is accomplished; naming it does not establish effectiveness.
Supporting archive — Grand Slam Offer examples, scales, price bands and help · Acquisition.com primary conceptual reference — Pricing and Value Checklist
Mechanism and Offer Stack: explain the promise and the actual terms
The mechanism examples—The Retainer Method, The 90-Day Pulse and The 4-Lane Framework—illustrate memorable labels. The registered-mark and trademark symbols in the original are presentation examples, not evidence of registration or ownership. Explain the actual steps and why they address the buyer's problem. Renaming identical content does not establish the source's claimed increase from $97 to $4,997 in value.
The offer-name comparison contrasts a ninety-day retainer sprint with an unnamed coaching program. A clearer label may communicate topic, timeframe and format, but the claimed 30% conversion advantage is unsupported. The bonus format names a resource, its intended result and a standalone value. For each of the proposed three to five bonuses, identify the next real obstacle it addresses and whether the promised asset actually exists. Explain the basis for a price comparison; adding a dollar figure does not create market value.
Work through all guarantee choices. An anti-guarantee declares no refunds and a rationale; it does not become the strongest promise merely because it is bold. A conditional example promises twice the payment back after specified customer actions without the result. Such an example creates a potentially large obligation; the amount and conditions must be accurate and supportable. The unconditional example is a thirty-day refund without questions. The implied choice expresses confidence that the buyer will like the offer, but does not specify a remedy. No guarantee simply means no additional guarantee is stated; the source's prediction that conversion then collapses is unproven. Its attribution of a ranked guarantee ladder to Hormozi is not verified by the supplied file. These categories are a source comparison, not terms adopted by RISER.
The exact-wording field compares a general guarantee, a thirty-day refund and continued free work if three retainer clients are not obtained within sixty days. Clarify what the business can actually promise, how eligibility is established, and what remedy is offered. The most dramatic sentence is not automatically the most credible, affordable or suitable. Do not imply that any example overrides applicable customer rights.
The scarcity examples propose twelve founding members followed by a ninety-day closure; $497 for the first twenty-five buyers followed by $1,497; one bonus expiring Friday; or a Monday-to-Friday launch. Treat every number and date as an example. A real limit must correspond to the actual offer and remain truthful when reached. Fake urgency is misleading; the source's alternative claim that no scarcity is always wrong is also too strong. A buyer can make an informed decision without a manufactured deadline. The claim that one mechanism is Brunson's preference is unverified here.
The source compares a $497 price with a $5,991 stack anchor. Teach the difference between adding defensible standalone values and inventing an anchor to make the price look small. The suggested five-to-ten-times ratio and three-to-one minimum are author heuristics, not a valuation model. Inspect both customer value and delivery economics; a large displayed ratio does not establish either.
Supporting archive — named mechanism, Offer Stack help and all option examples
Core Four: distinguish channel work, volume and economic evidence
Warm outreach addresses people who already know the sender; cold outreach addresses people without that relationship. Content serves an audience through published material, while paid ads purchase distribution. These distinctions concern the relationship and method, not an automatic ranking of quality. The source calls warm outreach free and best for the first ten customers, cold outreach cheap, content compounding and ads fastest to scale. Each claim omits context: labor costs, fit, permissions, response, capacity and conversion still matter. No messages or advertising are activated by this exercise.
The proposed five-days-per-week, twelve-week focus is a practice schedule. It does not prove that one channel always outperforms four. Record the actual test question and what observations justify continuing, changing or adding a channel. Concentrated effort can help learning but can also repeatedly apply a poor assumption.
In the ten-customers, ninety-days, 1%-conversion example, define what the 1% measures. If it measures completed conversations converting to customers, one thousand conversations are required under the model; one thousand sent messages is not equivalent. The source alternates touches and conversations, so preserve that distinction. The roughly twelve-per-day figure assumes calendar days and upward rounding. A workday schedule needs a different denominator, and the model is an expectation rather than a guaranteed result.
The economics choices distinguish known CAC/LTV/payback, estimates and a pre-revenue state. Keep observed figures, projections and missing information separate. Pre-revenue does not literally mean that no feedback loop can exist, and knowing a ratio does not alone make advertising viable. The source's one-third-of-twelve-month-LTV threshold needs a consistent value definition and cash-flow context. Organic activity also consumes time and resources, so its economics are not irrelevant simply because no media invoice exists.
Supporting archive — Core Four option subtitles, volume example and economics choices
Dream 100: turn the named examples into a research method
The source contrasts “fitness influencers” with @HybridAthlete, ATG for Life YouTube, a Knees Over Toes Skool group and Ben Patrick Substack. These are illustrative source labels, not verified current accounts, URLs or recommended partners. The lesson is to identify a specific destination and verify its relevance, actual address and audience rather than fill the table with broad categories. The claim that the first twenty-five entries take two hours is a planning estimate, not a completion standard.
Working into a relationship means contributing useful, relevant work over time. Buying access means an appropriate sponsorship or paid placement under agreed terms. Partnering means a mutually useful collaboration with explicit contributions and expectations. The source's assertions that these are the only three routes, that combining approaches necessarily destroys a relationship, or that an invitation arrives within ninety days are unverified. Select a route from the actual context; no approach guarantees access.
The first-message field proposes a quote, a result or a resource as a useful contribution. Quote accurately, share only genuine results, and choose a relevant resource. A gift does not establish a debt or entitlement to a response. The instruction to send to the first ten is an original operating suggestion, not authorization to send messages from this task.
The weekly categories—twenty-plus, five-to-twenty, fewer than five and none—measure planned activity. Twenty appears in both of the first two labels. Predictions of being known by month three, achieving network density after six months or having the strategy stop working below five contacts are unsupported. The attributed hundred-per-week versus hundred-per-year maxim is not verified here. Track relevance and actual outcomes instead of equating contact count with relationship quality.
Supporting archive — Dream 100 specific examples, strategy help and volume claims
Hook, headline, body and CTA: preserve what each example teaches
The source's solo-accountant hourly-billing question identifies an audience and issue. Its “fired my agency yesterday” line illustrates an unexpected statement, but must not be used as personal history unless true. The 47% statistic is an illustrative number without evidence; replace it with a supported fact or a non-statistical hook. A three-second hook is a format suggestion, not a universal attention threshold.
The headline combines an outcome, timeframe and objection. Verify each element instead of adding numbers solely to make the promise look precise. The body sequence is problem, current approach, mechanism, proof and specific action. The source suggests fewer than one hundred words for ads and two hundred fifty for landing pages; those are local heuristics and conflict with longer page guidance elsewhere in the toolkit. Use enough accurate information for the actual placement rather than treating either length as universal.
Compare a named five-page pricing calculator, an action such as applying for a strategy call or downloading a playbook, and a generic learn-more label. The useful question is whether the reader understands the next step and receives what was promised. A calculator or ninety-day guide must actually exist before the CTA promises it. The claimed twofold conversion difference between generic and specific wording is unsupported; test actual behavior without importing that percentage as a forecast.
Supporting archive — copy examples, word limits and CTA alternatives · ClickFunnels primary framework reference — Hook, Story, Offer
Persuasion: examine beliefs and evidence without manufacturing agreement
The Big Domino field asks for one belief connecting the buyer's problem with the proposed mechanism. The original alternates breaking a belief with establishing one. State which belief you mean and what evidence could support or challenge it. Its claim that every other objection becomes irrelevant is not a guarantee; price, suitability and practical constraints can remain relevant even when the mechanism is credible.
The three example objections concern the vehicle (“retainers only work for big firms”), the person (“I am too new”) and the external context (“my market is price-sensitive”). Use these as three diagnostic categories, not proof that a buyer's objection is false. Find the actual reason, then answer it honestly. A real lack of capability or budget should not be rewritten as an irrational belief to overcome.
The reciprocity field contrasts a specific useful resource with a vaguely named newsletter or webinar and with no gift. A newsletter or webinar can be valuable when its actual content fits the need; a named asset can be useless. Giving something does not impose an obligation to buy. The source's one-third conversion claim and its assertions about reciprocity debt are not evidence of this audience's response.
For social proof, the source compares five-plus similar-customer testimonials, two-to-four partially similar ones and zero-to-one or generic praise. It separately claims three relevant testimonials outperform thirty generic ones and recommends obtaining three before launch, so its quantities are not one consistent pass threshold. Relevance, authenticity and context matter more than forcing a count. Do not create testimonials, names, photos or results to satisfy the rubric.
The authority example contrasts selling a $4-million agency with twelve years' experience. A relevant specific result may explain expertise, but either statement must be true and neither proves competence for every service. A named endorsement requires actual permission and accurate scope. The source's instruction to replace credentials with results is too broad; qualifications can be essential to some work.
Unity choices distinguish an explicit group identity, implicit audience fit and generic wording. The example of solo accountants who reject hourly billing expresses a preference, not evidence that everyone in the profession shares it. Use shared language only when authentic. The predicted 20% conversion lift from naming a group is unsupported. Consistency choices contrast opt-in, engagement and an eventual ask with a single direct ask. A download, quiz or call is not consent to a purchase or an obligation to continue. More steps are not automatically better; make each step clear and useful.
Supporting archive — Persuasion field examples and all five assessment categories
Deploy: choose an actual test plan rather than copying the source's numbers
The source requests a calendar date within thirty days, suggests Friday, and proposes accountability to another operator. These are planning suggestions. A signed or publicly announced date does not make the launch ready, and no announcement is made by this lesson. Check what can be delivered and what must work by that date.
The cohort choices are five-to-ten, ten-to-twenty-five, twenty-five-to-fifty and fifty-plus. Their boundaries overlap. Use actual capacity, expected support and quality requirements to choose a size; the source's claim of tenfold testimonial density from a smaller group is unsubstantiated. Testimonials also depend on real experiences and appropriate permission, not just group size.
The price field proposes $497–$997 founding and $1,497–$1,997 later for service/coaching, or $97–$297 founding and $297–$497 later for productized offers. It simultaneously warns against $500–$900, overlapping its own service range. Treat all these amounts as inconsistent source examples, not a price recommendation. A founding-price commitment must match the actual terms; no future increase is automatic.
The two decision-rule examples are fewer than five paid customers in fourteen days or fewer than three in twenty-one days; the third choice is continuing regardless. Defining a review criterion beforehand can reduce sunk-cost reasoning. Missing a target should trigger investigation of the test, measurement and assumptions, rather than prove that the offer angle is uniquely at fault. The counts are not universal validation thresholds.
The four required functions are lead capture, payment, delivery and measurement. The source distinguishes all four tested, three present, and fewer than three, and proposes completing gaps within a week. Verify the actual path and records rather than just counting software accounts. A tool list and an arbitrary seven-day deadline do not establish readiness, and the source's “everything else optional” statement is not a complete checklist for every business.
Supporting archive — Deploy dates, cohort boundaries, price examples and readiness criteria
Iterate: match the proposed change to what the observations can support
The source contrasts three conversations, thirty conversations and three hundred as noise, signal and lateness. Its actual choices use fewer than ten, ten-to-twenty, and twenty-to-thirty conversations or thirty-plus users. These are different observation types and overlapping quantities. A sample count alone cannot certify a pattern. A serious defect can warrant action immediately; a subtle conversion difference may require much more evidence. Do not postpone fixing a known problem solely to reach thirty.
The pattern field asks which objection recurs, which feature is ignored and which result customers value. Preserve the actual observations and exceptions. The source's claim that customers tell operators exactly what is wrong overlooks interpretation and competing causes. Select a proposed change whose expected effect can be examined.
The four lever choices suggest clarifying the outcome, improving credible proof, shortening time to a useful result, or reducing the work required. The examples include case studies and guarantees, interim wins, templates, guided work and done-for-you delivery. Each affects both customer experience and provider obligations. Changing one variable can make learning clearer, but the source's rule does not forbid correcting multiple known defects when necessary.
For awareness, the five source choices move from not recognizing a problem, to recognizing it without knowing solutions, to comparing solution types, to evaluating this product, to already knowing the offer. The proposed copy shifts from a relevant story/problem explanation through mechanism and evidence to a clear offer. Treat the stage as a hypothesis about an audience, not a diagnosis of every visitor. A most-aware buyer does not necessarily need scarcity or a newly named mechanism; the source contradicts itself on that point.
For sophistication, the source proposes a first claim, a stronger claim, a distinctive mechanism, a different mechanism, and identity/story after mechanism fatigue. Its dramatic weight-loss and metabolic-window examples are marketing illustrations without evidence, not health guidance or safe promises. Do not amplify a result or shorten its timeframe without support. The assertions about which stage dominates in 2026 and claims dying after one thousand repetitions are unverified. A new name cannot make an unsupported claim true.
Refund feedback choices are a structured five-question conversation, an informal conversation and no conversation. The questions concern the intended outcome, disappointing experience, perceived issue, possible improvement and referral willingness. Invite useful feedback without requiring participation or steering every response into the source's preset diagnosis. The proposal to look across ten refunds is a source planning count, not a statistical threshold. The attributed Hormozi quotation is unverified; the original rule's verdict does not determine a customer's refund eligibility.
Supporting archive — Iterate sample categories, four levers, awareness, sophistication and refund questions
Pivot or Hold: separate measured behavior from the proposed diagnosis
The first choice combines clicking and engagement even though those events use different denominators. Its source baselines are 1–2% for cold-ad CTR and 1–3% of followers for organic engagement. Define the numerator, denominator, placement and period before comparing a result. Selecting normal-or-above does not prove the hook is fine, just as a low result does not isolate the hook as the cause.
The next choice compares opt-ins or buying conversations, while the help also names purchase and booking rates. Its 20–40%, 1–3% and 5–15% ranges correspond to different outcomes and cannot be substituted for one another. Above, at or below a source benchmark is only a comparison with an unsupported general range. It does not prove that the audience is right or wrong. Examine page function, message continuity, measurement and actual buyer responses before selecting a change.
The final field asks about staying, referring or upselling, but its options instead use refunds and NPS. Those measures are not interchangeable. The source classifies under 5% refunds with positive NPS, 5–10% refunds, and over 10% refunds or negative NPS. It mentions the first thirty days in the help. Record the actual window and customer cohort; retain retention, referral and additional-purchase evidence separately. Low refunds can coexist with poor outcomes, and a negative score does not uniquely locate a delivery defect. Review the promise, onboarding, delivery and other evidence together. The original widget's branch ordering and unsupported scale verdict are explained in the main script.
Supporting archive — Pivot or Hold labels, baselines and outcome-category mismatches
Scale: make the price and retention examples mathematically explicit
The source's full-signal category combines ten-plus customers from one channel, known economics and six-plus months of retention data. Partial data and an early or unstable state are the other choices. These counts do not establish profitability, adequate cash or delivery capacity by themselves. Check the underlying records and the consequences of the proposed change. The source's instruction to keep iterating with incomplete data is a preference for evidence, not proof that every business needs precisely this history.
An authored arithmetic example clarifies the conditional price claim. At a price of $100 and unchanged unit cost of $80, contribution is $20. A 10% price increase to $110 raises contribution to $30, a 50% increase, if volume and costs stay unchanged. At a different starting margin or with lost sales, the result changes. This example explains when the source claim could be true; it is not a forecast or instruction to raise prices.
An authored simplified retention example clarifies the source's error. Under a constant-churn model, a $100 monthly contribution and 10% monthly churn imply $1,000 in modeled lifetime contribution. A 20% relative churn reduction changes 10% to 8%, giving $1,250—25% more, not 100% more. This simplified model omits discounting, changing cohorts and other real-world factors. Define relative percentage change versus percentage-point change before making a comparison.
The source ranks price, retention and volume, calling volume the most expensive and appropriate only after the others are maximized. That order is not universal. Examine which change addresses the actual constraint and what it costs. The bottleneck examples are lead generation, sales, delivery and retention. Naming one can focus investigation, but multiple interacting constraints may exist; a label alone does not prove a Theory of Constraints diagnosis.
Supporting archive — Scale signal, lever claims and bottleneck examples
Repeat: distinguish expansion options, ladder design and recurring revenue
The proposed twenty-customer question asks what someone would buy next. Preserve their exact answer and context, then distinguish expressed interest from a committed purchase. The source's promises of zero new acquisition cost, doubled LTV or fivefold LTV are unsubstantiated. Serving an existing customer can still require selling, delivery and support effort.
The four choices change different variables: a new offer for the same audience and channel; the same offer for an adjacent audience; a new channel for the same offer and audience; or an entirely new business. State what knowledge transfers and what must be tested again. A previously successful offer is not automatically validated in a new segment. Channel diversification can reduce some dependence while adding costs and complexity. The source's universal ranking does not replace this analysis.
The current-offer check contrasts a mature offer at an unspecified multi-million-dollar ARR with healthy retention, remaining room for development, and boredom. ARR is recurring revenue, not total sales or profit; the unspecified amount is not a real threshold. The claim that operators usually abandon an offer at 30% of its potential is unsupported. Boredom alone does not establish a sound expansion case, but remaining indefinitely in the current business is not automatically correct either. Document evidence, capacity and the reason for the next move.
The five ladder positions are a free named resource; a $7–$97 entry purchase; a $297–$1,997 core offer; a recurring offer with a stated monthly price; and a $5,000–$50,000-plus premium service. The source's “price of a coffee” analogy does not describe every price in its entry band. Each position needs a real customer purpose and a viable deliverable. A purchase can identify buying behavior, but does not prove that all buyers fundamentally behave alike or will buy the next offer. A free asset is not required for every viable business model.
The recurring examples are a Skool community, software subscription, monthly coaching and certification renewal. Each needs a continuing service or entitlement that justifies its actual terms. A recurring invoice alone does not create continuing customer value, valid certification or a moat. The attributed claim that continuity is the highest LTV-per-dollar move, the 60% missing-LTV claim and the 80% premium-profit claim are unverified. Preserve the price bands as examples rather than a required architecture.
The continuity-health options use sixty-plus percent, twenty-to-sixty percent, below twenty percent and no offer. Sixty belongs to two labels. Define the customer population and observation date; participation percentage is different from retention, profitability or satisfaction. A low share does not prove that a subscription is the business's highest-value opportunity.
Affiliate status distinguishes a formal program producing referrals, informal referrals and no program. Ten affiliates bringing five customers each is fifty customers arithmetically, but the source's zero-acquisition-cost conclusion excludes commissions and operating costs. Its 30% commission example requires viable economics and explicit terms; it is not activated here. The claim that half of customers would pay to bring others is unsupported. A referral program is one possible distribution arrangement, not an automatic requirement or proof of compounding growth.
Supporting archive — Repeat choices, ladder examples, continuity and affiliate claims
D0974 catalog teaching — working review
All product descriptions, prices, capabilities, comparisons and flags below are historical statements in the assigned archive, not current verified recommendations. The official links are preserved destinations, not proof that their contents have been checked. No purchase, installation, collection or outreach is performed. Read the specific interpretation after each entry; retain every original field in the appendix.
RISER-Tool-Catalog
PainOnSocial
Source description: AI Reddit scanner with 0–100 pain scoring across 30+ curated communities. Evidence quotes, AI-generated solution ideas, audience analysis. The reference tool for the widget.
Source feature inventory: 0–100 pain score per opportunity; Real Reddit quotes + permalinks; AI solution ideas with monetization; Curated 30+ subreddit catalog; Audience demographics analysis.
Source benefit claim: Compresses weeks of manual subreddit reading into a single scan with structured, verifiable output.
Source price statement, unverified: Starter $19/mo · Pro $49/mo
Source classification: tier 1; price class cheap; flags none.
Source workflow destinations: Gate 00½.
Additional original note: 7-day free trial on Starter. Pro adds 15 scans/day, 5 subreddits, 90-day timeframes.
How to interpret and apply this entry: Use the proposed card output to organize a pain hypothesis, then open the original quotation and compare its context with the assigned score. Solution and demographic suggestions are interpretations. A score of 87 is not an observed willingness to pay, and a single scan does not establish weeks of equivalent research quality.
Original catalog supporting this entry · Visit PainOnSocial using the original resource link
Reddily
Source description: Chrome extension + dashboard. Uses Google Gemini to extract sentiment, pain points, feature requests, and quotes from any Reddit thread. Pay-per-analysis pricing.
Source feature inventory: One-click thread analysis; Batch processing up to 25 threads; Sentiment + pain extraction; Feature-request detection; Chrome extension.
Source benefit claim: Best for ad-hoc research where you don't want a recurring subscription.
Source price statement, unverified: Pay-per-analysis · 5 free credits
Source classification: tier 1; price class cheap; flags none.
Source workflow destinations: Gate 00½.
Additional original note: Pay-per-analysis model means you only pay for what you scan.
How to interpret and apply this entry: The unit of analysis here is a chosen thread or batch. Choose threads for relevance, retain their URLs and compare extracted sentiment and feature requests with actual wording. Pay-per-analysis changes the budgeting unit, not the evidentiary quality or representativeness of the sample.
Original catalog supporting this entry · Visit Reddily using the original resource link
PainPointy
Source description: Surfaces pain points, content ideas, reply opportunities, and brand mentions from Reddit. Smaller indie tool with a similar shape to PainOnSocial.
Source feature inventory: 60-second subreddit scans; Daily agency reports; Reply opportunity detection; Content idea surfacing.
Source benefit claim: Lighter-weight alternative if PainOnSocial pricing or interface doesn't fit.
Source price statement, unverified: Pricing on site
Source classification: tier 1; price class cheap; flags none.
Source workflow destinations: Gate 00½, Gate 06.
How to interpret and apply this entry: Separate pain research, content ideas, mentions and possible reply opportunities: each supports a different decision. Check any suggested opportunity against the original discussion. A fast scan or daily report is a retrieval workflow, not permission to reply or proof of demand.
Original catalog supporting this entry · Visit PainPointy using the original resource link
BuzzAbout
Source description: Market research agent for Reddit and other social platforms. Broader source coverage than Reddit-only tools.
Source feature inventory: Multi-platform coverage; AI agent workflow; Market trend tracking.
Source benefit claim: Useful when your audience lives on more than just Reddit.
Source price statement, unverified: Pricing on site
Source classification: tier 1; price class cheap; flags none.
Source workflow destinations: Gate 00½, Gate 01.
How to interpret and apply this entry: Broader platform coverage can reveal different contexts, but combining sources can also mix unlike audiences. Keep each observation's platform, date and provenance before treating a cross-platform pattern as a shared customer need. The source supplies no measured comparison establishing superiority.
Original catalog supporting this entry · Visit BuzzAbout using the original resource link
Syften
Source description: Tracks keywords across Reddit, Hacker News, and 10+ platforms. Real-time alerts. Closest like-for-like replacement for the discontinued GummySearch monitoring workflow.
Source feature inventory: Reddit + HN + 10+ platforms; Boolean search support; Slack alerts; 20 filters on Standard.
Source benefit claim: The tool to use if you specifically miss GummySearch's alert-and-monitor workflow.
Source price statement, unverified: ~$39.95/mo Standard
Source classification: tier 1; price class cheap; flags none.
Source workflow destinations: Gate 00½, Gate 09.
How to interpret and apply this entry: Translate the research question into explicit keywords and Boolean conditions, then inspect both useful alerts and irrelevant matches. Monitoring detects mentions; it does not explain their cause. The claimed replacement for another discontinued service and platform coverage require current verification.
Original catalog supporting this entry · Visit Syften using the original resource link
Subreddit Signals
Source description: AI-scored Reddit lead detection with 7-dimension intent classification (PURCHASE_READY, switching intent, budget questions). Built more for high-intent buyers than for raw pain mining.
Source feature inventory: 7-dimension intent scoring; PURCHASE_READY classification; 15 weekly lead tokens (Starter); AI comment templates; Switching-intent detection.
Source benefit claim: Best when you want leads, not just pain points — already-qualified buyers actively searching.
Source price statement, unverified: Starter $19.99/mo
Source classification: tier 1; price class cheap; flags new.
Source workflow destinations: Gate 00½, Gate 05.
How to interpret and apply this entry: Intent labels such as PURCHASE_READY are model classifications, not verified buying commitments. Inspect the original post, timing and relevance before calling someone qualified. Token allowances and comment templates affect workflow; they do not establish consent to outreach.
Original catalog supporting this entry · Visit Subreddit Signals using the original resource link
Redreach
Source description: AI-powered Reddit conversation discovery and reply assist. Volume-oriented (unlimited monitoring, no token caps). Pair with intent scoring from another tool to filter noise.
Source feature inventory: Unlimited monitoring; No token caps; AI reply assist; Google-ranking post detection; Bulk DM workflow.
Source benefit claim: Volume play if you have time to filter manually and want broad coverage.
Source price statement, unverified: ~$29/mo unlimited
Source classification: tier 1; price class cheap; flags new.
Source workflow destinations: Gate 00½, Gate 05.
How to interpret and apply this entry: Separate broad discovery from qualification. The source itself proposes manual filtering or another intent scorer; unlimited monitoring can increase noise as well as coverage. A bulk-DM feature is not a recommendation to use it, and no message is sent from this lesson.
Original catalog supporting this entry · Visit Redreach using the original resource link
Apify Reddit Pain Finder
Source description: Scraper that classifies posts into pain types (pricing, missing features, workflow friction, integration needs, switching) and ranks by priority. Works without API keys via RSS, or with Reddit OAuth at scale.
Source feature inventory: Pain-type classification; Priority scoring; Promo-post filtering; Webhooks + n8n + Make + Zapier; No API key required.
Source benefit claim: The DIY/automation-friendly option. Ideal if you want to pipe Reddit pain data into your own workflow.
Source price statement, unverified: Pay-per-result
Source classification: tier 1; price class cheap; flags new.
Source workflow destinations: Gate 00½.
Additional original note: Built on Apify platform — supports scheduling, monitoring, integrations.
How to interpret and apply this entry: A structured pipeline can categorize pricing complaints, missing features, workflow friction, integrations and switching language. Validate each category against evidence before routing it downstream. RSS access, OAuth, scheduling and webhook claims need verification; an available integration does not authorize collection or automation.
Original catalog supporting this entry · Visit Apify Reddit Pain Finder using the original resource link
SparkToro
Source description: The audience research standard. Search by keyword, hashtag, or natural-language description; get the websites, podcasts, YouTube channels, subreddits, and social accounts your audience actually engages with.
Source feature inventory: Audience clickstream + Google + social; "Describe Your Audience" natural language; Email-list audience analysis; Podcast + YouTube + subreddit data; Compare Audiences feature.
Source benefit claim: Tells you exactly where the avatar gathers — feeds Gate 01 and Gate 05½ Dream 100.
Source price statement, unverified: Personal $38/mo · Business $112/mo · Free 5 searches/mo
Source classification: tier 2; price class cheap; flags none.
Source workflow destinations: Gate 01, Gate 05½.
How to interpret and apply this entry: Use audience-affinity results to propose where to investigate or distribute content, then verify that the actual audience and placement fit. Aggregate audience data is not a personal customer interview or a guarantee that a listed channel will convert. Compare segments before assuming they gather in the same places.
Original catalog supporting this entry · Visit SparkToro using the original resource link
AnswerThePublic
Source description: Visualizes the questions people ask in autocomplete data. The "wh-" outputs are raw avatar pain language, ready to drop into copy.
Source feature inventory: Google + Bing autocomplete data; Question wheel visualization; CSV export; New AI Dashboard.
Source benefit claim: Instant raw customer language. The questions are the pain in their own words.
Source price statement, unverified: Free 3 searches/day · Paid from ~$11/mo
Source classification: tier 2; price class cheap; flags free.
Source workflow destinations: Gate 01, Gate 06.
How to interpret and apply this entry: Autocomplete questions can inspire a research or content question, but are not necessarily verbatim statements from identified customers or evidence of purchase intent. Preserve the query and context. A question wheel or CSV export organizes leads for investigation rather than completing a pain audit.
Original catalog supporting this entry · Visit AnswerThePublic using the original resource link
AlsoAsked
Source description: Real-time "People Also Ask" data from Google in tree structure. Shows the next question your prospect is going to ask after the first one.
Source feature inventory: Real-time PAA scraping; Tree-structured question hierarchy; CSV export; Visual question mapping.
Source benefit claim: High-leverage for Gate 06½ false belief audit — Google has already clustered the next objection for you.
Source price statement, unverified: Free 3 searches/day · Paid $15–59/mo
Source classification: tier 2; price class cheap; flags free.
Source workflow destinations: Gate 06, Gate 06½.
How to interpret and apply this entry: A question tree can show related information needs. Map a relevant question to a proposed explanation, then check whether it is actually an objection for your audience. Search-engine question groupings are not validated psychological beliefs or an automatically complete objection sequence.
Original catalog supporting this entry · Visit AlsoAsked using the original resource link
BuzzSumo
Source description: Question Analyzer searches forum posts across Amazon, Reddit, Quora, Q&A sites. Content Analyzer shows what's actually getting shared.
Source feature inventory: Question Analyzer (Amazon, Reddit, Quora); Content trend tracking; Trending feeds 24h windows; Media database & journalist outreach; Slack integration.
Source benefit claim: Combines pain mining with content performance — what gets shared is what gets clicked.
Source price statement, unverified: From ~$199/mo
Source classification: tier 2; price class mid; flags none.
Source workflow destinations: Gate 01, Gate 06.
How to interpret and apply this entry: Distinguish question discovery from sharing performance. A frequently shared item is not necessarily highly clicked, commercially effective or representative of your buyers. Use each dataset for the decision it supports, preserving the source and observation window rather than combining them into one popularity claim.
Original catalog supporting this entry · Visit BuzzSumo using the original resource link
Exploding Topics
Source description: Categories with rising search trajectory before saturation. Feeds Gate 01's market trajectory scale directly.
Source feature inventory: Trend categorization; Long-term momentum scoring; Category browsing (food, fitness, fintech, etc.); Trend reports.
Source benefit claim: Validates Gate 01 market trajectory with hard search data before you commit.
Source price statement, unverified: Pro from ~$39/mo
Source classification: tier 2; price class cheap; flags none.
Source workflow destinations: Gate 01.
How to interpret and apply this entry: Use the proposed trajectory information to investigate a category, not to certify that an offer has growing demand. Search interest, category definitions and commercially addressable demand differ. Record the period and competing explanations before converting a trend into an avatar score.
Original catalog supporting this entry · Visit Exploding Topics using the original resource link
Glimpse
Source description: Trend discovery built on Google Trends with absolute search volume, 12-month forecasts, and TikTok/Reddit/Instagram channel breakdowns.
Source feature inventory: Absolute search volume (vs Google Trends 0–100 scale); 12-month forecast (95%+ backtested accuracy); TikTok/Reddit/Instagram channel data; Chrome extension; Real-time alerts.
Source benefit claim: Closest competitor to Exploding Topics with more granular keyword tracking and forecasting.
Source price statement, unverified: Free 10 searches/mo · Paid from $99/mo
Source classification: tier 2; price class mid; flags new.
Source workflow destinations: Gate 01, Gate 02.
How to interpret and apply this entry: Separate historical observations, modeled absolute volumes and forecasts. The catalog's 95%-plus backtested accuracy claim has no supplied evaluation definition or dataset. A forecast needs its horizon, uncertainty and validation method before it supports a business decision; platform breakdowns do not guarantee channel fit.
Original catalog supporting this entry · Visit Glimpse using the original resource link
Dovetail
Source description: Customer intelligence platform. Centralize calls, tickets, surveys, interviews, reviews; AI auto-classifies into themes. The repository standard.
Source feature inventory: Auto-import calls, tickets, surveys, interviews, reviews; AI theme classification; Searchable insight repository; Cross-project synthesis; Atomic UX research method.
Source benefit claim: The default choice for customer-research teams who want everything in one place.
Source price statement, unverified: Free plan · Paid from $29/mo per user
Source classification: tier 3; price class cheap; flags free.
Source workflow destinations: VOC Vault, Gate 08.
How to interpret and apply this entry: A repository is useful when themes can be traced back to calls, tickets, surveys or reviews. Inspect source permissions and compare automatically grouped themes with original statements. Centralization and cross-project synthesis do not eliminate sampling bias or make the tool a universal default.
Original catalog supporting this entry · Visit Dovetail using the original resource link
Insight7
Source description: Auto-ingests recordings from Zoom, Google Meet, Teams; extracts themes by semantic meaning; generates branded reports with embedded evidence. Stronger automation than Dovetail at high session volumes.
Source feature inventory: Auto-ingest Zoom/Meet/Teams; Semantic theme extraction (no manual tagging); Branded reports with frequency data; Cross-session synthesis; Dropbox + Drive integration.
Source benefit claim: Built for teams running 50+ interviews per month who need automation, not manual tagging.
Source price statement, unverified: Custom pricing
Source classification: tier 3; price class mid; flags new.
Source workflow destinations: VOC Vault, Gate 08.
How to interpret and apply this entry: For cross-session reports, verify each theme against the recordings and the counting method. Semantic grouping can merge different meanings, so retain exceptions and context. The source's fifty-interviews-per-month fit and superiority over another tool are positioning claims, not validated purchase thresholds.
Original catalog supporting this entry · Visit Insight7 using the original resource link
Conveo
Source description: AI-moderated video interviews with adaptive probing in 50+ languages. Built-in participant recruitment.
Source feature inventory: Async AI-moderated video interviews; 50+ languages with adaptive follow-ups; Built-in participant panel; Multimodal analysis (speech + tone + visual); Cross-study insight library.
Source benefit claim: Use when you need fresh interview data, not just analysis of existing conversations.
Source price statement, unverified: Custom enterprise pricing
Source classification: tier 3; price class enterprise; flags new.
Source workflow destinations: VOC Vault.
How to interpret and apply this entry: This entry proposes collecting new interviews rather than only analyzing existing ones. Review participant fit, question wording, consent and follow-up quality. Multimodal or multilingual output does not prove reliable interpretation of emotion or meaning, and the claimed language count must be checked before use.
Original catalog supporting this entry · Visit Conveo using the original resource link
User Interviews
Source description: Recruits participants from a panel of 6 million vetted consumers and professionals. Now part of UserTesting.
Source feature inventory: 6M+ vetted participants; Bring-your-own-audience option; Scheduling + incentive management; Demographic + behavioral targeting.
Source benefit claim: The fastest way to get interviews scheduled when you don't have your own audience yet.
Source price statement, unverified: Pay per recruit (~$25–100/participant)
Source classification: tier 3; price class mid; flags none.
Source workflow destinations: VOC Vault.
How to interpret and apply this entry: Recruitment helps obtain participants but does not ensure they represent the intended buyer. Define screening criteria, incentives and exclusions before interpreting interviews. Panel size, ownership and per-recruit pricing are historical catalog claims; a large panel does not itself establish sample quality.
Original catalog supporting this entry · Visit User Interviews using the original resource link
Productboard / Pulse
Source description: Customer feedback aggregator and pain-point analyzer for product teams. Pulse module surfaces VOC pain points specifically.
Source feature inventory: Centralized customer feedback; Feature prioritization; Pulse VOC module; Roadmap integration.
Source benefit claim: Best when feedback needs to feed into product decisions, not just live in a research repository.
Source price statement, unverified: Essentials from $19/maker/mo · Pulse enterprise
Source classification: tier 3; price class mid; flags new.
Source workflow destinations: VOC Vault, Gate 08.
How to interpret and apply this entry: Connect a feedback theme to a product decision with the underlying evidence visible. Prioritization involves tradeoffs beyond mention counts. Distinguish features in a base plan from the separate Pulse module before assuming one subscription supplies all listed functionality.
Original catalog supporting this entry · Visit Productboard / Pulse using the original resource link
Revuze
Source description: Ingests unstructured customer language (reviews, support tickets, surveys) and converts it to structured market intelligence. Strongest for product/e-com VOC at scale.
Source feature inventory: Unstructured-to-structured AI conversion; Multi-source ingestion; Sentiment + topic clustering; Trend forecasting.
Source benefit claim: Built for e-commerce or product orgs swimming in review data.
Source price statement, unverified: Custom enterprise pricing
Source classification: tier 3; price class enterprise; flags new.
Source workflow destinations: VOC Vault.
How to interpret and apply this entry: Use review and support-language aggregation to examine themes across sources, while keeping channel and product context. Structured output can hide ambiguity from the original wording. Trend forecasts and the claim of strongest e-commerce fit are not verified by the catalog alone.
Original catalog supporting this entry · Visit Revuze using the original resource link
SentiSum
Source description: Root-cause analysis on customer support complaints. Surfaces systemic problems worth solving.
Source feature inventory: Support-ticket auto-tagging; Root-cause clustering; Sentiment + intent detection; CRM integrations.
Source benefit claim: Use when you have live customer data and want to know what's actually breaking.
Source price statement, unverified: Custom pricing
Source classification: tier 3; price class mid; flags new.
Source workflow destinations: Gate 08, Gate 09.
How to interpret and apply this entry: Support-ticket clusters can identify recurring symptoms worth investigating. A label called root cause does not prove causation; compare the proposed explanation with actual cases and operational evidence. Preserve minority issues that may be serious even when their volume is low.
Original catalog supporting this entry · Visit SentiSum using the original resource link
F5Bot
Source description: Free email alerts for Reddit, Hacker News, Lobsters keywords. Zero cost, no analytics. The baseline tool.
Source feature inventory: Email alerts on keyword mentions; Reddit + Hacker News + Lobsters; No account complexity.
Source benefit claim: Free, dependable, gets out of the way. The first tool to install when you start.
Source price statement, unverified: Free
Source classification: tier 4; price class free; flags free.
Source workflow destinations: Gate 08, Gate 09.
How to interpret and apply this entry: A keyword alert is a pointer to a discussion, not an analysis of customer needs. Open the source, check context and record why it matters. The catalog's instruction to install this first is its preference, not a prerequisite for research; no installation or alert subscription is created here.
Original catalog supporting this entry · Visit F5Bot using the original resource link
Brand24
Source description: Cross-platform mention monitoring with sentiment analysis. Mid-tier pricing, broader than Reddit-only.
Source feature inventory: Cross-platform mention tracking; Sentiment analysis; Influencer detection; Reddit + web + social.
Source benefit claim: The mid-tier choice when F5Bot isn't enough but Brandwatch is overkill.
Source price statement, unverified: From $99/mo
Source classification: tier 4; price class mid; flags none.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: Separate mention coverage, sentiment labels and suggested influencers. Evaluate each against the actual audience and research question. More platforms do not automatically justify a larger subscription, and the catalog's mid-tier comparison is not a current independent product evaluation.
Original catalog supporting this entry · Visit Brand24 using the original resource link
Mention
Source description: Real-time alerts across web and social. Useful for tracking how customers describe competitors — the complaints become Gate 06 hooks.
Source feature inventory: Real-time alerts; Boolean search; Web + social coverage; Sentiment scoring.
Source benefit claim: Watch competitors get complained about in real time, then write a hook against the complaint.
Source price statement, unverified: From $41/mo Solo
Source classification: tier 4; price class mid; flags none.
Source workflow destinations: Gate 06, Gate 09.
How to interpret and apply this entry: A competitor complaint can suggest a question to investigate, but should not be lifted out of context into an unverified attack or advertising claim. Check dates, relevance and supporting facts. Boolean alerts improve retrieval only when the query actually matches the intended topic.
Original catalog supporting this entry · Visit Mention using the original resource link
Awario
Source description: Brand monitoring with Reddit coverage and Boolean search at accessible price.
Source feature inventory: Boolean search; Reddit + web + social; Lead detection; Sentiment analysis.
Source benefit claim: The most accessible price point in the listening category for a real product.
Source price statement, unverified: From $29/mo Starter
Source classification: tier 4; price class cheap; flags none.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: Lead detection and sentiment scoring need human interpretation of the underlying mention. Compare the actual coverage and limitations with the research need rather than accepting the lowest-price claim. The source does not establish that a detected mention is a qualified lead or an appropriate outreach recipient.
Original catalog supporting this entry · Visit Awario using the original resource link
Social Searcher
Source description: Real-time multi-platform social monitoring with sentiment analysis. Generous free tier — useful before committing to paid tools.
Source feature inventory: Multi-platform free search; Sentiment analysis; Real-time monitoring; Email alerts.
Source benefit claim: The cheapest paid plan in the catalog. Worth trying before paying for Brand24 or Mention.
Source price statement, unverified: Free tier · Paid from $4.50/mo
Source classification: tier 4; price class free; flags new, free.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: A low-cost or free search can be useful for a bounded research question, but limits, coverage and output quality matter more than a price label. The source's cheapest-plan claim is historical and unverified. Keep original mention links instead of relying only on an alert summary.
Original catalog supporting this entry · Visit Social Searcher using the original resource link
Hootsuite
Source description: Social media management suite with listening capabilities. Stronger for scheduling than for pain mining; included for completeness.
Source feature inventory: Multi-account scheduling; Insights add-on for listening; Sentiment analysis (paid tiers); Team collaboration.
Source benefit claim: Use only if you already need a scheduler. Don't buy this for pain mining alone.
Source price statement, unverified: Professional $99/mo · Insights ~$600–1200/mo
Source classification: tier 4; price class enterprise; flags new, enterprise.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: Distinguish scheduling, team collaboration and a separately priced listening add-on. A base subscription may not include the research functions described elsewhere in the entry. Assess an actual workflow requirement before combining tools; the catalog's recommendation is not a current purchasing analysis.
Original catalog supporting this entry · Visit Hootsuite using the original resource link
Agorapulse
Source description: Social media management with built-in listening and inbox unification. Mid-tier pricing.
Source feature inventory: Unified social inbox; Listening add-on; Approval workflows; CRM-light contact tracking.
Source benefit claim: Cleaner UX than Hootsuite, better for small teams that want one tool for everything.
Source price statement, unverified: From $79/mo Standard
Source classification: tier 4; price class mid; flags new.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: A unified inbox and approval workflow concern team operations, while listening concerns discovery. Clarify which function is needed and whether the relevant add-on is included. The claim of cleaner design than another product is subjective and does not prove better outcomes for a particular team.
Original catalog supporting this entry · Visit Agorapulse using the original resource link
BrandMentions
Source description: Real-time brand and competitor mention tracking across web and social with sentiment.
Source feature inventory: Web + social mention tracking; Competitor monitoring; Sentiment analysis; Influencer identification.
Source benefit claim: Solid mid-tier alternative to Brand24 with similar capabilities.
Source price statement, unverified: From $99/mo Growing Business
Source classification: tier 4; price class mid; flags new.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: Compare original mentions across web and social while retaining source context. A suggested influencer is a research lead, not proof of audience fit or a partnership. Similarity to another product does not establish equivalent coverage, price or permissions.
Original catalog supporting this entry · Visit BrandMentions using the original resource link
YouScan
Source description: Visual + text social listening with AI-powered image recognition. Distinct in that it analyzes images, not just text — useful when your category is visual.
Source feature inventory: Image recognition AI; Logo + product detection; Text + visual sentiment; Audience insights.
Source benefit claim: The only tool here that mines images. Essential if your category is visual (fashion, food, consumer goods).
Source price statement, unverified: Custom pricing
Source classification: tier 4; price class enterprise; flags new, enterprise.
Source workflow destinations: Gate 01, Gate 09.
How to interpret and apply this entry: Visual analysis may reveal a logo or product absent from text, but an image match does not prove sentiment or purchase intent. The claim that this is the only image-mining tool in the catalog conflicts with Talkwalker's image/video entry. Retain the contradiction and verify actual capabilities before selection.
Original catalog supporting this entry · Visit YouScan using the original resource link
Brandwatch
Source description: Consumer intelligence and social listening at enterprise scale. Strong sentiment, segment, and trend analysis across thousands of sources.
Source feature inventory: Consumer intelligence at scale; Cross-platform sentiment; Segmentation + audience profiling; Custom dashboards; Historical data depth.
Source benefit claim: Industry leader. Earn its keep at high scale where the depth pays back. Overkill below that.
Source price statement, unverified: Custom enterprise pricing (typically $1,000+/mo)
Source classification: tier 5; price class enterprise; flags enterprise.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: Historical depth and segmentation may matter for a specific research question, but enterprise scale does not automatically improve evidence quality. Define the required sources, date range and decision before interpreting a dashboard. Industry-leader status and cost recovery are unsupported catalog judgments.
Original catalog supporting this entry · Visit Brandwatch using the original resource link
Sprout Social
Source description: Social listening, analytics, and engagement platform.
Source feature inventory: Listening + engagement + publishing unified; CRM integrations; Reporting + analytics; Approval workflows.
Source benefit claim: When you need listening + management in one tool and have the budget.
Source price statement, unverified: From $199/seat/mo · Listening tier higher
Source classification: tier 5; price class enterprise; flags enterprise.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: Separate per-seat pricing from any additional listening tier and distinguish publishing operations from research. A combined platform can simplify some handoffs while adding cost or access complexity. Check the actual plan and integration scope rather than assuming every listed capability is included.
Original catalog supporting this entry · Visit Sprout Social using the original resource link
Sprinklr
Source description: Unified CXM platform with social sentiment and enterprise CX insights.
Source feature inventory: Unified CXM platform; Cross-channel sentiment; AI-powered insights; Customer service integration.
Source benefit claim: Only justifiable for large orgs running coordinated CX across many channels.
Source price statement, unverified: Custom enterprise pricing (typically $1,000+/mo)
Source classification: tier 5; price class enterprise; flags enterprise.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: A unified customer-experience system addresses coordination across functions, not just discovering pain language. Evaluate which teams, channels and evidence need to connect. The source's large-organization-only claim is a positioning judgment, not a verified eligibility rule or a reason to buy.
Original catalog supporting this entry · Visit Sprinklr using the original resource link
Talkwalker
Source description: Consumer intelligence platform with broad language and source coverage.
Source feature inventory: 187+ languages supported; Image + video recognition; Trend detection; Crisis monitoring.
Source benefit claim: Strongest in non-English markets. Enterprise pricing limits applicability.
Source price statement, unverified: Custom enterprise pricing
Source classification: tier 5; price class enterprise; flags enterprise.
Source workflow destinations: Gate 09.
How to interpret and apply this entry: Language count, recognition capability and crisis alerts need task-specific validation. An image or video match does not certify meaning, and multilingual sentiment can miss context. The strongest-non-English claim lacks comparison evidence. This entry also disproves the catalog's own claim that only YouScan handles images.
Original catalog supporting this entry · Visit Talkwalker using the original resource link
IdeaProof
Source description: AI startup validator with market analysis, competitor insights, and structured reports. ~120-second turnaround.
Source feature inventory: 120-second AI validation; Market analysis; Competitor insights; Investor-ready reports.
Source benefit claim: Fast first-pass sanity check on Gate 02 before committing time.
Source price statement, unverified: Free tier · Paid available
Source classification: tier 6; price class free; flags new, free.
Source workflow destinations: Gate 02.
How to interpret and apply this entry: A rapid AI report can organize questions and hypotheses, but cannot validate a market merely by generating an investor-style document. Inspect every market and competitor claim and identify missing primary evidence. The 120-second turnaround is a source claim, not a measure of research completeness.
Original catalog supporting this entry · Visit IdeaProof using the original resource link
DimeADozen
Source description: AI-generated 40+ page validation reports covering market viability, monetization, competitor analysis, MVP planning, and risk assessment.
Source feature inventory: 40+ page reports in <20s; Market viability + competitive analysis; MVP planning; Pivot suggestions; Risk assessment.
Source benefit claim: Replaces weeks of desk research with a structured first-draft report.
Source price statement, unverified: Free trial · Paid plans available
Source classification: tier 6; price class cheap; flags new.
Source workflow destinations: Gate 02.
How to interpret and apply this entry: Report length and generation speed do not establish equivalent quality to weeks of desk research. Separate sourced observations from generated monetization, MVP and pivot suggestions. Use the output to prioritize evidence collection rather than presenting it as verified viability or risk assessment.
Original catalog supporting this entry · Visit DimeADozen using the original resource link
ValidatorAI
Source description: AI advisor that scores ideas, simulates customer feedback, and suggests next steps. Used by 300,000+ founders.
Source feature inventory: Idea scoring + grading; Simulated customer feedback; Launch-readiness guidance; 24/7 AI mentor chatbot.
Source benefit claim: The "talk to an AI advisor" version of validation — useful for the question-answer interaction style.
Source price statement, unverified: Free + custom pricing
Source classification: tier 6; price class free; flags new, free.
Source workflow destinations: Gate 02.
How to interpret and apply this entry: Simulated customer feedback comes from a model, not actual customers. Use conversational critique to uncover assumptions, then test them against independent evidence. Idea grades and the claimed founder-user count do not establish predictive accuracy or readiness to launch.
Original catalog supporting this entry · Visit ValidatorAI using the original resource link
Wynter
Source description: On-demand B2B message testing. Get 12–48 hour feedback from verified ICPs (job-title and industry filtered). The closest tool to "test your Gate 06 copy with real buyers before launching."
Source feature inventory: Verified ICP audience (60K+ B2B professionals); Job-title + industry targeting; 12–48 hour turnaround; Message testing + brand research; Persona research.
Source benefit claim: Stops you from launching copy that's convincing only to yourself. Brutal but accurate.
Source price statement, unverified: From ~$540/test
Source classification: tier 6; price class mid; flags new.
Source workflow destinations: Gate 04, Gate 06, Gate 06½.
How to interpret and apply this entry: Message feedback from a recruited target group can test comprehension and relevance, but is not the same as observed purchasing behavior. Inspect participant screening, questions and sample context. The historical fee is per test, not automatically per month; turnaround, panel size and accuracy claims require verification.
Original catalog supporting this entry · Visit Wynter using the original resource link
Prelaunch
Source description: Measures actual market reaction (pre-orders, landing-page conversion) before product release. Real-money signal beats hypothetical interest.
Source feature inventory: Pre-order capture + measurement; Landing-page conversion testing; Concept validation surveys; Price-sensitivity testing.
Source benefit claim: The most rigorous Gate 02 / Gate 04 validation — buyer money on the line, not just stated intent.
Source price statement, unverified: Custom pricing
Source classification: tier 6; price class mid; flags new.
Source workflow destinations: Gate 02, Gate 04, Gate 07.
How to interpret and apply this entry: Distinguish survey interest, landing-page actions, reservations and paid orders. Money committed can provide a different signal from stated interest, but terms, refunds, traffic selection and fulfillment still affect interpretation. The source's most-rigorous ranking is not demonstrated, and no pre-order is collected here.
Original catalog supporting this entry · Visit Prelaunch using the original resource link
Typeform
Source description: Conversational surveys with high completion rates. Best for follow-up validation surveys to refund interviewees and Dream 100.
Source feature inventory: One-question-at-a-time format; Logic jumps + conditional flows; Integrations (Zapier, etc.); Free tier with 10 responses/mo.
Source benefit claim: Higher completion rates than form-style surveys. Worth the premium for that alone.
Source price statement, unverified: Free tier · Basic from $25/mo
Source classification: tier 7; price class free; flags free.
Source workflow destinations: Gate 03, Gate 05½, Gate 08.
How to interpret and apply this entry: Question wording, selection and branching affect what a survey can tell you. Test each logic path and record who was invited and who answered. A one-question format does not guarantee higher completion or unbiased findings; the claimed response allowance and price are historical source details.
Original catalog supporting this entry · Visit Typeform using the original resource link
Hotjar
Source description: Heatmaps, session recordings, on-page feedback polls. The diagnostic input for Gate 09's hook/audience/offer triage.
Source feature inventory: Heatmaps (clicks, scroll, attention); Session recordings; On-page feedback polls; Conversion-funnel analysis.
Source benefit claim: Tells you where users actually drop off — Gate 09 hook vs. audience vs. offer diagnostic.
Source price statement, unverified: Free tier · Plus from $39/mo
Source classification: tier 7; price class free; flags free.
Source workflow destinations: Gate 03, Gate 09.
How to interpret and apply this entry: A recording or heatmap can show interaction patterns, while a poll provides reported reasons; neither alone proves why someone left or which offer change will work. Check tracking configuration, privacy requirements and event definitions before collecting data. No tracker is installed by this lesson.
Original catalog supporting this entry · Visit Hotjar using the original resource link
RISER-Client-Acquisition-Catalog
Leadinfo
Source description: Cookieless visitor identification. Tells you which law firms and insurance carriers visit your site, what pages they read, and how long they stayed — without requiring a cookie banner.
Source feature inventory: IP-to-company matching against 220M+ companies; 35–40% identification rate (high end of industry); Cookieless tracking (GDPR-friendly); ISO 27001 certified; 70+ integrations (CRMs, Slack, etc.).
Source benefit claim: For a niche specialist, the buyers researching you are already on your site. This tool tells you who they are before they reach out — turning silent visits into actionable warm leads.
Source price statement, unverified: From €69/mo Starter · 14-day free trial
Source classification: tier 1; price class cheap; flags essential.
Source workflow destinations: Step 4 Capture Intent.
How to interpret and apply this entry: Company matching is not proof that a particular individual visited or wants to buy. Inspect the match basis, coverage and uncertainty before classifying intent. The source's identification rate, certification and no-cookie-banner claim are unverified; cookieless technology alone does not determine every privacy obligation. No tracking code is installed here.
Original catalog supporting this entry · Visit Leadinfo using the original resource link
Leadfeeder (Dealfront)
Source description: The original visitor-ID tool. Now part of Dealfront. Slightly higher friction than Leadinfo (cookies, lower match rate), but the free tier is genuinely useful for testing the channel before committing.
Source feature inventory: Free tier: 100 identified companies/mo, 7-day history; Google Analytics integration; CRM sync (HubSpot, Salesforce, Pipedrive); Slack alerts on company visits; Echobot prospecting database.
Source benefit claim: The free tier is the test. If it produces 5+ named law firms in your first month, you have signal — pay to upgrade. If not, save the money.
Source price statement, unverified: Free 100 leads/mo · Paid from €99/mo
Source classification: tier 1; price class cheap; flags essential, free.
Source workflow destinations: Step 4 Capture Intent.
How to interpret and apply this entry: Treat identified companies as hypotheses to qualify, not automatically warm leads. A threshold of five named firms is an author upgrade suggestion, not proof of return on investment. Verify current free-tier limits, history and integrations before relying on them; the comparison with Leadinfo is not independently established.
Original catalog supporting this entry · Visit Leadfeeder (Dealfront) using the original resource link
RB2B
Source description: Person-level visitor identification (not just company). For US traffic, identifies individuals visiting your site — name, LinkedIn, email — when matched to their database.
Source feature inventory: Person-level identification (US only); Real-time Slack notifications; LinkedIn profile match; Free 250 contacts/month forever; Direct CRM push.
Source benefit claim: When a partner at a defense firm visits your VRF Forensic Audit page at 10pm Tuesday, you find out about it Wednesday morning by name. That changes your follow-up entirely.
Source price statement, unverified: Free 250 contacts/mo · Paid from $99/mo
Source classification: tier 1; price class cheap; flags free, essential.
Source workflow destinations: Step 4 Capture Intent.
How to interpret and apply this entry: A person-level match can be wrong or incomplete and does not grant permission to contact someone. Preserve uncertainty and inspect the actual matching and data-use conditions. The named late-night visitor story is an illustrative scenario, not evidence that the product observed such a person in this project.
Original catalog supporting this entry · Visit RB2B using the original resource link
Warmly
Source description: Live visitor identification with intent signals + ICP filters. Reveals current website visitors in real-time so reps can engage via chat or video while they're still reading.
Source feature inventory: Real-time visitor reveal; First-party intent signals; ICP filtering + lead routing; Live video/chat engagement; CRM-integrated workflows.
Source benefit claim: For a small consulting practice, the free tier (500 visitors/mo) is often enough. Upgrade only when scale demands it.
Source price statement, unverified: Free 500 visitors · Micro from $499/mo
Source classification: tier 1; price class mid; flags free.
Source workflow destinations: Step 4 Capture Intent.
How to interpret and apply this entry: Separate detection, qualification, routing and live engagement. A visitor's presence alone does not establish readiness for a chat or sales conversation. The free-plan allowance and upgrade recommendation are historical claims; define the actual workflow need before evaluating a plan.
Original catalog supporting this entry · Visit Warmly using the original resource link
SEAK Expert Witness Directory
Source description: The #1 rated expert witness directory in the industry. Free for attorneys to search. 2,000+ listed experts. Used by both plaintiff and defense counsel for credentialed expert searches.
Source feature inventory: No middleman — attorneys contact you directly; Free attorney search; Money-back guarantee on listings; SEAK also offers expert witness training; Strong reputation among litigators.
Source benefit claim: Best single directory choice if you can only pick one. Highest credibility signal, attorneys actually search it.
Source price statement, unverified: $545/yr basic listing
Source classification: tier 2; price class cheap; flags essential.
Source workflow destinations: Step 2 Get Listed.
How to interpret and apply this entry: A directory listing makes a profile discoverable; it does not certify every claim in the profile or guarantee an engagement. Check current eligibility, listing terms and any guarantee directly. The source's number-one and best-single-directory judgments have no supplied comparison evidence.
Original catalog supporting this entry · Visit SEAK Expert Witness Directory using the original resource link
JurisPro Expert Witness Directory
Source description: Long-standing directory founded by attorneys in 1999. Searchable by specialty, location, experience. Also indexed in LexisNexis. Volume play — moderate-quality leads but high name-recognition impact.
Source feature inventory: Profiles include CV, photos, articles, audio/video; LexisNexis indexed (massive attorney reach); Multi-year discounts; Lower-cost than SEAK or ALM; 25+ year reputation.
Source benefit claim: Pair with SEAK for double coverage. The LexisNexis indexing means your name appears in the workflow attorneys are already using.
Source price statement, unverified: $399/yr (multi-year discounts)
Source classification: tier 2; price class cheap; flags essential.
Source workflow destinations: Step 2 Get Listed.
How to interpret and apply this entry: Use specialty and location relevance to evaluate whether a listing fits the service. The claimed LexisNexis distribution, history and audience quality require current verification. Adding a second directory increases possible exposure, but does not automatically double qualified opportunities.
Original catalog supporting this entry · Visit JurisPro Expert Witness Directory using the original resource link
Experts.com (ALM)
Source description: Broader-reach directory part of the ALM legal media network. Higher cost than JurisPro, frequently used by larger firms doing complex litigation searches.
Source feature inventory: ALM legal network distribution; 15,000+ experts indexed; Court reporter + investigator + litigation support listings; Strong with AmLaw 200 firms.
Source benefit claim: Higher cost but stronger value if your case complexity matches the firms searching here.
Source price statement, unverified: $500–$1,000+/yr depending on tier
Source classification: tier 2; price class cheap; flags none.
Source workflow destinations: Step 2 Get Listed.
How to interpret and apply this entry: Check the actual directory operator, distribution network and listing tier before relying on the catalog's ownership and reach claims. A large indexed population or association with large firms does not prove fit for a specific expert. Measure attributable, qualified inquiries rather than assuming complexity guarantees value.
Original catalog supporting this entry · Visit Experts.com (ALM) using the original resource link
ForensisGroup
Source description: Expert-matching service rather than directory. Attorneys submit case details; ForensisGroup matches with vetted experts. They take a markup (typically 30–40%) on retained engagements.
Source feature inventory: No upfront cost; Pre-vetted expert pool; Active case-matching (not passive listing); Speed-focused workflow.
Source benefit claim: Zero downside to apply. They send you cases; you pay only when retained. Useful as a passive lead channel alongside direct directories.
Source price statement, unverified: Free to apply · % of fees on engagement
Source classification: tier 2; price class free; flags free.
Source workflow destinations: Step 2 Get Listed.
How to interpret and apply this entry: Distinguish matching services from passive listings and inspect the engagement economics. No upfront fee does not mean zero downside: terms, margin, time, conflicts and qualification still matter. The stated 30–40% markup is a historical claim, not a verified current fee or recommendation to apply.
Original catalog supporting this entry · Visit ForensisGroup using the original resource link
The Expert Institute
Source description: Case-matched referral service rather than open directory. Has researchers who pair attorneys with experts for specific cases. Strong technology and concierge-level service.
Source feature inventory: Specialized researcher matchmaking; No upfront listing fee; Custom expert searches; Vetting + credential verification.
Source benefit claim: Particularly strong for complex technical cases where attorneys want curation over self-search.
Source price statement, unverified: Free to apply · Case-matched referral fees
Source classification: tier 2; price class free; flags free.
Source workflow destinations: Step 2 Get Listed.
How to interpret and apply this entry: A researcher-led match can help locate expertise, but the practitioner still needs to verify scope, qualifications, conflicts and terms. No listing fee is different from no engagement cost. The source's strength-for-complex-cases judgment is not established by an outcome comparison.
Original catalog supporting this entry · Visit The Expert Institute using the original resource link
HG Experts
Source description: Mid-tier directory with moderate traffic and lower price point. Useful as a third or fourth directory listing for SEO surface area and name-recognition compounding.
Source feature inventory: Specialty-categorized listings; Lower-cost listing tier; Geographic search support.
Source benefit claim: The "diminishing returns" directory — adds incremental visibility without major investment.
Source price statement, unverified: Listing fees vary
Source classification: tier 2; price class cheap; flags none.
Source workflow destinations: Step 2 Get Listed.
How to interpret and apply this entry: Evaluate incremental visibility against the actual audience and existing listings. A third or fourth listing is not inherently beneficial, and directory presence does not guarantee search rankings. The catalog supplies no traffic evidence supporting its moderate-traffic or diminishing-returns labels.
Original catalog supporting this entry · Visit HG Experts using the original resource link
TASA (Technical Advisory Service)
Source description: Long-running expert referral service (since 1956). Application-based admission. Active case-matching rather than passive directory.
Source feature inventory: 65+ year track record; Active case-matching workflow; Quality vetting; Technical specialty depth.
Source benefit claim: Old-school, attorney-trusted referral source. Worth applying for if your specialty fits their roster.
Source price statement, unverified: Application-based · Referral model
Source classification: tier 2; price class free; flags none.
Source workflow destinations: Step 2 Get Listed.
How to interpret and apply this entry: Application and vetting are separate from actual case assignment. Verify current requirements and referral terms rather than assuming longevity establishes fit. The source's recommendation to apply is not an action taken here or proof that the user's specialty would be admitted.
Original catalog supporting this entry · Visit TASA (Technical Advisory Service) using the original resource link
LinkedIn (Free)
Source description: According to forensic-marketing veterans, LinkedIn produces more high-quality referrals than most paid directories. Free. Requires consistent posting of redacted case studies and technical insights.
Source feature inventory: Direct attorney + adjuster reach; Case-study post format works exceptionally well; Free unlimited posting; Connection-based credibility; No platform fee.
Source benefit claim: One veteran of 25+ years: "The best cases come from LinkedIn. Free." If you publish one redacted case study per week and engage with attorneys in your specialty, this outproduces $5K of directory listings.
Source price statement, unverified: Free
Source classification: tier 3; price class free; flags essential, free.
Source workflow destinations: Step 3 Reciprocity, Step 5 Convert, Step 6 Compound.
How to interpret and apply this entry: Use actual expertise and appropriately redacted cases to make the service understandable. The anonymous veteran quotation and claim of outperforming $5,000 in listings are unverified anecdotes, not expected results. Publishing has labor cost even when there is no platform subscription fee.
Original catalog supporting this entry · Visit LinkedIn (Free) using the original resource link
LinkedIn Sales Navigator
Source description: The single highest-ROI tool for most professional-services solos. Search by job title (Claims Adjuster, Director of Claims, Subrogation Specialist), firm size, geography. Save searches, get alerts when new people fill those roles.
Source feature inventory: Advanced filters (title, firm, geography, function); Saved-search alerts (new hires in target roles); Lead lists with CRM sync; 50 InMails/month on Core, 150 on Advanced; Account intelligence updates.
Source benefit claim: Builds and works your Dream 100 with surgical precision. If you only buy one paid acquisition tool, this is it.
Source price statement, unverified: Core $99/mo · Advanced $159/mo
Source classification: tier 3; price class cheap; flags essential.
Source workflow destinations: Step 1 Identify, Step 5 Convert.
How to interpret and apply this entry: Filters and saved searches can help identify relevant roles, but a search match is not a qualified opportunity. Verify current plan limits, integration access and permitted use. The highest-ROI and buy-this-first statements are source opinions without an individual cost-benefit analysis.
Original catalog supporting this entry · Visit LinkedIn Sales Navigator using the original resource link
LinkedIn Recruiter Lite
Source description: Sometimes overlooked alternative to Sales Navigator. Stronger boolean search, better hidden-profile access. Useful if you're also occasionally hiring associate engineers for your practice.
Source feature inventory: Boolean + advanced search; 30 InMails/month; Profile insights beyond standard view; Talent pool analytics.
Source benefit claim: Worth it only if you have dual use (research AND hiring). For pure prospecting, Sales Nav is cheaper and better-suited.
Source price statement, unverified: $170/mo
Source classification: tier 3; price class mid; flags niche.
Source workflow destinations: Step 1 Identify.
How to interpret and apply this entry: Recruiting and sales prospecting are different purposes. Check the product's permitted use and actual search capabilities before treating it as a substitute for a sales tool. The hidden-profile and comparison claims are not verified, and no recruiting or contact activity is initiated.
Original catalog supporting this entry · Visit LinkedIn Recruiter Lite using the original resource link
Apollo.io
Source description: B2B contact database with 275M+ contacts. Build targeted lists of insurance adjusters, defense attorneys, claims managers by title + firm + geography. Email + phone + LinkedIn on each.
Source feature inventory: 275M+ contact database; Filter by title, firm, geography, employee count; Email + phone + LinkedIn URLs; Built-in email sequencer; Free tier with 50 mobile credits/mo.
Source benefit claim: The cheapest credible way to build a Dream 100 list with verified contact data. The free tier is enough to test the channel.
Source price statement, unverified: Free tier · Basic from $59/mo
Source classification: tier 4; price class cheap; flags essential, free.
Source workflow destinations: Step 1 Identify, Step 5 Convert.
How to interpret and apply this entry: Contact records can assist research, but database size and a verification label do not prove every address is current, appropriate to use or connected to a willing buyer. Inspect role relevance and provenance. A built-in sequencer is a capability claim, not authorization to send outreach.
Original catalog supporting this entry · Visit Apollo.io using the original resource link
ZoomInfo
Source description: The B2B contact-data gold standard. Largest verified database, deepest firmographic detail, intent data layer. Pricing makes it overkill for solo practice.
Source feature inventory: Deepest verified contact data; Firmographic + technographic filters; Intent data layer (who's researching what); CRM integrations; Org chart visibility.
Source benefit claim: For a multi-engineer firm with a sales function. Solos should use Apollo first.
Source price statement, unverified: Custom enterprise pricing (typically $15K+/yr)
Source classification: tier 4; price class enterprise; flags enterprise.
Source workflow destinations: Step 1 Identify.
How to interpret and apply this entry: Firmographic, technology and intent fields represent different kinds of data with different uncertainty. A topic signal does not prove a named person's purchase plan. The gold-standard, largest and deepest claims lack supplied comparative evidence; assess actual requirements before interpreting enterprise cost as quality.
Original catalog supporting this entry · Visit ZoomInfo using the original resource link
Cognism
Source description: European-strong B2B data with phone-verified contacts and GDPR-compliance focus. Better than ZoomInfo for European data, weaker for US-only.
Source feature inventory: Phone-verified mobile numbers; GDPR + CCPA compliance; Strong European coverage; Diamond-verified contact tier.
Source benefit claim: Use only if you have European case work or specific phone-outreach intensity.
Source price statement, unverified: Custom pricing (typically $1,000+/mo)
Source classification: tier 4; price class enterprise; flags enterprise.
Source workflow destinations: Step 1 Identify.
How to interpret and apply this entry: Phone verification and regional coverage do not by themselves establish permission for a specific use. The compliance labels and Europe-versus-US comparison require current primary review. Keep the source's tier and price claims distinct from a recommendation for this business.
Original catalog supporting this entry · Visit Cognism using the original resource link
Clay
Source description: Data-enrichment + workflow automation. Aggregates 75+ data providers. Power-user tool for building hyper-targeted Dream 100 workflows with AI-driven personalization.
Source feature inventory: 75+ data providers in one platform; AI-powered personalization at scale; Workflow automation; Spreadsheet-style interface; Steep learning curve.
Source benefit claim: Overkill for most solo practices. Worth it for firms running systematic high-volume outreach.
Source price statement, unverified: Free tier · Starter from $149/mo
Source classification: tier 4; price class mid; flags niche.
Source workflow destinations: Step 1 Identify, Step 5 Convert.
How to interpret and apply this entry: Combining providers can create conflicting or stale fields, so retain provenance and define how conflicts are resolved. Personalization based on an incorrect inference can make a message less accurate. Provider count and automation availability do not justify high-volume outreach or prove the workflow is appropriate.
Original catalog supporting this entry · Visit Clay using the original resource link
PACER
Source description: Federal court records, public access. Search filings by case type, attorney, firm, jurisdiction. Identify which firms handle the case types your specialty serves.
Source feature inventory: Public Access to Court Electronic Records; $0.10/page (capped at $3/document); No subscription required; Search by attorney, firm, case type; PACER Service Center direct access.
Source benefit claim: Tells you exactly which attorneys filed which kinds of cases in your jurisdiction. The Dream 100 research foundation. Free until $30/quarter usage.
Source price statement, unverified: $0.10/page · No subscription
Source classification: tier 5; price class free; flags essential, free.
Source workflow destinations: Step 1 Identify.
How to interpret and apply this entry: Use relevant public records to understand a matter's actual context, not to infer demand or make allegations from a filing alone. The source labels the entry free while also listing per-page charges and waiver/cap claims. Check the official fee schedule and scope before retrieving billable records; no record purchase is made here.
Original catalog supporting this entry · Visit PACER using the original resource link
Justia
Source description: Free legal research portal. Searchable case law, attorney directories, court dockets. Useful for identifying attorneys at specific firms handling specific case types.
Source feature inventory: Case law search; Attorney + firm directory; Free dockets and decisions; No registration required for most features.
Source benefit claim: Zero-cost first pass on identifying attorneys handling your case-type. Pair with LinkedIn to find them.
Source price statement, unverified: Free
Source classification: tier 5; price class free; flags free.
Source workflow destinations: Step 1 Identify.
How to interpret and apply this entry: A directory or published decision can identify a research lead, but coverage may be incomplete or outdated. Verify role, case context and current affiliation before drawing a business conclusion. Public availability does not establish that a person welcomes a solicitation.
Original catalog supporting this entry · Visit Justia using the original resource link
Westlaw
Source description: The professional legal research standard. Westlaw Profiler shows expert testimony history including who has cross-examined you, who has hired you, and outcomes.
Source feature inventory: Expert Witness Profiler; Case-law + statutory research; Litigation history search; Daubert challenge tracker; Brief Bank.
Source benefit claim: Worth subscribing once your testimony record is substantial. Lets you research opposing experts and identify firms with case-type fit.
Source price statement, unverified: Custom (typically $100–500+/mo)
Source classification: tier 5; price class mid; flags none.
Source workflow destinations: Step 1 Identify, Step 6 Compound.
How to interpret and apply this entry: Distinguish the base research service from any profiler or specialist feature, and verify access in the actual subscription. Litigation history needs context; a challenge or outcome does not alone establish competence or future results. The catalog's price range and subscription recommendation are not verified current terms.
Original catalog supporting this entry · Visit Westlaw using the original resource link
Casetext (CoCounsel)
Source description: AI-powered legal research now part of Thomson Reuters. CoCounsel handles complex queries about case law, expert challenges, and Daubert history.
Source feature inventory: AI-powered legal queries; Brief drafting assistance; Case law search; Daubert/Frye history search.
Source benefit claim: For practices that bill enough hours to justify research time. Solo experts can usually skip this for Justia + occasional Westlaw.
Source price statement, unverified: CoCounsel from $400/mo
Source classification: tier 5; price class mid; flags none.
Source workflow destinations: Step 6 Compound.
How to interpret and apply this entry: Treat generated legal research as a draft requiring verification against authoritative materials by an appropriate reviewer. Product names, ownership and subscription packaging may change. The source does not establish that every listed query capability is available through this link or that a particular practice should subscribe.
Original catalog supporting this entry · Visit Casetext (CoCounsel) using the original resource link
Lex Machina
Source description: Litigation analytics platform. Shows which firms litigate which case types, win rates, judge tendencies. Useful for premium-tier Dream 100 targeting.
Source feature inventory: Litigation outcome analytics; Firm-by-case-type analytics; Judge analytics; Patent + commercial + IP focus.
Source benefit claim: Niche tool. Worth it if you have specific litigation-analytics needs and the budget. Most experts can skip.
Source price statement, unverified: Custom enterprise pricing
Source classification: tier 5; price class enterprise; flags enterprise, niche.
Source workflow destinations: Step 1 Identify.
How to interpret and apply this entry: Outcome analytics depend on coverage, definitions and case mix. A firm's historical rate or a judge-level pattern is not a prediction for an individual matter. Define the research question and inspect the underlying records before using a ranking as a prospect-selection rule.
Original catalog supporting this entry · Visit Lex Machina using the original resource link
Docket Alarm
Source description: Court docket monitoring. Get alerts when new cases of your case-type are filed in your jurisdiction. Approach the firm before they've hired an expert.
Source feature inventory: New-case alerts by keyword + jurisdiction; Federal + state court coverage; API access; Cheaper than PACER for high-volume monitoring.
Source benefit claim: For specialists in narrow case types (e.g., balcony collapse, VRF litigation), this turns case filings into outreach signals.
Source price statement, unverified: From $99/mo
Source classification: tier 5; price class cheap; flags none.
Source workflow destinations: Step 1 Identify.
How to interpret and apply this entry: A new filing is a research signal, not proof that a firm lacks an expert or wants a solicitation. Verify jurisdiction coverage, alert criteria and the actual case context. The claimed cost advantage over PACER is workload-dependent and unverified; no monitoring or outreach is activated.
Original catalog supporting this entry · Visit Docket Alarm using the original resource link
HubSpot CRM (Free)
Source description: The free CRM that actually works for solo practices. Track every attorney contact, every case inquiry, every follow-up. Email integration, deal pipeline, no time limit.
Source feature inventory: Truly free (not a trial); Unlimited contacts; Email + Gmail integration; Deal pipeline visualization; Automatic activity logging.
Source benefit claim: You need a CRM. This one is free, capable, and pre-integrated with Apollo, LinkedIn Sales Nav, and visitor-ID tools. Start here.
Source price statement, unverified: Free forever
Source classification: tier 6; price class free; flags essential, free.
Source workflow destinations: Step 5 Convert, Step 6 Compound.
How to interpret and apply this entry: A CRM can preserve contacts, stages and follow-up history, but its usefulness depends on accurate records and consistent use. Free-forever, unlimited-contact and included-integration claims are historical and need current plan verification. This project remains in GHL; the source does not authorize a migration or duplicate CRM.
Original catalog supporting this entry · Visit HubSpot CRM (Free) using the original resource link
Pipedrive
Source description: Pipeline-focused CRM. More opinionated than HubSpot — pushes you toward closing deals through stages. Good fit for the case-driven sales cycle of forensic engineering.
Source feature inventory: Visual pipeline (drag-drop deal stages); Email tracking + templates; Activity reminders; Mobile app polish; Fewer features than HubSpot but cleaner UX.
Source benefit claim: Pick this over HubSpot if you prefer clean over feature-rich. Either is fine; pick one and use it.
Source price statement, unverified: Essential $25/seat/mo · Advanced $49/seat/mo
Source classification: tier 6; price class cheap; flags none.
Source workflow destinations: Step 5 Convert.
How to interpret and apply this entry: Define stages by observable buyer progress rather than moving cards to create the appearance of momentum. Reminders and templates support a process but do not close an engagement themselves. The interface comparison is subjective, and a catalog example is not a reason to replace the user's current system.
Original catalog supporting this entry · Visit Pipedrive using the original resource link
Folk CRM
Source description: Modern, relationship-focused CRM. Designed for people who think of contacts as relationships, not pipeline. Excellent LinkedIn + Gmail integration.
Source feature inventory: Magic Email enrichment; LinkedIn Chrome extension; Relationship intelligence; Smart fields + automation; Notion-style flexibility.
Source benefit claim: Best fit for an expert-witness practice where relationships compound across many cases over many years.
Source price statement, unverified: Standard $20/seat/mo · Premium $40/seat/mo
Source classification: tier 6; price class cheap; flags niche.
Source workflow destinations: Step 5 Convert, Step 6 Compound.
How to interpret and apply this entry: Relationship history can preserve context across engagements, but inferred relationship intelligence and enriched fields need checking. Separate factual notes from assumptions about a contact. Evaluate the current integration and access model before importing sensitive relationship data; no import occurs here.
Original catalog supporting this entry · Visit Folk CRM using the original resource link
Smartlead
Source description: Cold-email infrastructure. Multi-mailbox sending, deliverability optimization, AI personalization. The tool to use when sending Dream 100 outreach at meaningful volume.
Source feature inventory: Unlimited email accounts (no per-mailbox fees); Deliverability optimization (warm-up, throttling); AI subject + body personalization; Reply detection + auto-pause; Built-in sequence editor.
Source benefit claim: Cheaper than Lemlist or Instantly at scale. Better deliverability than HubSpot Sequences for cold outreach to attorneys.
Source price statement, unverified: Basic $39/mo · Pro $94/mo
Source classification: tier 6; price class cheap; flags none.
Source workflow destinations: Step 5 Convert.
How to interpret and apply this entry: Sending infrastructure, reply detection and sequencing do not guarantee inbox placement or appropriate outreach. Test actual stop conditions and respect recipient preferences before any real campaign. The comparative deliverability and price claims are unsupported here; no mailbox, domain or sequence is connected.
Original catalog supporting this entry · Visit Smartlead using the original resource link
Instantly
Source description: Cold-email outreach platform with strong deliverability and AI features. Direct competitor to Smartlead. Pick whichever you can get a discount on.
Source feature inventory: Unlimited email accounts on paid plans; Inbox warmup (Email Deliverability Network); CRM-lite functionality; Sequence builder + AI personalization; B2B lead database (paid add-on).
Source benefit claim: Functionally equivalent to Smartlead. Pick based on UX preference and current promo pricing.
Source price statement, unverified: Hyper-Growth $97/mo
Source classification: tier 6; price class cheap; flags none.
Source workflow destinations: Step 5 Convert.
How to interpret and apply this entry: Distinguish outreach-plan capabilities from a paid database add-on. A promotional price does not establish total cost, suitability or functional equivalence to another service. Warm-up and personalization features do not remove the need for accurate targeting and responsible sending; no campaign is launched.
Original catalog supporting this entry · Visit Instantly using the original resource link
Lemlist
Source description: Cold outreach with hyper-personalization (custom images, video, dynamic landing pages). Higher reply rates if you use the personalization features; otherwise overpriced.
Source feature inventory: Custom image + video personalization; Liquid syntax dynamic content; AI campaign generator; Built-in 450M lead database; Strong deliverability tools.
Source benefit claim: Worth premium only if you actually use the personalization. Otherwise Smartlead or Instantly is cheaper for the same outcome.
Source price statement, unverified: Email Outreach $59/mo · Sales Engagement $99/mo
Source classification: tier 6; price class cheap; flags none.
Source workflow destinations: Step 5 Convert.
How to interpret and apply this entry: Dynamic images or text are only useful when they communicate accurate, relevant context. Personalization based on false details can damage trust. The catalog supplies no controlled evidence of higher replies or equal outcomes at different prices. Database size and plan features remain historical claims.
Original catalog supporting this entry · Visit Lemlist using the original resource link
NAFE Membership
Source description: National Academy of Forensic Engineers. The professional society for forensic engineering. Member directory, journal publication opportunities, conferences attended by attorneys.
Source feature inventory: Peer-reviewed journal (J. NAFE); Member directory used by attorneys; Annual + regional conferences; Continuing education + certification; Strong credibility signal on CV.
Source benefit claim: For a forensic engineer, NAFE is not optional. It's a credentialing baseline. Attorneys searching for "credentialed forensic engineer" will look here.
Source price statement, unverified: ~$300–500/yr (membership tiers vary)
Source classification: tier 7; price class cheap; flags essential.
Source workflow destinations: Step 2 Get Listed, Step 7 Reputation.
How to interpret and apply this entry: Membership, certification, competence and eligibility to provide a service are different matters. The source's non-optional credentialing-baseline claim is not established by this catalog. Verify actual membership criteria and benefits directly; joining does not automatically confer every listed qualification or produce referrals.
Original catalog supporting this entry · Visit NAFE Membership using the original resource link
ASHRAE Membership
Source description: For HVAC/VRF/mechanical specialists. Technical committee work and standards development create unmatched authority signal. Conference speaking lands directly in front of buyers.
Source feature inventory: Technical committee membership; Standards-development authorship; Annual + winter conferences; Specialty certifications (BCxP, OPMP, etc.); Member directory.
Source benefit claim: For VRF litigation specifically, ASHRAE involvement is the single highest-trust signal a court will see. Worth the time investment.
Source price statement, unverified: Member $263/yr
Source classification: tier 7; price class cheap; flags niche.
Source workflow destinations: Step 7 Reputation.
How to interpret and apply this entry: Committee participation, standards authorship, membership and specialty certification each have their own requirements. Do not imply that paying dues supplies all of them. The claim of the highest court-trust signal is unsupported, and involvement does not guarantee expert qualification or case outcomes.
Original catalog supporting this entry · Visit ASHRAE Membership using the original resource link
NFPA Membership
Source description: National Fire Protection Association. Essential for fire-investigation specialists. NFPA 921 is the gold-standard methodology referenced in fire forensics testimony.
Source feature inventory: NFPA 921 access + interpretation; Standards committees; Conference + training programs; Specialty journals; CFEI / CFI certifications path.
Source benefit claim: For fire forensic engineering, NFPA is non-optional. Without NFPA 921 fluency, your testimony gets picked apart on cross.
Source price statement, unverified: Member ~$175/yr
Source classification: tier 7; price class cheap; flags niche.
Source workflow destinations: Step 7 Reputation.
How to interpret and apply this entry: Separate familiarity with a relevant standard from association membership and credentials issued by other bodies. The catalog's certification-path and mandatory-membership implications require independent verification. It provides no basis for assuring testimony outcomes or treating one membership as universal authorization to practice.
Original catalog supporting this entry · Visit NFPA Membership using the original resource link
ASCE Membership
Source description: American Society of Civil Engineers. Essential for structural / civil specialists. Forensic Engineering Division within ASCE is specifically attorney-facing.
Source feature inventory: Forensic Engineering Division; Technical journal publishing; Continuing education; Specialty certifications (PE-related); Standards documents.
Source benefit claim: For structural failure work, ASCE FED visibility is direct attorney-facing reputation building.
Source price statement, unverified: Member $310/yr
Source classification: tier 7; price class cheap; flags niche.
Source workflow destinations: Step 7 Reputation.
How to interpret and apply this entry: Professional participation and publishing can demonstrate relevant work when accurately described, but membership alone does not establish licensure or a specialty credential. Verify current division names, programs and eligibility rather than repeating the source's labels as current facts. No membership purchase is made.
Original catalog supporting this entry · Visit ASCE Membership using the original resource link
SparkToro
Source description: Audience research. Type "insurance defense attorney" and SparkToro tells you which podcasts they listen to, what publications they read, who they follow on LinkedIn. Your earned-media targeting list.
Source feature inventory: Audience clickstream analysis; Podcast / publication / social account discovery; Natural-language audience description; Podcast guest opportunities; Email newsletter analysis.
Source benefit claim: Tells you exactly where to publish, where to guest-podcast, and who to connect with on LinkedIn. The Dream 100 amplifier.
Source price statement, unverified: Personal $38/mo · Business $112/mo
Source classification: tier 7; price class cheap; flags none.
Source workflow destinations: Step 5 Convert, Step 7 Reputation.
How to interpret and apply this entry: Audience-affinity research can suggest publications, podcasts and accounts to investigate. It cannot tell you exactly where a particular person listens or guarantee a guest invitation. Confirm audience fit, editorial requirements and actual opportunities before turning aggregate data into a distribution plan.
Original catalog supporting this entry · Visit SparkToro using the original resource link
ALI CLE
Source description: American Law Institute Continuing Legal Education. Speak at one of their programs and you're directly in front of 100–500 practicing attorneys earning their CLE credits.
Source feature inventory: Direct audience: practicing attorneys; CLE-credit-eligible content; Recorded distribution beyond live talk; High-credibility signal; Often paid speaker honoraria.
Source benefit claim: A single ALI CLE talk on "Forensic Engineering for VRF Litigation" produces inbound case inquiries for years afterward.
Source price statement, unverified: Speaker — variable; Attendee from $300/course
Source classification: tier 7; price class mid; flags niche.
Source workflow destinations: Step 7 Reputation.
How to interpret and apply this entry: A speaking opportunity requires relevant expertise and acceptance into an actual program. Audience size, honoraria, recording distribution and eligibility vary by event. The promise that one talk generates inquiries for years is unverified; assess the educational contribution and actual event terms rather than projected leads.
Original catalog supporting this entry · Visit ALI CLE using the original resource link
State Bar CLE Programs
Source description: State and local bar associations run CLE programs constantly. They need expert speakers; they pay either honoraria or just visibility. Direct path to the local Dream 100.
Source feature inventory: Direct local-attorney audience; Often unpaid (visibility-based); Attendee list available post-event; CLE-credit eligibility; Recurring speaking opportunities.
Source benefit claim: Highest ROI per hour invested for local Dream 100 cultivation. Apply to every state bar in your geography.
Source price statement, unverified: Variable · Often free for speakers
Source classification: tier 7; price class free; flags free, niche.
Source workflow destinations: Step 7 Reputation.
How to interpret and apply this entry: The stored URL points to the American Bar Association, not a specific state-bar program. Preserve that distinction and locate the relevant organizer before applying. Attendee-list access and permission to use it are not guaranteed. The highest-ROI and apply-everywhere instructions are source opinions, not actions authorized here.
Original catalog supporting this entry · Visit State Bar CLE Programs using the original resource link
Wynter (Message Testing)
Source description: On-demand B2B message testing. Get 12–48 hour feedback from a panel including legal/insurance professionals. Test your service-page copy against actual buyers before launching.
Source feature inventory: Verified ICP panel (60K+ B2B professionals); Job-title + industry targeting; 12–48 hour turnaround; Service-page + email message testing; Persona research.
Source benefit claim: Most forensic engineers wouldn't think to test their service-page copy with actual attorneys. The ones who do convert better.
Source price statement, unverified: From ~$540/test
Source classification: tier 7; price class mid; flags niche.
Source workflow destinations: Step 3 Reciprocity.
How to interpret and apply this entry: For professional-service messaging, screen participants for the actual role and decision context. Feedback can reveal comprehension or relevance issues without proving conversion improvement. The claimed legal/insurance panel availability, turnaround and fee need verification; this duplicate vendor entry is retained for its distinct acquisition context.
Original catalog supporting this entry · Visit Wynter (Message Testing) using the original resource link
Expert Communications
Source description: Marketing consultancy specifically for expert witnesses. Resume + CV positioning, fee-setting strategy, deposition prep. Niche but proven for the practitioner who wants done-with-you positioning help.
Source feature inventory: Expert-specific marketing strategy; CV positioning + rewriting; Fee-schedule strategy; Deposition + testimony prep; Referral-network introductions.
Source benefit claim: Worth considering if you're past the technical excellence stage but stuck on positioning + fee-setting.
Source price statement, unverified: Coaching packages from $1,000+
Source classification: tier 7; price class mid; flags niche.
Source workflow destinations: Step 6 Compound.
How to interpret and apply this entry: Distinguish marketing positioning, fee strategy and testimony preparation, and verify which services a current engagement includes. The word proven is not accompanied by outcome evidence in the catalog. A consultancy example is not an endorsement, purchase instruction or substitute for relevant professional judgment.
Original catalog supporting this entry · Visit Expert Communications using the original resource link
Original toolkit setup references
These destinations support the source’s setup discussion. Opening a reference does not provision a service or require a purchase. The archived tools are not deployed by this lesson.
Complete original archive appendices
Original scripts are displayed as inert text. They are not executed. Download the original archive to retain its binary files and formatting.
Original asset: RISER-Client-Acquisition-Catalog.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RISER Client Acquisition Catalog · Professional Services</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter+Tight:[email protected]&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a;
--paper: #f7f4ee;
--paper-warm: #f0eadf;
--paper-deep: #e9e2d2;
--rule: #1a1a1a;
--red: #c9302a;
--red-deep: #8b1f1c;
--red-tint: #fbe8e6;
--red-soft: #f9d8d5;
--green: #1d6e3a;
--green-tint: #dcefe2;
--gold: #b8893a;
--gold-tint: #f5ead0;
--teal: #2c5f5a;
--teal-tint: #d8e6e4;
--muted: #5a564f;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: var(--sans);
background: var(--paper);
color: var(--ink);
line-height: 1.55;
font-size: 15px;
min-height: 100vh;
}
/* ============ MASTHEAD ============ */
.masthead {
border-bottom: 3px double var(--rule);
padding: 36px 32px 28px;
background: var(--paper);
}
.masthead-inner { max-width: 1280px; margin: 0 auto; }
.kicker {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 14px;
}
.kicker::after { content: ''; flex: 1; height: 1px; background: var(--rule); opacity: 0.3; }
.title {
font-family: var(--serif);
font-weight: 600;
font-size: clamp(36px, 5vw, 58px);
line-height: 1.0;
letter-spacing: -0.025em;
margin-bottom: 14px;
}
.title em { font-style: italic; font-weight: 400; color: var(--red-deep); }
.subtitle {
font-family: var(--serif);
font-style: italic;
font-size: 18px;
color: var(--muted);
max-width: 820px;
line-height: 1.45;
}
.colophon {
margin-top: 22px;
display: flex;
flex-wrap: wrap;
gap: 10px 22px;
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
letter-spacing: 0.05em;
}
.colophon span::before { content: '·'; margin-right: 22px; color: var(--muted); opacity: 0.5; }
.colophon span:first-child::before { content: ''; margin: 0; }
/* ============ DOCTRINE ============ */
.doctrine {
background: var(--paper-warm);
border-bottom: 1px solid var(--rule);
padding: 32px;
}
.doctrine-inner {
max-width: 1280px;
margin: 0 auto;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 36px;
}
@media (max-width: 800px) { .doctrine-inner { grid-template-columns: 1fr; } }
.doctrine-block h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--red-deep);
margin-bottom: 10px;
font-weight: 700;
}
.doctrine-block p {
font-family: var(--serif);
font-size: 16px;
line-height: 1.55;
margin-bottom: 10px;
}
.doctrine-block p strong { font-weight: 600; }
.doctrine-block .pull {
font-family: var(--serif);
font-style: italic;
font-size: 18px;
line-height: 1.45;
border-left: 3px solid var(--red-deep);
padding-left: 18px;
margin: 14px 0;
color: var(--ink);
}
/* ============ JOURNEY DIAGRAM ============ */
.journey {
padding: 40px 32px;
background: var(--paper);
border-bottom: 1px solid var(--rule);
}
.journey-inner { max-width: 1280px; margin: 0 auto; }
.journey-title {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 6px;
}
.journey-h2 {
font-family: var(--serif);
font-size: 28px;
font-weight: 600;
letter-spacing: -0.02em;
margin-bottom: 24px;
}
.journey-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 12px;
}
@media (max-width: 1000px) { .journey-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 600px) { .journey-grid { grid-template-columns: repeat(2, 1fr); } }
.journey-step {
border: 1.5px solid var(--rule);
background: var(--paper);
padding: 14px 14px 16px;
position: relative;
}
.journey-step::after {
content: '→';
position: absolute;
right: -12px;
top: 50%;
transform: translateY(-50%);
font-size: 18px;
color: var(--gold);
background: var(--paper);
width: 24px;
text-align: center;
z-index: 2;
font-weight: 700;
}
.journey-step:last-child::after { display: none; }
.journey-step .num {
font-family: var(--mono);
font-size: 11px;
font-weight: 700;
color: var(--red-deep);
letter-spacing: 0.08em;
margin-bottom: 4px;
}
.journey-step .label {
font-family: var(--serif);
font-size: 16px;
font-weight: 600;
line-height: 1.2;
margin-bottom: 6px;
letter-spacing: -0.01em;
}
.journey-step .desc {
font-size: 12px;
color: var(--muted);
line-height: 1.4;
}
/* ============ CONTROLS ============ */
.controls-bar {
position: sticky;
top: 0;
z-index: 50;
background: var(--paper);
border-bottom: 1px solid var(--rule);
padding: 16px 32px;
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.controls-inner {
max-width: 1280px;
margin: 0 auto;
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
}
.search-box { flex: 1; min-width: 240px; position: relative; }
.search-box input {
width: 100%;
padding: 10px 14px 10px 40px;
font-family: var(--sans);
font-size: 14px;
border: 1.5px solid var(--rule);
border-radius: 0;
background: var(--paper);
color: var(--ink);
transition: border-color 0.15s, background 0.15s;
}
.search-box input:focus { outline: none; border-color: var(--red-deep); background: #fff; }
.search-box::before {
content: '⌕';
position: absolute;
left: 14px;
top: 50%;
transform: translateY(-50%);
font-size: 16px;
color: var(--muted);
pointer-events: none;
}
.filter-group { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
.filter-label {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
margin-right: 4px;
}
.filter-btn {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.04em;
padding: 7px 12px;
border: 1.5px solid var(--rule);
background: var(--paper);
color: var(--ink);
cursor: pointer;
transition: all 0.12s;
text-transform: uppercase;
font-weight: 500;
}
.filter-btn:hover { background: var(--ink); color: var(--paper); }
.filter-btn.active { background: var(--red-deep); color: var(--paper); border-color: var(--red-deep); }
.filter-btn.active:hover { background: var(--red); }
.results-counter {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.08em;
color: var(--muted);
margin-left: auto;
text-transform: uppercase;
}
.results-counter strong { color: var(--ink); font-weight: 700; }
/* ============ MAIN ============ */
main { max-width: 1280px; margin: 0 auto; padding: 40px 32px 80px; }
.tier-section { margin-bottom: 64px; scroll-margin-top: 100px; }
.tier-section.hidden { display: none; }
.tier-header {
display: flex;
align-items: baseline;
gap: 16px;
margin-bottom: 10px;
border-bottom: 2px solid var(--rule);
padding-bottom: 14px;
}
.tier-num {
font-family: var(--mono);
font-size: 12px;
font-weight: 700;
color: var(--red-deep);
letter-spacing: 0.1em;
}
.tier-name {
font-family: var(--serif);
font-size: 32px;
font-weight: 600;
letter-spacing: -0.02em;
flex: 1;
}
.tier-count {
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
letter-spacing: 0.08em;
white-space: nowrap;
}
.tier-purpose {
font-family: var(--serif);
font-style: italic;
font-size: 16px;
color: var(--muted);
margin-bottom: 28px;
max-width: 820px;
line-height: 1.5;
}
.tier-purpose .gate-ref { font-style: normal; color: var(--red-deep); font-weight: 600; }
.tier-purpose strong { font-weight: 600; color: var(--ink); }
/* ============ TOOL CARDS ============ */
.tool-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(380px, 1fr)); gap: 20px; }
.tool-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 22px 22px 18px;
display: flex;
flex-direction: column;
position: relative;
transition: transform 0.12s, box-shadow 0.12s, background 0.12s;
}
.tool-card:hover { transform: translateY(-2px); box-shadow: 4px 4px 0 var(--rule); background: var(--paper-warm); }
.tool-card.hidden { display: none; }
.tool-card.tier-enterprise { background: var(--paper-deep); }
.tool-card.tier-enterprise:hover { background: #ddd5c2; }
.tool-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 6px;
}
.tool-name {
font-family: var(--serif);
font-size: 22px;
font-weight: 600;
line-height: 1.15;
letter-spacing: -0.01em;
}
.tool-name a {
color: var(--ink);
text-decoration: none;
border-bottom: 1px dotted var(--muted);
transition: border-color 0.12s, color 0.12s;
}
.tool-name a:hover { color: var(--red-deep); border-color: var(--red-deep); }
.tool-flags { display: flex; gap: 4px; flex-shrink: 0; flex-wrap: wrap; justify-content: flex-end; }
.flag {
font-family: var(--mono);
font-size: 9px;
font-weight: 700;
letter-spacing: 0.1em;
padding: 3px 6px;
border: 1px solid currentColor;
text-transform: uppercase;
white-space: nowrap;
}
.flag-essential { color: var(--red-deep); background: var(--red-tint); }
.flag-enterprise { color: var(--gold); }
.flag-free { color: var(--green); background: var(--green-tint); border-color: var(--green); }
.flag-niche { color: var(--teal); background: var(--teal-tint); border-color: var(--teal); }
.tool-url {
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
margin-bottom: 12px;
letter-spacing: 0.02em;
word-break: break-all;
}
.tool-pricing {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
background: var(--paper-warm);
border-left: 3px solid var(--gold);
margin-bottom: 14px;
font-family: var(--mono);
font-size: 12px;
}
.tool-card.tier-enterprise .tool-pricing { background: var(--paper); border-left-color: var(--red-deep); }
.pricing-label {
font-size: 10px;
letter-spacing: 0.12em;
color: var(--muted);
text-transform: uppercase;
flex-shrink: 0;
}
.pricing-value { color: var(--ink); font-weight: 600; }
.tool-description {
font-family: var(--serif);
font-size: 15px;
line-height: 1.5;
margin-bottom: 14px;
color: var(--ink);
}
.tool-section { margin-bottom: 12px; font-size: 13px; line-height: 1.5; }
.tool-section h4 {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 4px;
}
.tool-section p { color: var(--ink); }
.tool-section ul { list-style: none; padding: 0; }
.tool-section li {
padding-left: 14px;
position: relative;
margin-bottom: 3px;
color: var(--ink);
}
.tool-section li::before {
content: '→';
position: absolute;
left: 0;
color: var(--gold);
font-weight: 600;
}
.tool-footer {
display: flex;
gap: 8px;
margin-top: auto;
padding-top: 12px;
border-top: 1px dashed var(--muted);
flex-wrap: wrap;
}
.gate-tag {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.06em;
padding: 3px 8px;
background: var(--red-tint);
color: var(--red-deep);
font-weight: 600;
}
/* ============ TOC ============ */
.toc {
position: fixed;
top: 50%;
right: 24px;
transform: translateY(-50%);
z-index: 40;
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 14px 14px;
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.08em;
text-transform: uppercase;
max-width: 220px;
box-shadow: 4px 4px 0 var(--rule);
}
.toc-label {
font-weight: 700;
color: var(--red-deep);
margin-bottom: 8px;
border-bottom: 1px solid var(--rule);
padding-bottom: 6px;
}
.toc a {
display: block;
color: var(--ink);
text-decoration: none;
padding: 4px 0;
transition: color 0.12s;
line-height: 1.3;
}
.toc a:hover { color: var(--red-deep); }
.toc-num { color: var(--muted); margin-right: 6px; }
@media (max-width: 1180px) { .toc { display: none; } }
/* ============ STACK SECTION ============ */
.stacks {
background: var(--paper-warm);
padding: 56px 32px;
border-top: 3px double var(--rule);
border-bottom: 3px double var(--rule);
margin: 64px -32px;
}
.stacks-inner { max-width: 1280px; margin: 0 auto; }
.stacks-title {
font-family: var(--serif);
font-size: 36px;
font-weight: 600;
margin-bottom: 8px;
letter-spacing: -0.02em;
}
.stacks-sub {
font-family: var(--serif);
font-style: italic;
color: var(--muted);
margin-bottom: 36px;
font-size: 16px;
}
.stack-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; }
.stack-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 24px;
display: flex;
flex-direction: column;
}
.stack-card h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 4px;
}
.stack-card .stack-name {
font-family: var(--serif);
font-size: 26px;
font-weight: 600;
margin-bottom: 10px;
letter-spacing: -0.015em;
line-height: 1.1;
}
.stack-card .stack-cost {
font-family: var(--mono);
font-size: 12px;
color: var(--gold);
font-weight: 600;
margin-bottom: 14px;
letter-spacing: 0.04em;
}
.stack-card p {
font-family: var(--serif);
font-size: 15px;
line-height: 1.5;
margin-bottom: 14px;
color: var(--ink);
}
.stack-card ul { list-style: none; padding: 0; margin-top: auto; }
.stack-card li {
padding: 7px 0;
border-bottom: 1px dotted var(--muted);
font-size: 13px;
color: var(--ink);
display: flex;
justify-content: space-between;
gap: 10px;
}
.stack-card li:last-child { border-bottom: none; }
.stack-card .stack-item-name { font-weight: 500; }
.stack-card .stack-item-tier { font-family: var(--mono); font-size: 10px; color: var(--muted); letter-spacing: 0.06em; white-space: nowrap; }
/* ============ DREAM 100 SECTION ============ */
.dream100 {
padding: 56px 32px;
border-bottom: 3px double var(--rule);
}
.dream100-inner { max-width: 1280px; margin: 0 auto; }
.dream100-title {
font-family: var(--serif);
font-size: 36px;
font-weight: 600;
margin-bottom: 8px;
letter-spacing: -0.02em;
}
.dream100-sub {
font-family: var(--serif);
font-style: italic;
color: var(--muted);
margin-bottom: 30px;
font-size: 16px;
max-width: 820px;
line-height: 1.5;
}
.dream100-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; }
.dream100-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 18px 20px;
}
.dream100-card .seg-num {
font-family: var(--mono);
font-size: 28px;
font-weight: 700;
color: var(--red-deep);
line-height: 1;
margin-bottom: 4px;
letter-spacing: -0.02em;
}
.dream100-card h4 {
font-family: var(--serif);
font-size: 17px;
font-weight: 600;
margin-bottom: 6px;
line-height: 1.2;
letter-spacing: -0.01em;
}
.dream100-card p {
font-size: 13px;
color: var(--muted);
line-height: 1.45;
}
.dream100-total {
margin-top: 24px;
padding: 16px 20px;
background: var(--paper-warm);
border-left: 3px solid var(--red-deep);
font-family: var(--serif);
font-size: 16px;
line-height: 1.5;
}
.dream100-total strong { font-weight: 600; }
/* ============ FOOTER ============ */
footer {
border-top: 3px double var(--rule);
padding: 40px 32px 60px;
background: var(--paper);
}
.footer-inner { max-width: 1280px; margin: 0 auto; }
.footer-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 40px;
margin-bottom: 32px;
}
@media (max-width: 700px) { .footer-grid { grid-template-columns: 1fr; } }
.footer-grid h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
margin-bottom: 12px;
font-weight: 700;
}
.footer-grid p {
font-family: var(--serif);
font-size: 15px;
line-height: 1.55;
color: var(--ink);
margin-bottom: 12px;
}
.footer-rule {
border-top: 1px solid var(--rule);
padding-top: 20px;
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
letter-spacing: 0.04em;
}
.footer-rule strong { color: var(--ink); font-weight: 700; }
.no-results {
text-align: center;
padding: 60px 20px;
font-family: var(--serif);
font-style: italic;
font-size: 18px;
color: var(--muted);
display: none;
}
.no-results.visible { display: block; }
@keyframes fadeUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
.tool-card { animation: fadeUp 0.3s ease-out backwards; }
</style>
</head>
<body>
<header class="masthead">
<div class="masthead-inner">
<div class="kicker">RISER Captain's Logic · Companion Catalog · For Professional Services</div>
<h1 class="title">The Client Acquisition Stack <em>for</em> Expert Practitioners</h1>
<p class="subtitle">Thirty-nine verified tools and channels for forensic engineers, expert witnesses, consulting practices, and other professional services where buyers are gatekeepers — not searchers — and the sales cycle is referral-driven, case-triggered, and credential-bound.</p>
<div class="colophon">
<span>v1 · April 2026</span>
<span>39 tools across 7 channels</span>
<span>All links verified live</span>
<span>Sister artifact to the Pain Discovery Tool Catalog</span>
</div>
</div>
</header>
<section class="doctrine">
<div class="doctrine-inner">
<div class="doctrine-block">
<h3>Why this stack is different</h3>
<p>The previous Tool Catalog served operators validating product ideas. <strong>This catalog serves the inverse problem.</strong> You already know what you sell — 35 years of expertise, a credentialed specialty, a scarce skill. The question is no longer "is there demand," but "how do I reach the gatekeeper who controls case assignment before my competitor does."</p>
<p>For forensic engineers, that gatekeeper is the insurance adjuster, the litigation partner, the subrogation manager. They don't search Reddit. They don't fill out lead forms. They search expert directories at 11pm before a deposition, ask their associate for "the guy we used last time," and judge you on credentials and credibility within thirty seconds.</p>
</div>
<div class="doctrine-block">
<h3>What I'm betting on (and why)</h3>
<p class="pull">"Most forensic work comes from attorney referrals and repeat relationships, not from cold outreach. But operators who systematically supplement referrals with directory presence, intent capture, and Dream 100 outreach grow faster than those who wait."</p>
<p>This catalog is built around six channels in priority order: <strong>website-visitor identification, expert directories, LinkedIn outreach, B2B contact data, legal/case intelligence, and association-based reputation</strong>. Each tool is mapped to one of those six jobs. Reddit pain mining and broad social listening are deliberately excluded — they're the wrong instruments for this music.</p>
</div>
</div>
</section>
<section class="journey">
<div class="journey-inner">
<div class="journey-title">The Six-Step Buyer Journey</div>
<h2 class="journey-h2">How attorneys and adjusters actually find experts</h2>
<div class="journey-grid">
<div class="journey-step"><div class="num">01</div><div class="label">Identify</div><div class="desc">The gatekeeper — adjuster, partner, claims manager — controls case assignment.</div></div>
<div class="journey-step"><div class="num">02</div><div class="label">Get Listed</div><div class="desc">Expert directories, association rosters, and prior-case referral lists.</div></div>
<div class="journey-step"><div class="num">03</div><div class="label">Trigger Reciprocity</div><div class="desc">Lead magnet, free case-merit screen, or targeted CLE talk.</div></div>
<div class="journey-step"><div class="num">04</div><div class="label">Capture Intent</div><div class="desc">Identify which firms read your technical content but don't yet contact you.</div></div>
<div class="journey-step"><div class="num">05</div><div class="label">Convert Warm</div><div class="desc">Dream 100 outreach with proof + specificity. Mention the case-type they handle.</div></div>
<div class="journey-step"><div class="num">06</div><div class="label">Compound</div><div class="desc">Testimony performance + sanitized case studies + speaking → next three cases.</div></div>
</div>
</div>
</section>
<div class="controls-bar">
<div class="controls-inner">
<div class="search-box">
<input type="text" id="searchInput" placeholder="Search tools by name, feature, or use case…" autocomplete="off">
</div>
<div class="filter-group">
<span class="filter-label">Tier:</span>
<button class="filter-btn active" data-filter="all" data-filter-type="tier">All</button>
<button class="filter-btn" data-filter="1" data-filter-type="tier">1·VisitorID</button>
<button class="filter-btn" data-filter="2" data-filter-type="tier">2·Directories</button>
<button class="filter-btn" data-filter="3" data-filter-type="tier">3·LinkedIn</button>
<button class="filter-btn" data-filter="4" data-filter-type="tier">4·ContactData</button>
<button class="filter-btn" data-filter="5" data-filter-type="tier">5·LegalIntel</button>
<button class="filter-btn" data-filter="6" data-filter-type="tier">6·Outreach</button>
<button class="filter-btn" data-filter="7" data-filter-type="tier">7·Reputation</button>
</div>
<div class="filter-group">
<span class="filter-label">Budget:</span>
<button class="filter-btn active" data-filter="all" data-filter-type="budget">All</button>
<button class="filter-btn" data-filter="free" data-filter-type="budget">Free</button>
<button class="filter-btn" data-filter="cheap" data-filter-type="budget"><$100/mo</button>
<button class="filter-btn" data-filter="mid" data-filter-type="budget">$100–500</button>
<button class="filter-btn" data-filter="enterprise" data-filter-type="budget">Enterprise</button>
</div>
<div class="results-counter"><strong id="resultCount">39</strong> shown</div>
</div>
</div>
<nav class="toc">
<div class="toc-label">Channels</div>
<a href="#tier-1"><span class="toc-num">1·</span>Visitor ID</a>
<a href="#tier-2"><span class="toc-num">2·</span>Expert Directories</a>
<a href="#tier-3"><span class="toc-num">3·</span>LinkedIn</a>
<a href="#tier-4"><span class="toc-num">4·</span>Contact Data</a>
<a href="#tier-5"><span class="toc-num">5·</span>Legal Intel</a>
<a href="#tier-6"><span class="toc-num">6·</span>Outreach + CRM</a>
<a href="#tier-7"><span class="toc-num">7·</span>Reputation</a>
<a href="#dream100" style="margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--rule); color: var(--red-deep);">Dream 100 Template</a>
<a href="#stacks" style="color: var(--red-deep);">Recommended Stacks</a>
</nav>
<main id="catalog"></main>
<div class="no-results" id="noResults">
No tools match those filters. Try widening your criteria or clearing the search.
</div>
<section class="dream100" id="dream100">
<div class="dream100-inner">
<h2 class="dream100-title">The Dream 100 — Templated</h2>
<p class="dream100-sub">For a forensic engineer or expert practitioner, the Dream 100 isn't influencers or podcasters. It's the <strong>specific humans who control case assignment</strong> in your geography and specialty. Build this list in a spreadsheet. Work it weekly. Refresh it quarterly. This is your business.</p>
<div class="dream100-grid">
<div class="dream100-card">
<div class="seg-num">25</div>
<h4>Construction defect attorneys</h4>
<p>Plaintiff and defense counsel at firms with case history matching your specialty. Searchable via Westlaw, PACER, and state bar directories.</p>
</div>
<div class="dream100-card">
<div class="seg-num">25</div>
<h4>Insurance defense attorneys</h4>
<p>At carriers writing commercial property and liability policies. Direct case-source channel for failure analysis work.</p>
</div>
<div class="dream100-card">
<div class="seg-num">15</div>
<h4>Subrogation managers</h4>
<p>At Travelers, Liberty Mutual, Chubb, Hartford, AIG, Zurich. Subrogation drives more forensic engineering than any other single function.</p>
</div>
<div class="dream100-card">
<div class="seg-num">15</div>
<h4>Mechanical contractor GCs</h4>
<p>General counsel at large mechanical contractors. They get sued frequently; they need credentialed experts on retainer.</p>
</div>
<div class="dream100-card">
<div class="seg-num">10</div>
<h4>Property management firms</h4>
<p>Multi-site portfolio managers, especially with VRF/HVAC complexity. Risk-averse, value pre-emptive expert relationships.</p>
</div>
<div class="dream100-card">
<div class="seg-num">10</div>
<h4>Technical committee chairs</h4>
<p>ASHRAE, NFPA, ASCE committee leadership. Visibility here = referrals through technical credibility, not marketing.</p>
</div>
</div>
<div class="dream100-total">
<strong>100 named humans, in your geography, in your specialty.</strong> Not "construction defect lawyers" generically. <em>Sarah Chen, partner at Snell & Wilmer, Phoenix, handles balcony / VRF subrogation cases.</em> That level of specificity. The list is the asset. Working the list is the business.
</div>
</div>
</section>
<section class="stacks" id="stacks">
<div class="stacks-inner">
<h2 class="stacks-title">Recommended Stacks</h2>
<p class="stacks-sub">Three operator-tested combinations, ranked by where you are in the practice.</p>
<div class="stack-grid">
<div class="stack-card">
<h3>Stage One</h3>
<div class="stack-name">Foundation Stack</div>
<div class="stack-cost">~$60–120/month</div>
<p>The minimum credible presence. Get listed, get visible, capture the intent that's already coming to your site. Skip everything else for the first 90 days.</p>
<ul>
<li><span class="stack-item-name">SEAK directory listing</span><span class="stack-item-tier">$545/yr</span></li>
<li><span class="stack-item-name">JurisPro directory</span><span class="stack-item-tier">$399/yr</span></li>
<li><span class="stack-item-name">LinkedIn (free)</span><span class="stack-item-tier">$0</span></li>
<li><span class="stack-item-name">Leadinfo Starter</span><span class="stack-item-tier">€69/mo</span></li>
<li><span class="stack-item-name">NAFE membership</span><span class="stack-item-tier">~$300/yr</span></li>
</ul>
</div>
<div class="stack-card">
<h3>Stage Two</h3>
<div class="stack-name">Active Acquisition</div>
<div class="stack-cost">~$300–500/month</div>
<p>Once Stage One is producing inbound, layer outbound. LinkedIn Sales Nav + Apollo for targeting. Email outreach for the Dream 100. Now you're systematically working a list.</p>
<ul>
<li><span class="stack-item-name">Stage One stack</span><span class="stack-item-tier">~$120/mo</span></li>
<li><span class="stack-item-name">LinkedIn Sales Navigator</span><span class="stack-item-tier">$99/mo</span></li>
<li><span class="stack-item-name">Apollo Basic</span><span class="stack-item-tier">$59/mo</span></li>
<li><span class="stack-item-name">Smartlead or Instantly</span><span class="stack-item-tier">$39+/mo</span></li>
<li><span class="stack-item-name">HubSpot CRM Free</span><span class="stack-item-tier">$0</span></li>
</ul>
</div>
<div class="stack-card">
<h3>Stage Three</h3>
<div class="stack-name">Multi-Practitioner Firm</div>
<div class="stack-cost">$1,000+/month</div>
<p>For a forensic firm with 3+ engineers. Premium directories, real CRM, intent data, paid CLE distribution. Earnings justify the spend; spend earns its keep.</p>
<ul>
<li><span class="stack-item-name">Stage Two stack</span><span class="stack-item-tier">~$500/mo</span></li>
<li><span class="stack-item-name">ZoomInfo or Cognism</span><span class="stack-item-tier">Custom</span></li>
<li><span class="stack-item-name">Expert Institute referral</span><span class="stack-item-tier">% per case</span></li>
<li><span class="stack-item-name">Pipedrive or Folk CRM</span><span class="stack-item-tier">$25–69/seat</span></li>
<li><span class="stack-item-name">PACER monitoring service</span><span class="stack-item-tier">$50+/mo</span></li>
</ul>
</div>
</div>
</div>
</section>
<footer>
<div class="footer-inner">
<div class="footer-grid">
<div>
<h3>Operator's note</h3>
<p>The most successful forensic engineers and expert witnesses get the bulk of their work through <strong>relationships and reputation</strong>, not tooling. Tools amplify a working practice; they don't substitute for one. If you don't have at least one prior case to reference and one current attorney who'd vouch for you, fix that before you buy any of this.</p>
<p>One veteran of 25+ years in expert witness consulting put it bluntly: "The best cases come from LinkedIn. Free." Treat the tools below as accelerants for relationships you're already building, not replacements for the slow work of becoming the expert someone calls at 11pm.</p>
</div>
<div>
<h3>What I excluded</h3>
<p><strong>Reddit pain-mining tools</strong> — your buyers don't post case opportunities on Reddit.<br><strong>Enterprise social listening</strong> — wrong audience, wrong cost.<br><strong>Most VOC tools</strong> — wrong job; you're acquiring clients, not validating offers.<br><strong>Generic "AI marketing copilots"</strong> — produce text, not pipeline.</p>
</div>
</div>
<div class="footer-rule">
<strong>RISER Captain's Logic</strong> · Client Acquisition Catalog v1 · April 2026 · Sister artifact to the Pain Discovery Tool Catalog and MVO Decision Engine. All vendor names, pricing, and links verified at time of publication. Re-verify before purchase — pricing and availability change.
</div>
</div>
</footer>
<script>
// ============================================================================
// TOOL DATA — 40 verified tools for professional services client acquisition
// ============================================================================
const TOOLS = [
// ============ TIER 1 — WEBSITE VISITOR IDENTIFICATION ============
{
id: 'leadinfo',
name: 'Leadinfo',
url: 'https://www.leadinfo.com/',
urlDisplay: 'leadinfo.com',
tier: 1,
pricing: 'From €69/mo Starter · 14-day free trial',
pricingTier: 'cheap',
flags: ['essential'],
blurb: 'Cookieless visitor identification. Tells you which law firms and insurance carriers visit your site, what pages they read, and how long they stayed — without requiring a cookie banner.',
features: ['IP-to-company matching against 220M+ companies', '35–40% identification rate (high end of industry)', 'Cookieless tracking (GDPR-friendly)', 'ISO 27001 certified', '70+ integrations (CRMs, Slack, etc.)'],
benefit: 'For a niche specialist, the buyers researching you are already on your site. This tool tells you who they are before they reach out — turning silent visits into actionable warm leads.',
feeds: ['Step 4 Capture Intent']
},
{
id: 'leadfeeder',
name: 'Leadfeeder (Dealfront)',
url: 'https://www.leadfeeder.com/',
urlDisplay: 'leadfeeder.com',
tier: 1,
pricing: 'Free 100 leads/mo · Paid from €99/mo',
pricingTier: 'cheap',
flags: ['essential', 'free'],
blurb: 'The original visitor-ID tool. Now part of Dealfront. Slightly higher friction than Leadinfo (cookies, lower match rate), but the free tier is genuinely useful for testing the channel before committing.',
features: ['Free tier: 100 identified companies/mo, 7-day history', 'Google Analytics integration', 'CRM sync (HubSpot, Salesforce, Pipedrive)', 'Slack alerts on company visits', 'Echobot prospecting database'],
benefit: 'The free tier is the test. If it produces 5+ named law firms in your first month, you have signal — pay to upgrade. If not, save the money.',
feeds: ['Step 4 Capture Intent']
},
{
id: 'rb2b',
name: 'RB2B',
url: 'https://www.rb2b.com/',
urlDisplay: 'rb2b.com',
tier: 1,
pricing: 'Free 250 contacts/mo · Paid from $99/mo',
pricingTier: 'cheap',
flags: ['free', 'essential'],
blurb: 'Person-level visitor identification (not just company). For US traffic, identifies individuals visiting your site — name, LinkedIn, email — when matched to their database.',
features: ['Person-level identification (US only)', 'Real-time Slack notifications', 'LinkedIn profile match', 'Free 250 contacts/month forever', 'Direct CRM push'],
benefit: 'When a partner at a defense firm visits your VRF Forensic Audit page at 10pm Tuesday, you find out about it Wednesday morning by name. That changes your follow-up entirely.',
feeds: ['Step 4 Capture Intent']
},
{
id: 'warmly',
name: 'Warmly',
url: 'https://www.warmly.ai/',
urlDisplay: 'warmly.ai',
tier: 1,
pricing: 'Free 500 visitors · Micro from $499/mo',
pricingTier: 'mid',
flags: ['free'],
blurb: 'Live visitor identification with intent signals + ICP filters. Reveals current website visitors in real-time so reps can engage via chat or video while they\'re still reading.',
features: ['Real-time visitor reveal', 'First-party intent signals', 'ICP filtering + lead routing', 'Live video/chat engagement', 'CRM-integrated workflows'],
benefit: 'For a small consulting practice, the free tier (500 visitors/mo) is often enough. Upgrade only when scale demands it.',
feeds: ['Step 4 Capture Intent']
},
// ============ TIER 2 — EXPERT DIRECTORIES ============
{
id: 'seak',
name: 'SEAK Expert Witness Directory',
url: 'https://www.seakexperts.com/',
urlDisplay: 'seakexperts.com',
tier: 2,
pricing: '$545/yr basic listing',
pricingTier: 'cheap',
flags: ['essential'],
blurb: 'The #1 rated expert witness directory in the industry. Free for attorneys to search. 2,000+ listed experts. Used by both plaintiff and defense counsel for credentialed expert searches.',
features: ['No middleman — attorneys contact you directly', 'Free attorney search', 'Money-back guarantee on listings', 'SEAK also offers expert witness training', 'Strong reputation among litigators'],
benefit: 'Best single directory choice if you can only pick one. Highest credibility signal, attorneys actually search it.',
feeds: ['Step 2 Get Listed']
},
{
id: 'jurispro',
name: 'JurisPro Expert Witness Directory',
url: 'https://www.jurispro.com/',
urlDisplay: 'jurispro.com',
tier: 2,
pricing: '$399/yr (multi-year discounts)',
pricingTier: 'cheap',
flags: ['essential'],
blurb: 'Long-standing directory founded by attorneys in 1999. Searchable by specialty, location, experience. Also indexed in LexisNexis. Volume play — moderate-quality leads but high name-recognition impact.',
features: ['Profiles include CV, photos, articles, audio/video', 'LexisNexis indexed (massive attorney reach)', 'Multi-year discounts', 'Lower-cost than SEAK or ALM', '25+ year reputation'],
benefit: 'Pair with SEAK for double coverage. The LexisNexis indexing means your name appears in the workflow attorneys are already using.',
feeds: ['Step 2 Get Listed']
},
{
id: 'experts-com',
name: 'Experts.com (ALM)',
url: 'https://www.experts.com/',
urlDisplay: 'experts.com',
tier: 2,
pricing: '$500–$1,000+/yr depending on tier',
pricingTier: 'cheap',
flags: [],
blurb: 'Broader-reach directory part of the ALM legal media network. Higher cost than JurisPro, frequently used by larger firms doing complex litigation searches.',
features: ['ALM legal network distribution', '15,000+ experts indexed', 'Court reporter + investigator + litigation support listings', 'Strong with AmLaw 200 firms'],
benefit: 'Higher cost but stronger value if your case complexity matches the firms searching here.',
feeds: ['Step 2 Get Listed']
},
{
id: 'forensisgroup',
name: 'ForensisGroup',
url: 'https://www.forensisgroup.com/',
urlDisplay: 'forensisgroup.com',
tier: 2,
pricing: 'Free to apply · % of fees on engagement',
pricingTier: 'free',
flags: ['free'],
blurb: 'Expert-matching service rather than directory. Attorneys submit case details; ForensisGroup matches with vetted experts. They take a markup (typically 30–40%) on retained engagements.',
features: ['No upfront cost', 'Pre-vetted expert pool', 'Active case-matching (not passive listing)', 'Speed-focused workflow'],
benefit: 'Zero downside to apply. They send you cases; you pay only when retained. Useful as a passive lead channel alongside direct directories.',
feeds: ['Step 2 Get Listed']
},
{
id: 'expert-institute',
name: 'The Expert Institute',
url: 'https://www.expertinstitute.com/',
urlDisplay: 'expertinstitute.com',
tier: 2,
pricing: 'Free to apply · Case-matched referral fees',
pricingTier: 'free',
flags: ['free'],
blurb: 'Case-matched referral service rather than open directory. Has researchers who pair attorneys with experts for specific cases. Strong technology and concierge-level service.',
features: ['Specialized researcher matchmaking', 'No upfront listing fee', 'Custom expert searches', 'Vetting + credential verification'],
benefit: 'Particularly strong for complex technical cases where attorneys want curation over self-search.',
feeds: ['Step 2 Get Listed']
},
{
id: 'hgexperts',
name: 'HG Experts',
url: 'https://www.hgexperts.com/',
urlDisplay: 'hgexperts.com',
tier: 2,
pricing: 'Listing fees vary',
pricingTier: 'cheap',
flags: [],
blurb: 'Mid-tier directory with moderate traffic and lower price point. Useful as a third or fourth directory listing for SEO surface area and name-recognition compounding.',
features: ['Specialty-categorized listings', 'Lower-cost listing tier', 'Geographic search support'],
benefit: 'The "diminishing returns" directory — adds incremental visibility without major investment.',
feeds: ['Step 2 Get Listed']
},
{
id: 'tasa',
name: 'TASA (Technical Advisory Service)',
url: 'https://www.tasanet.com/',
urlDisplay: 'tasanet.com',
tier: 2,
pricing: 'Application-based · Referral model',
pricingTier: 'free',
flags: [],
blurb: 'Long-running expert referral service (since 1956). Application-based admission. Active case-matching rather than passive directory.',
features: ['65+ year track record', 'Active case-matching workflow', 'Quality vetting', 'Technical specialty depth'],
benefit: 'Old-school, attorney-trusted referral source. Worth applying for if your specialty fits their roster.',
feeds: ['Step 2 Get Listed']
},
// ============ TIER 3 — LINKEDIN (THE FREE CHANNEL) ============
{
id: 'linkedin-free',
name: 'LinkedIn (Free)',
url: 'https://www.linkedin.com/',
urlDisplay: 'linkedin.com',
tier: 3,
pricing: 'Free',
pricingTier: 'free',
flags: ['essential', 'free'],
blurb: 'According to forensic-marketing veterans, LinkedIn produces more high-quality referrals than most paid directories. Free. Requires consistent posting of redacted case studies and technical insights.',
features: ['Direct attorney + adjuster reach', 'Case-study post format works exceptionally well', 'Free unlimited posting', 'Connection-based credibility', 'No platform fee'],
benefit: 'One veteran of 25+ years: "The best cases come from LinkedIn. Free." If you publish one redacted case study per week and engage with attorneys in your specialty, this outproduces $5K of directory listings.',
feeds: ['Step 3 Reciprocity', 'Step 5 Convert', 'Step 6 Compound']
},
{
id: 'linkedin-sales-nav',
name: 'LinkedIn Sales Navigator',
url: 'https://business.linkedin.com/sales-solutions/sales-navigator',
urlDisplay: 'linkedin.com/sales-solutions',
tier: 3,
pricing: 'Core $99/mo · Advanced $159/mo',
pricingTier: 'cheap',
flags: ['essential'],
blurb: 'The single highest-ROI tool for most professional-services solos. Search by job title (Claims Adjuster, Director of Claims, Subrogation Specialist), firm size, geography. Save searches, get alerts when new people fill those roles.',
features: ['Advanced filters (title, firm, geography, function)', 'Saved-search alerts (new hires in target roles)', 'Lead lists with CRM sync', '50 InMails/month on Core, 150 on Advanced', 'Account intelligence updates'],
benefit: 'Builds and works your Dream 100 with surgical precision. If you only buy one paid acquisition tool, this is it.',
feeds: ['Step 1 Identify', 'Step 5 Convert']
},
{
id: 'linkedin-recruiter-lite',
name: 'LinkedIn Recruiter Lite',
url: 'https://business.linkedin.com/talent-solutions/recruiter-lite',
urlDisplay: 'linkedin.com/talent-solutions',
tier: 3,
pricing: '$170/mo',
pricingTier: 'mid',
flags: ['niche'],
blurb: 'Sometimes overlooked alternative to Sales Navigator. Stronger boolean search, better hidden-profile access. Useful if you\'re also occasionally hiring associate engineers for your practice.',
features: ['Boolean + advanced search', '30 InMails/month', 'Profile insights beyond standard view', 'Talent pool analytics'],
benefit: 'Worth it only if you have dual use (research AND hiring). For pure prospecting, Sales Nav is cheaper and better-suited.',
feeds: ['Step 1 Identify']
},
// ============ TIER 4 — B2B CONTACT DATA ============
{
id: 'apollo',
name: 'Apollo.io',
url: 'https://www.apollo.io/',
urlDisplay: 'apollo.io',
tier: 4,
pricing: 'Free tier · Basic from $59/mo',
pricingTier: 'cheap',
flags: ['essential', 'free'],
blurb: 'B2B contact database with 275M+ contacts. Build targeted lists of insurance adjusters, defense attorneys, claims managers by title + firm + geography. Email + phone + LinkedIn on each.',
features: ['275M+ contact database', 'Filter by title, firm, geography, employee count', 'Email + phone + LinkedIn URLs', 'Built-in email sequencer', 'Free tier with 50 mobile credits/mo'],
benefit: 'The cheapest credible way to build a Dream 100 list with verified contact data. The free tier is enough to test the channel.',
feeds: ['Step 1 Identify', 'Step 5 Convert']
},
{
id: 'zoominfo',
name: 'ZoomInfo',
url: 'https://www.zoominfo.com/',
urlDisplay: 'zoominfo.com',
tier: 4,
pricing: 'Custom enterprise pricing (typically $15K+/yr)',
pricingTier: 'enterprise',
flags: ['enterprise'],
blurb: 'The B2B contact-data gold standard. Largest verified database, deepest firmographic detail, intent data layer. Pricing makes it overkill for solo practice.',
features: ['Deepest verified contact data', 'Firmographic + technographic filters', 'Intent data layer (who\'s researching what)', 'CRM integrations', 'Org chart visibility'],
benefit: 'For a multi-engineer firm with a sales function. Solos should use Apollo first.',
feeds: ['Step 1 Identify']
},
{
id: 'cognism',
name: 'Cognism',
url: 'https://www.cognism.com/',
urlDisplay: 'cognism.com',
tier: 4,
pricing: 'Custom pricing (typically $1,000+/mo)',
pricingTier: 'enterprise',
flags: ['enterprise'],
blurb: 'European-strong B2B data with phone-verified contacts and GDPR-compliance focus. Better than ZoomInfo for European data, weaker for US-only.',
features: ['Phone-verified mobile numbers', 'GDPR + CCPA compliance', 'Strong European coverage', 'Diamond-verified contact tier'],
benefit: 'Use only if you have European case work or specific phone-outreach intensity.',
feeds: ['Step 1 Identify']
},
{
id: 'clay',
name: 'Clay',
url: 'https://www.clay.com/',
urlDisplay: 'clay.com',
tier: 4,
pricing: 'Free tier · Starter from $149/mo',
pricingTier: 'mid',
flags: ['niche'],
blurb: 'Data-enrichment + workflow automation. Aggregates 75+ data providers. Power-user tool for building hyper-targeted Dream 100 workflows with AI-driven personalization.',
features: ['75+ data providers in one platform', 'AI-powered personalization at scale', 'Workflow automation', 'Spreadsheet-style interface', 'Steep learning curve'],
benefit: 'Overkill for most solo practices. Worth it for firms running systematic high-volume outreach.',
feeds: ['Step 1 Identify', 'Step 5 Convert']
},
// ============ TIER 5 — LEGAL & CASE INTELLIGENCE ============
{
id: 'pacer',
name: 'PACER',
url: 'https://pacer.uscourts.gov/',
urlDisplay: 'pacer.uscourts.gov',
tier: 5,
pricing: '$0.10/page · No subscription',
pricingTier: 'free',
flags: ['essential', 'free'],
blurb: 'Federal court records, public access. Search filings by case type, attorney, firm, jurisdiction. Identify which firms handle the case types your specialty serves.',
features: ['Public Access to Court Electronic Records', '$0.10/page (capped at $3/document)', 'No subscription required', 'Search by attorney, firm, case type', 'PACER Service Center direct access'],
benefit: 'Tells you exactly which attorneys filed which kinds of cases in your jurisdiction. The Dream 100 research foundation. Free until $30/quarter usage.',
feeds: ['Step 1 Identify']
},
{
id: 'justia',
name: 'Justia',
url: 'https://www.justia.com/',
urlDisplay: 'justia.com',
tier: 5,
pricing: 'Free',
pricingTier: 'free',
flags: ['free'],
blurb: 'Free legal research portal. Searchable case law, attorney directories, court dockets. Useful for identifying attorneys at specific firms handling specific case types.',
features: ['Case law search', 'Attorney + firm directory', 'Free dockets and decisions', 'No registration required for most features'],
benefit: 'Zero-cost first pass on identifying attorneys handling your case-type. Pair with LinkedIn to find them.',
feeds: ['Step 1 Identify']
},
{
id: 'westlaw',
name: 'Westlaw',
url: 'https://legal.thomsonreuters.com/en/products/westlaw',
urlDisplay: 'thomsonreuters.com/westlaw',
tier: 5,
pricing: 'Custom (typically $100–500+/mo)',
pricingTier: 'mid',
flags: [],
blurb: 'The professional legal research standard. Westlaw Profiler shows expert testimony history including who has cross-examined you, who has hired you, and outcomes.',
features: ['Expert Witness Profiler', 'Case-law + statutory research', 'Litigation history search', 'Daubert challenge tracker', 'Brief Bank'],
benefit: 'Worth subscribing once your testimony record is substantial. Lets you research opposing experts and identify firms with case-type fit.',
feeds: ['Step 1 Identify', 'Step 6 Compound']
},
{
id: 'casetext',
name: 'Casetext (CoCounsel)',
url: 'https://casetext.com/',
urlDisplay: 'casetext.com',
tier: 5,
pricing: 'CoCounsel from $400/mo',
pricingTier: 'mid',
flags: [],
blurb: 'AI-powered legal research now part of Thomson Reuters. CoCounsel handles complex queries about case law, expert challenges, and Daubert history.',
features: ['AI-powered legal queries', 'Brief drafting assistance', 'Case law search', 'Daubert/Frye history search'],
benefit: 'For practices that bill enough hours to justify research time. Solo experts can usually skip this for Justia + occasional Westlaw.',
feeds: ['Step 6 Compound']
},
{
id: 'lex-machina',
name: 'Lex Machina',
url: 'https://lexmachina.com/',
urlDisplay: 'lexmachina.com',
tier: 5,
pricing: 'Custom enterprise pricing',
pricingTier: 'enterprise',
flags: ['enterprise', 'niche'],
blurb: 'Litigation analytics platform. Shows which firms litigate which case types, win rates, judge tendencies. Useful for premium-tier Dream 100 targeting.',
features: ['Litigation outcome analytics', 'Firm-by-case-type analytics', 'Judge analytics', 'Patent + commercial + IP focus'],
benefit: 'Niche tool. Worth it if you have specific litigation-analytics needs and the budget. Most experts can skip.',
feeds: ['Step 1 Identify']
},
{
id: 'docket-alarm',
name: 'Docket Alarm',
url: 'https://www.docketalarm.com/',
urlDisplay: 'docketalarm.com',
tier: 5,
pricing: 'From $99/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'Court docket monitoring. Get alerts when new cases of your case-type are filed in your jurisdiction. Approach the firm before they\'ve hired an expert.',
features: ['New-case alerts by keyword + jurisdiction', 'Federal + state court coverage', 'API access', 'Cheaper than PACER for high-volume monitoring'],
benefit: 'For specialists in narrow case types (e.g., balcony collapse, VRF litigation), this turns case filings into outreach signals.',
feeds: ['Step 1 Identify']
},
// ============ TIER 6 — OUTREACH + CRM ============
{
id: 'hubspot-free',
name: 'HubSpot CRM (Free)',
url: 'https://www.hubspot.com/products/crm',
urlDisplay: 'hubspot.com/crm',
tier: 6,
pricing: 'Free forever',
pricingTier: 'free',
flags: ['essential', 'free'],
blurb: 'The free CRM that actually works for solo practices. Track every attorney contact, every case inquiry, every follow-up. Email integration, deal pipeline, no time limit.',
features: ['Truly free (not a trial)', 'Unlimited contacts', 'Email + Gmail integration', 'Deal pipeline visualization', 'Automatic activity logging'],
benefit: 'You need a CRM. This one is free, capable, and pre-integrated with Apollo, LinkedIn Sales Nav, and visitor-ID tools. Start here.',
feeds: ['Step 5 Convert', 'Step 6 Compound']
},
{
id: 'pipedrive',
name: 'Pipedrive',
url: 'https://www.pipedrive.com/',
urlDisplay: 'pipedrive.com',
tier: 6,
pricing: 'Essential $25/seat/mo · Advanced $49/seat/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'Pipeline-focused CRM. More opinionated than HubSpot — pushes you toward closing deals through stages. Good fit for the case-driven sales cycle of forensic engineering.',
features: ['Visual pipeline (drag-drop deal stages)', 'Email tracking + templates', 'Activity reminders', 'Mobile app polish', 'Fewer features than HubSpot but cleaner UX'],
benefit: 'Pick this over HubSpot if you prefer clean over feature-rich. Either is fine; pick one and use it.',
feeds: ['Step 5 Convert']
},
{
id: 'folk',
name: 'Folk CRM',
url: 'https://www.folk.app/',
urlDisplay: 'folk.app',
tier: 6,
pricing: 'Standard $20/seat/mo · Premium $40/seat/mo',
pricingTier: 'cheap',
flags: ['niche'],
blurb: 'Modern, relationship-focused CRM. Designed for people who think of contacts as relationships, not pipeline. Excellent LinkedIn + Gmail integration.',
features: ['Magic Email enrichment', 'LinkedIn Chrome extension', 'Relationship intelligence', 'Smart fields + automation', 'Notion-style flexibility'],
benefit: 'Best fit for an expert-witness practice where relationships compound across many cases over many years.',
feeds: ['Step 5 Convert', 'Step 6 Compound']
},
{
id: 'smartlead',
name: 'Smartlead',
url: 'https://www.smartlead.ai/',
urlDisplay: 'smartlead.ai',
tier: 6,
pricing: 'Basic $39/mo · Pro $94/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'Cold-email infrastructure. Multi-mailbox sending, deliverability optimization, AI personalization. The tool to use when sending Dream 100 outreach at meaningful volume.',
features: ['Unlimited email accounts (no per-mailbox fees)', 'Deliverability optimization (warm-up, throttling)', 'AI subject + body personalization', 'Reply detection + auto-pause', 'Built-in sequence editor'],
benefit: 'Cheaper than Lemlist or Instantly at scale. Better deliverability than HubSpot Sequences for cold outreach to attorneys.',
feeds: ['Step 5 Convert']
},
{
id: 'instantly',
name: 'Instantly',
url: 'https://instantly.ai/',
urlDisplay: 'instantly.ai',
tier: 6,
pricing: 'Hyper-Growth $97/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'Cold-email outreach platform with strong deliverability and AI features. Direct competitor to Smartlead. Pick whichever you can get a discount on.',
features: ['Unlimited email accounts on paid plans', 'Inbox warmup (Email Deliverability Network)', 'CRM-lite functionality', 'Sequence builder + AI personalization', 'B2B lead database (paid add-on)'],
benefit: 'Functionally equivalent to Smartlead. Pick based on UX preference and current promo pricing.',
feeds: ['Step 5 Convert']
},
{
id: 'lemlist',
name: 'Lemlist',
url: 'https://www.lemlist.com/',
urlDisplay: 'lemlist.com',
tier: 6,
pricing: 'Email Outreach $59/mo · Sales Engagement $99/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'Cold outreach with hyper-personalization (custom images, video, dynamic landing pages). Higher reply rates if you use the personalization features; otherwise overpriced.',
features: ['Custom image + video personalization', 'Liquid syntax dynamic content', 'AI campaign generator', 'Built-in 450M lead database', 'Strong deliverability tools'],
benefit: 'Worth premium only if you actually use the personalization. Otherwise Smartlead or Instantly is cheaper for the same outcome.',
feeds: ['Step 5 Convert']
},
// ============ TIER 7 — REPUTATION + CONTENT + ASSOCIATIONS ============
{
id: 'nafe',
name: 'NAFE Membership',
url: 'https://www.nafe.org/',
urlDisplay: 'nafe.org',
tier: 7,
pricing: '~$300–500/yr (membership tiers vary)',
pricingTier: 'cheap',
flags: ['essential'],
blurb: 'National Academy of Forensic Engineers. The professional society for forensic engineering. Member directory, journal publication opportunities, conferences attended by attorneys.',
features: ['Peer-reviewed journal (J. NAFE)', 'Member directory used by attorneys', 'Annual + regional conferences', 'Continuing education + certification', 'Strong credibility signal on CV'],
benefit: 'For a forensic engineer, NAFE is not optional. It\'s a credentialing baseline. Attorneys searching for "credentialed forensic engineer" will look here.',
feeds: ['Step 2 Get Listed', 'Step 7 Reputation']
},
{
id: 'ashrae',
name: 'ASHRAE Membership',
url: 'https://www.ashrae.org/',
urlDisplay: 'ashrae.org',
tier: 7,
pricing: 'Member $263/yr',
pricingTier: 'cheap',
flags: ['niche'],
blurb: 'For HVAC/VRF/mechanical specialists. Technical committee work and standards development create unmatched authority signal. Conference speaking lands directly in front of buyers.',
features: ['Technical committee membership', 'Standards-development authorship', 'Annual + winter conferences', 'Specialty certifications (BCxP, OPMP, etc.)', 'Member directory'],
benefit: 'For VRF litigation specifically, ASHRAE involvement is the single highest-trust signal a court will see. Worth the time investment.',
feeds: ['Step 7 Reputation']
},
{
id: 'nfpa',
name: 'NFPA Membership',
url: 'https://www.nfpa.org/',
urlDisplay: 'nfpa.org',
tier: 7,
pricing: 'Member ~$175/yr',
pricingTier: 'cheap',
flags: ['niche'],
blurb: 'National Fire Protection Association. Essential for fire-investigation specialists. NFPA 921 is the gold-standard methodology referenced in fire forensics testimony.',
features: ['NFPA 921 access + interpretation', 'Standards committees', 'Conference + training programs', 'Specialty journals', 'CFEI / CFI certifications path'],
benefit: 'For fire forensic engineering, NFPA is non-optional. Without NFPA 921 fluency, your testimony gets picked apart on cross.',
feeds: ['Step 7 Reputation']
},
{
id: 'asce',
name: 'ASCE Membership',
url: 'https://www.asce.org/',
urlDisplay: 'asce.org',
tier: 7,
pricing: 'Member $310/yr',
pricingTier: 'cheap',
flags: ['niche'],
blurb: 'American Society of Civil Engineers. Essential for structural / civil specialists. Forensic Engineering Division within ASCE is specifically attorney-facing.',
features: ['Forensic Engineering Division', 'Technical journal publishing', 'Continuing education', 'Specialty certifications (PE-related)', 'Standards documents'],
benefit: 'For structural failure work, ASCE FED visibility is direct attorney-facing reputation building.',
feeds: ['Step 7 Reputation']
},
{
id: 'sparktoro-pro',
name: 'SparkToro',
url: 'https://sparktoro.com/',
urlDisplay: 'sparktoro.com',
tier: 7,
pricing: 'Personal $38/mo · Business $112/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'Audience research. Type "insurance defense attorney" and SparkToro tells you which podcasts they listen to, what publications they read, who they follow on LinkedIn. Your earned-media targeting list.',
features: ['Audience clickstream analysis', 'Podcast / publication / social account discovery', 'Natural-language audience description', 'Podcast guest opportunities', 'Email newsletter analysis'],
benefit: 'Tells you exactly where to publish, where to guest-podcast, and who to connect with on LinkedIn. The Dream 100 amplifier.',
feeds: ['Step 5 Convert', 'Step 7 Reputation']
},
{
id: 'ali-cle',
name: 'ALI CLE',
url: 'https://www.ali-cle.org/',
urlDisplay: 'ali-cle.org',
tier: 7,
pricing: 'Speaker — variable; Attendee from $300/course',
pricingTier: 'mid',
flags: ['niche'],
blurb: 'American Law Institute Continuing Legal Education. Speak at one of their programs and you\'re directly in front of 100–500 practicing attorneys earning their CLE credits.',
features: ['Direct audience: practicing attorneys', 'CLE-credit-eligible content', 'Recorded distribution beyond live talk', 'High-credibility signal', 'Often paid speaker honoraria'],
benefit: 'A single ALI CLE talk on "Forensic Engineering for VRF Litigation" produces inbound case inquiries for years afterward.',
feeds: ['Step 7 Reputation']
},
{
id: 'state-bar-cle',
name: 'State Bar CLE Programs',
url: 'https://www.americanbar.org/cle/',
urlDisplay: 'americanbar.org/cle',
tier: 7,
pricing: 'Variable · Often free for speakers',
pricingTier: 'free',
flags: ['free', 'niche'],
blurb: 'State and local bar associations run CLE programs constantly. They need expert speakers; they pay either honoraria or just visibility. Direct path to the local Dream 100.',
features: ['Direct local-attorney audience', 'Often unpaid (visibility-based)', 'Attendee list available post-event', 'CLE-credit eligibility', 'Recurring speaking opportunities'],
benefit: 'Highest ROI per hour invested for local Dream 100 cultivation. Apply to every state bar in your geography.',
feeds: ['Step 7 Reputation']
},
{
id: 'wynter',
name: 'Wynter (Message Testing)',
url: 'https://wynter.com/',
urlDisplay: 'wynter.com',
tier: 7,
pricing: 'From ~$540/test',
pricingTier: 'mid',
flags: ['niche'],
blurb: 'On-demand B2B message testing. Get 12–48 hour feedback from a panel including legal/insurance professionals. Test your service-page copy against actual buyers before launching.',
features: ['Verified ICP panel (60K+ B2B professionals)', 'Job-title + industry targeting', '12–48 hour turnaround', 'Service-page + email message testing', 'Persona research'],
benefit: 'Most forensic engineers wouldn\'t think to test their service-page copy with actual attorneys. The ones who do convert better.',
feeds: ['Step 3 Reciprocity']
},
{
id: 'expertcommunications',
name: 'Expert Communications',
url: 'https://expertcommunications.com/',
urlDisplay: 'expertcommunications.com',
tier: 7,
pricing: 'Coaching packages from $1,000+',
pricingTier: 'mid',
flags: ['niche'],
blurb: 'Marketing consultancy specifically for expert witnesses. Resume + CV positioning, fee-setting strategy, deposition prep. Niche but proven for the practitioner who wants done-with-you positioning help.',
features: ['Expert-specific marketing strategy', 'CV positioning + rewriting', 'Fee-schedule strategy', 'Deposition + testimony prep', 'Referral-network introductions'],
benefit: 'Worth considering if you\'re past the technical excellence stage but stuck on positioning + fee-setting.',
feeds: ['Step 6 Compound']
}
];
// ============================================================================
// TIER METADATA
// ============================================================================
const TIERS = [
{ num: 1, id: 'tier-1', name: 'Website Visitor Identification', purpose: 'Tells you which firms are reading your service pages but haven\'t yet contacted you. <strong>This is the highest-leverage tool category for niche specialists</strong> — buyers research before they call. Feeds <span class="gate-ref">Step 4 Capture Intent</span>.' },
{ num: 2, id: 'tier-2', name: 'Expert Witness Directories', purpose: 'Where attorneys actually search at 11pm before depositions. Listing fees range from $399–$1,000/yr. The directories below are the ones attorneys verify and use. Feeds <span class="gate-ref">Step 2 Get Listed</span>.' },
{ num: 3, id: 'tier-3', name: 'LinkedIn — Free + Paid', purpose: 'According to one 25-year veteran of expert-witness consulting, "the best cases come from LinkedIn. Free." Sales Navigator amplifies this from organic to systematic. Feeds <span class="gate-ref">Step 1 Identify</span>, <span class="gate-ref">Step 5 Convert</span>.' },
{ num: 4, id: 'tier-4', name: 'B2B Contact Data', purpose: 'Build a Dream 100 list of named adjusters, attorneys, and claims managers with verified emails and phones. Apollo is the budget winner; ZoomInfo is the gold standard. Feeds <span class="gate-ref">Step 1 Identify</span>.' },
{ num: 5, id: 'tier-5', name: 'Legal & Case Intelligence', purpose: 'Court records and legal-research tools that tell you which firms handle which case types — so your outreach is targeted. PACER is functionally free. Feeds <span class="gate-ref">Step 1 Identify</span>.' },
{ num: 6, id: 'tier-6', name: 'Outreach + CRM', purpose: 'Once you have a Dream 100 list, work it. CRM tracks every attorney contact and follow-up. Cold email tools deliver outreach at meaningful volume without burning your domain. Feeds <span class="gate-ref">Step 5 Convert</span>.' },
{ num: 7, id: 'tier-7', name: 'Reputation, Content & Associations', purpose: 'The compounding layer. Association membership, CLE speaking, technical-committee work, message testing. None of these produce leads next week. All of them produce leads in 2027 and onward. Feeds <span class="gate-ref">Step 7 Reputation</span>.' }
];
// ============================================================================
// RENDER
// ============================================================================
function renderCatalog() {
const main = document.getElementById('catalog');
let html = '';
TIERS.forEach(tier => {
const tierTools = TOOLS.filter(t => t.tier === tier.num);
html += `
<section class="tier-section" id="${tier.id}" data-tier="${tier.num}">
<div class="tier-header">
<div class="tier-num">CHANNEL ${tier.num}</div>
<h2 class="tier-name">${tier.name}</h2>
<div class="tier-count">${tierTools.length} TOOL${tierTools.length !== 1 ? 'S' : ''}</div>
</div>
<p class="tier-purpose">${tier.purpose}</p>
<div class="tool-grid">
${tierTools.map((t, i) => renderToolCard(t, i)).join('')}
</div>
</section>
`;
});
main.innerHTML = html;
}
function renderToolCard(t, idx) {
const flagsHtml = (t.flags || []).map(f => {
const map = {
'essential': { cls: 'flag-essential', label: '★ ESSENTIAL' },
'enterprise': { cls: 'flag-enterprise', label: 'ENTERPRISE' },
'free': { cls: 'flag-free', label: 'FREE TIER' },
'niche': { cls: 'flag-niche', label: 'NICHE' }
};
const m = map[f];
return m ? `<span class="flag ${m.cls}">${m.label}</span>` : '';
}).join('');
const tierClass = t.pricingTier === 'enterprise' ? 'tier-enterprise' : '';
const featuresHtml = (t.features || []).map(f => `<li>${f}</li>`).join('');
return `
<article class="tool-card ${tierClass}"
data-tier="${t.tier}"
data-budget="${t.pricingTier}"
data-search="${(t.name + ' ' + t.blurb + ' ' + (t.features || []).join(' ') + ' ' + (t.benefit || '')).toLowerCase()}"
style="animation-delay: ${idx * 0.04}s">
<div class="tool-header">
<h3 class="tool-name"><a href="${t.url}" target="_blank" rel="noopener">${t.name}</a></h3>
<div class="tool-flags">${flagsHtml}</div>
</div>
<div class="tool-url">${t.urlDisplay}</div>
<div class="tool-pricing">
<span class="pricing-label">Cost</span>
<span class="pricing-value">${t.pricing}</span>
</div>
<p class="tool-description">${t.blurb}</p>
${t.features && t.features.length ? `
<div class="tool-section">
<h4>Key features</h4>
<ul>${featuresHtml}</ul>
</div>
` : ''}
${t.benefit ? `
<div class="tool-section">
<h4>Why it matters</h4>
<p>${t.benefit}</p>
</div>
` : ''}
<div class="tool-footer">
${(t.feeds || []).map(g => `<span class="gate-tag">${g}</span>`).join('')}
</div>
</article>
`;
}
// ============================================================================
// FILTERING
// ============================================================================
let activeFilters = { tier: 'all', budget: 'all', search: '' };
function applyFilters() {
const cards = document.querySelectorAll('.tool-card');
const tierSections = document.querySelectorAll('.tier-section');
let visibleCount = 0;
const visiblePerTier = {};
cards.forEach(card => {
const tier = card.dataset.tier;
const budget = card.dataset.budget;
const search = card.dataset.search;
const tierMatch = activeFilters.tier === 'all' || tier === activeFilters.tier;
const budgetMatch = activeFilters.budget === 'all' || budget === activeFilters.budget;
const searchMatch = !activeFilters.search || search.includes(activeFilters.search);
const show = tierMatch && budgetMatch && searchMatch;
card.classList.toggle('hidden', !show);
if (show) {
visibleCount++;
visiblePerTier[tier] = (visiblePerTier[tier] || 0) + 1;
}
});
tierSections.forEach(section => {
const tier = section.dataset.tier;
section.classList.toggle('hidden', !visiblePerTier[tier]);
});
document.getElementById('resultCount').textContent = visibleCount;
document.getElementById('noResults').classList.toggle('visible', visibleCount === 0);
}
document.querySelectorAll('.filter-btn').forEach(btn => {
btn.addEventListener('click', () => {
const type = btn.dataset.filterType;
const value = btn.dataset.filter;
activeFilters[type] = value;
document.querySelectorAll(`.filter-btn[data-filter-type="${type}"]`).forEach(b => {
b.classList.toggle('active', b === btn);
});
applyFilters();
});
});
document.getElementById('searchInput').addEventListener('input', e => {
activeFilters.search = e.target.value.trim().toLowerCase();
applyFilters();
});
document.querySelectorAll('.toc a').forEach(a => {
a.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(a.getAttribute('href'));
if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });
});
});
renderCatalog();
applyFilters();
console.log('Total tools loaded:', TOOLS.length);
</script>
</body>
</html>
Original asset: RISER-Marketing-Plan-Generator.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RISER Marketing Plan Generator · Find Your Customers</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter+Tight:[email protected]&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a;
--paper: #f7f4ee;
--paper-warm: #f0eadf;
--paper-deep: #e9e2d2;
--rule: #1a1a1a;
--red: #c9302a;
--red-deep: #8b1f1c;
--red-tint: #fbe8e6;
--red-soft: #f9d8d5;
--green: #1d6e3a;
--green-tint: #dcefe2;
--gold: #b8893a;
--gold-tint: #f5ead0;
--teal: #2c5f5a;
--teal-tint: #d8e6e4;
--muted: #5a564f;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: var(--sans);
background: var(--paper);
color: var(--ink);
line-height: 1.55;
font-size: 15px;
min-height: 100vh;
}
/* ============ MASTHEAD ============ */
.masthead {
border-bottom: 3px double var(--rule);
padding: 32px 32px 24px;
background: var(--paper);
}
.masthead-inner { max-width: 1100px; margin: 0 auto; }
.kicker {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 12px;
display: flex; align-items: center; gap: 14px;
}
.kicker::after { content: ''; flex: 1; height: 1px; background: var(--rule); opacity: 0.3; }
.title {
font-family: var(--serif);
font-weight: 600;
font-size: clamp(32px, 4.5vw, 50px);
line-height: 1.0;
letter-spacing: -0.025em;
margin-bottom: 12px;
}
.title em { font-style: italic; font-weight: 400; color: var(--red-deep); }
.subtitle {
font-family: var(--serif);
font-style: italic;
font-size: 17px;
color: var(--muted);
max-width: 740px;
line-height: 1.45;
}
/* ============ STAGE PROGRESS ============ */
.stages {
display: flex;
gap: 0;
margin-top: 22px;
border: 1.5px solid var(--rule);
background: var(--paper-warm);
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.stage-pill {
flex: 1;
padding: 10px 16px;
border-right: 1.5px solid var(--rule);
color: var(--muted);
display: flex;
align-items: center;
gap: 10px;
transition: background 0.2s, color 0.2s;
}
.stage-pill:last-child { border-right: none; }
.stage-pill .num {
width: 22px; height: 22px;
border: 1.5px solid currentColor;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 11px;
flex-shrink: 0;
}
.stage-pill.active {
background: var(--ink);
color: var(--paper);
font-weight: 700;
}
.stage-pill.complete {
background: var(--green-tint);
color: var(--green);
}
.stage-pill.complete .num { background: var(--green); color: var(--paper); border-color: var(--green); }
/* ============ MAIN ============ */
main { max-width: 1100px; margin: 0 auto; padding: 32px; }
.stage { display: none; }
.stage.active { display: block; }
.stage-header {
margin-bottom: 28px;
padding-bottom: 18px;
border-bottom: 2px solid var(--rule);
}
.stage-header h2 {
font-family: var(--serif);
font-size: 32px;
font-weight: 600;
letter-spacing: -0.02em;
margin-bottom: 6px;
line-height: 1.1;
}
.stage-header p {
font-family: var(--serif);
font-style: italic;
color: var(--muted);
font-size: 16px;
line-height: 1.45;
}
/* ============ FORMS ============ */
.field { margin-bottom: 24px; }
/* ============ PRIMARY FIELD — visual hierarchy for the profession input ============ */
.field-primary {
background: var(--paper-warm);
border: 1.5px solid var(--rule);
border-left: 4px solid var(--red-deep);
padding: 22px 24px 24px;
margin-bottom: 28px;
position: relative;
box-shadow: 4px 4px 0 var(--rule);
}
.field-primary .field-step-marker {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--gold);
font-weight: 700;
margin-bottom: 8px;
display: block;
}
.field-primary .field-label {
font-family: var(--serif);
font-size: 22px;
letter-spacing: -0.015em;
text-transform: none;
color: var(--ink);
font-weight: 600;
margin-bottom: 6px;
line-height: 1.2;
}
.field-primary .field-required {
color: var(--red-deep);
font-family: var(--serif);
font-weight: 700;
margin-left: 2px;
}
.field-primary .field-help {
font-size: 15px;
margin-bottom: 14px;
}
.field-primary .field-help strong {
color: var(--ink);
font-weight: 600;
font-style: normal;
}
.field-primary input[type="text"] {
font-size: 18px;
padding: 14px 18px;
border-width: 2px;
font-weight: 500;
background: var(--paper);
}
.field-primary input[type="text"]:focus {
border-color: var(--red-deep);
background: #fff;
box-shadow: 0 0 0 3px rgba(139, 31, 28, 0.08);
}
.field-label {
display: block;
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 8px;
}
.field-help {
font-family: var(--serif);
font-style: italic;
font-size: 14px;
color: var(--muted);
margin-bottom: 8px;
line-height: 1.45;
}
.input-wrap { position: relative; }
input[type="text"], textarea {
width: 100%;
padding: 12px 16px;
font-family: var(--sans);
font-size: 15px;
border: 1.5px solid var(--rule);
background: var(--paper);
color: var(--ink);
border-radius: 0;
transition: border-color 0.15s, background 0.15s;
}
input[type="text"]:focus, textarea:focus {
outline: none;
border-color: var(--red-deep);
background: #fff;
}
textarea { resize: vertical; min-height: 90px; line-height: 1.5; }
/* ============ AUTOCOMPLETE ============ */
.autocomplete-list {
position: absolute;
top: 100%; left: 0; right: 0;
background: var(--paper);
border: 1.5px solid var(--rule);
border-top: none;
max-height: 280px;
overflow-y: auto;
z-index: 30;
display: none;
box-shadow: 4px 4px 0 var(--rule);
}
.autocomplete-list.visible { display: block; }
.autocomplete-item {
padding: 9px 16px;
cursor: pointer;
font-size: 14px;
border-bottom: 1px dotted var(--muted);
}
.autocomplete-item:last-child { border-bottom: none; }
.autocomplete-item:hover, .autocomplete-item.highlighted {
background: var(--paper-warm);
color: var(--red-deep);
}
.autocomplete-item .match { font-weight: 600; }
/* ============ AVATAR PICKER ============ */
.avatar-toggle {
display: flex;
gap: 0;
margin-bottom: 16px;
border: 1.5px solid var(--rule);
}
.avatar-toggle button {
flex: 1;
padding: 11px 16px;
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.1em;
text-transform: uppercase;
background: var(--paper);
color: var(--ink);
border: none;
border-right: 1.5px solid var(--rule);
cursor: pointer;
transition: background 0.12s, color 0.12s;
font-weight: 600;
}
.avatar-toggle button:last-child { border-right: none; }
.avatar-toggle button.active { background: var(--ink); color: var(--paper); }
.avatar-toggle button:hover:not(.active) { background: var(--paper-warm); }
.archetype-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
margin-bottom: 16px;
}
@media (max-width: 700px) { .archetype-grid { grid-template-columns: 1fr; } }
.archetype-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 16px 18px;
cursor: pointer;
transition: transform 0.12s, box-shadow 0.12s, background 0.12s;
}
.archetype-card:hover {
transform: translateY(-2px);
box-shadow: 4px 4px 0 var(--rule);
background: var(--paper-warm);
}
.archetype-card.selected {
background: var(--gold-tint);
border-color: var(--red-deep);
box-shadow: 4px 4px 0 var(--red-deep);
transform: translateY(-2px);
}
.archetype-card h4 {
font-family: var(--serif);
font-size: 17px;
font-weight: 600;
letter-spacing: -0.01em;
margin-bottom: 6px;
line-height: 1.2;
}
.archetype-card p {
font-size: 13px;
color: var(--muted);
line-height: 1.45;
}
/* ============ BUTTONS ============ */
.btn-row {
display: flex;
gap: 12px;
margin-top: 28px;
flex-wrap: wrap;
align-items: center;
}
.btn {
font-family: var(--mono);
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 12px 22px;
border: 1.5px solid var(--rule);
background: var(--paper);
color: var(--ink);
cursor: pointer;
transition: all 0.12s;
font-weight: 600;
}
.btn:hover:not(:disabled) {
background: var(--ink);
color: var(--paper);
}
.btn:disabled { opacity: 0.35; cursor: not-allowed; background: var(--paper-deep) !important; color: var(--muted) !important; border-color: var(--muted) !important; }
.btn-primary {
background: var(--red-deep);
color: var(--paper);
border-color: var(--red-deep);
}
.btn-primary:hover:not(:disabled) {
background: var(--red);
border-color: var(--red);
}
.btn-ghost { border-color: var(--muted); color: var(--muted); }
/* ============ STATUS BANNERS ============ */
.banner {
padding: 14px 18px;
font-size: 14px;
border-left: 4px solid;
margin-bottom: 20px;
font-family: var(--serif);
line-height: 1.5;
}
.banner-info { background: var(--teal-tint); border-color: var(--teal); color: var(--teal); }
.banner-warn { background: var(--red-tint); border-color: var(--red-deep); color: var(--red-deep); }
.banner-success { background: var(--green-tint); border-color: var(--green); color: var(--green); }
.banner strong { font-weight: 700; }
/* ============ API KEY INPUT ============ */
.api-key-section {
margin-top: 24px;
padding: 20px;
background: var(--paper-warm);
border: 1.5px solid var(--rule);
}
.api-key-section h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 8px;
}
.api-key-section p {
font-size: 13px;
color: var(--muted);
margin-bottom: 12px;
line-height: 1.45;
}
.api-key-section input[type="password"] {
width: 100%;
padding: 10px 14px;
font-family: var(--mono);
font-size: 13px;
border: 1.5px solid var(--rule);
background: var(--paper);
}
.api-key-section input[type="password"]:focus {
outline: none;
border-color: var(--red-deep);
}
.api-key-section .toggle-row {
display: flex;
gap: 14px;
align-items: center;
margin-top: 10px;
font-size: 13px;
}
.api-key-section a { color: var(--red-deep); }
.model-toggle {
display: flex;
gap: 8px;
margin-top: 12px;
}
.model-toggle button {
flex: 1;
padding: 8px 12px;
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
background: var(--paper);
border: 1.5px solid var(--rule);
cursor: pointer;
font-weight: 600;
}
.model-toggle button.active { background: var(--ink); color: var(--paper); }
/* ============ LOADING ============ */
.loading-state {
text-align: center;
padding: 60px 20px;
font-family: var(--serif);
font-style: italic;
font-size: 18px;
color: var(--muted);
}
.loading-state .dots { display: inline-block; min-width: 24px; }
.loading-state .step-text {
font-family: var(--mono);
font-style: normal;
font-size: 11px;
letter-spacing: 0.1em;
text-transform: uppercase;
margin-top: 16px;
color: var(--red-deep);
font-weight: 600;
}
/* ============ PRINT STYLES ============ */
@media print {
body { background: #fff; color: #000; font-size: 11pt; }
.masthead { padding: 12px 0 8px; border-bottom: 2px solid #000; }
.masthead .stages, .controls-bar, .toc, footer, .api-key-section,
.stage:not(#stage-plan), .stage-pill, #plan-actions, #plan-loading,
.scan-buttons-wrap, .saved-plans, #setup-hint { display: none !important; }
.stage#stage-plan { display: block !important; }
.stage#stage-plan .stage-header { margin-bottom: 14px; padding-bottom: 8px; }
.title { font-size: 26pt; margin-bottom: 4pt; }
.subtitle { font-size: 11pt; }
.kicker { font-size: 9pt; }
main { padding: 0; max-width: 100%; }
.plan-summary {
background: #fff !important;
border: 1.5px solid #000 !important;
padding: 12px 14px;
margin-bottom: 14px;
page-break-after: avoid;
}
.plan-summary .profession { font-size: 16pt; }
.plan-summary .avatar { font-size: 11pt; }
.plan-section {
background: #fff !important;
border: 1px solid #555 !important;
padding: 12px 14px;
margin-bottom: 12px;
page-break-inside: avoid;
break-inside: avoid;
}
.plan-section h3 { font-size: 15pt; }
.plan-section p, .plan-section li { font-size: 10.5pt; }
.plan-section-num { color: #000 !important; }
.pain-quote {
background: #f5f5f5 !important;
border-left: 2px solid #000 !important;
font-size: 10.5pt;
page-break-inside: avoid;
}
.pain-meta { color: #555 !important; }
.copy-block {
background: #f5f5f5 !important;
border-left: 2px solid #000 !important;
font-size: 10.5pt;
page-break-inside: avoid;
}
.cadence-grid {
grid-template-columns: 1fr 1fr 1fr !important;
gap: 8px;
}
.cadence-card {
background: #fff !important;
border: 1px solid #555 !important;
padding: 10px 12px;
}
.channel-priority { padding: 6px 0; page-break-inside: avoid; }
.channel-rank { font-size: 22pt; min-width: 30px; color: #000 !important; }
.channel-name { font-size: 13pt; }
.channel-reason { font-size: 10.5pt; }
.caveat-box {
background: #f5f5f5 !important;
border-left: 2px solid #000 !important;
font-size: 10pt;
color: #000 !important;
page-break-inside: avoid;
}
.script-card {
background: #fff !important;
border: 1px solid #555 !important;
page-break-inside: avoid;
}
/* Hide URLs after links to keep clean */
a[href]:after { content: '' !important; }
/* Print banner */
@page { margin: 0.6in; size: letter; }
}
.dot { animation: pulse-dot 1.4s infinite ease-in-out; display: inline-block; }
.dot:nth-child(2) { animation-delay: 0.2s; }
.dot:nth-child(3) { animation-delay: 0.4s; }
@keyframes pulse-dot { 0%, 80%, 100% { opacity: 0.3; } 40% { opacity: 1; } }
/* ============ PLAN OUTPUT ============ */
.plan-summary {
background: var(--paper-warm);
border: 1.5px solid var(--rule);
padding: 24px;
margin-bottom: 28px;
}
.plan-summary h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 8px;
}
.plan-summary .profession {
font-family: var(--serif);
font-size: 22px;
font-weight: 600;
letter-spacing: -0.01em;
margin-bottom: 4px;
}
.plan-summary .avatar {
font-family: var(--serif);
font-style: italic;
color: var(--muted);
font-size: 16px;
line-height: 1.5;
}
.plan-section {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 24px 26px;
margin-bottom: 18px;
}
.plan-section-header {
display: flex;
align-items: baseline;
gap: 14px;
margin-bottom: 14px;
border-bottom: 1.5px solid var(--rule);
padding-bottom: 10px;
}
.plan-section-num {
font-family: var(--mono);
font-size: 11px;
font-weight: 700;
color: var(--red-deep);
letter-spacing: 0.1em;
}
.plan-section h3 {
font-family: var(--serif);
font-size: 24px;
font-weight: 600;
letter-spacing: -0.015em;
flex: 1;
line-height: 1.2;
}
.plan-section p {
font-family: var(--serif);
font-size: 15px;
line-height: 1.55;
margin-bottom: 12px;
}
.plan-section ul, .plan-section ol {
margin: 8px 0 12px 0;
padding-left: 0;
list-style: none;
}
.plan-section li {
padding-left: 18px;
position: relative;
margin-bottom: 8px;
font-size: 15px;
line-height: 1.5;
}
.plan-section li::before {
content: '→';
position: absolute;
left: 0;
color: var(--gold);
font-weight: 700;
}
.plan-section .pain-quote {
font-family: var(--serif);
font-style: italic;
font-size: 16px;
border-left: 3px solid var(--red-deep);
padding: 8px 14px;
margin: 10px 0;
background: var(--paper-warm);
line-height: 1.45;
}
.plan-section .pain-meta {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.06em;
color: var(--muted);
text-transform: uppercase;
margin-top: 4px;
}
.cadence-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 14px;
margin-top: 14px;
}
@media (max-width: 700px) { .cadence-grid { grid-template-columns: 1fr; } }
.cadence-card {
background: var(--paper-warm);
border: 1.5px solid var(--rule);
padding: 16px 18px;
}
.cadence-card h5 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 10px;
}
.cadence-card ul { margin: 0; }
.channel-priority {
display: flex;
align-items: flex-start;
gap: 14px;
padding: 12px 0;
border-bottom: 1px dashed var(--muted);
}
.channel-priority:last-child { border-bottom: none; }
.channel-rank {
font-family: var(--serif);
font-size: 32px;
font-weight: 700;
color: var(--red-deep);
line-height: 1;
flex-shrink: 0;
min-width: 40px;
}
.channel-name {
font-family: var(--serif);
font-size: 18px;
font-weight: 600;
margin-bottom: 4px;
letter-spacing: -0.01em;
}
.channel-reason {
font-size: 14px;
line-height: 1.5;
color: var(--ink);
}
.copy-block {
background: var(--paper-warm);
border-left: 3px solid var(--gold);
padding: 14px 18px;
margin: 10px 0;
font-family: var(--serif);
font-size: 16px;
line-height: 1.55;
font-style: italic;
}
.caveat-box {
background: var(--red-tint);
border-left: 3px solid var(--red-deep);
padding: 12px 18px;
margin: 14px 0;
font-family: var(--serif);
font-size: 14px;
line-height: 1.5;
}
.caveat-box strong { font-weight: 600; color: var(--red-deep); }
/* ============ SCRIPT CARDS ============ */
.script-card {
background: var(--paper-warm);
border: 1.5px solid var(--rule);
margin-bottom: 14px;
overflow: hidden;
}
.script-card:last-child { margin-bottom: 0; }
.script-header {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 16px;
border-bottom: 1.5px solid var(--rule);
background: var(--paper);
}
.script-channel-num {
font-family: var(--serif);
font-weight: 700;
font-size: 22px;
color: var(--red-deep);
width: 30px;
text-align: center;
flex-shrink: 0;
line-height: 1;
}
.script-card h4 {
font-family: var(--serif);
font-size: 18px;
font-weight: 600;
letter-spacing: -0.01em;
flex: 1;
margin: 0;
line-height: 1.2;
}
.copy-btn {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
font-weight: 600;
padding: 6px 12px;
border: 1.5px solid var(--rule);
background: var(--paper);
color: var(--ink);
cursor: pointer;
transition: all 0.12s;
}
.copy-btn:hover { background: var(--ink); color: var(--paper); }
.copy-btn.copied { background: var(--green); color: var(--paper); border-color: var(--green); }
.script-body {
padding: 14px 18px;
font-family: var(--serif);
font-size: 14.5px;
line-height: 1.55;
white-space: pre-wrap;
color: var(--ink);
}
/* ============ SCAN BUTTONS ============ */
.scan-buttons-wrap {
background: var(--paper-warm);
border: 1.5px solid var(--rule);
padding: 18px 20px;
margin-bottom: 18px;
}
.scan-buttons-wrap h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 6px;
}
.scan-buttons-wrap .scan-help {
font-family: var(--serif);
font-style: italic;
font-size: 14px;
color: var(--muted);
margin-bottom: 14px;
line-height: 1.45;
}
.scan-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 10px;
}
.scan-btn {
display: flex;
align-items: center;
gap: 10px;
padding: 11px 14px;
background: var(--paper);
border: 1.5px solid var(--rule);
text-decoration: none;
color: var(--ink);
font-family: var(--sans);
font-size: 13px;
cursor: pointer;
transition: all 0.12s;
}
.scan-btn:hover {
background: var(--ink);
color: var(--paper);
transform: translateY(-1px);
box-shadow: 3px 3px 0 var(--gold);
}
.scan-btn .scan-icon {
font-family: var(--mono);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.1em;
color: var(--red-deep);
flex-shrink: 0;
width: 28px;
}
.scan-btn:hover .scan-icon { color: var(--gold); }
.scan-btn .scan-label {
font-weight: 600;
letter-spacing: -0.01em;
flex: 1;
}
.scan-btn .scan-arrow {
font-size: 14px;
color: var(--muted);
}
.scan-btn:hover .scan-arrow { color: var(--paper); }
/* ============ SAVED PLANS ============ */
.saved-plans {
margin-top: 24px;
padding-top: 20px;
border-top: 1px solid var(--rule);
}
.saved-plans h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
font-weight: 700;
margin-bottom: 12px;
}
.saved-plan-item {
padding: 10px 14px;
background: var(--paper);
border: 1px solid var(--muted);
margin-bottom: 8px;
display: flex;
justify-content: space-between;
gap: 12px;
align-items: center;
cursor: pointer;
transition: background 0.12s, border-color 0.12s;
}
.saved-plan-item:hover { background: var(--paper-warm); border-color: var(--rule); }
.saved-plan-info { flex: 1; min-width: 0; }
.saved-plan-info .sp-prof {
font-family: var(--serif);
font-weight: 600;
font-size: 15px;
margin-bottom: 2px;
}
.saved-plan-info .sp-avt {
font-size: 12px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.saved-plan-actions { display: flex; gap: 6px; }
.sp-btn {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 5px 9px;
border: 1px solid var(--muted);
background: var(--paper);
cursor: pointer;
}
.sp-btn:hover { background: var(--ink); color: var(--paper); border-color: var(--ink); }
/* ============ FOOTER ============ */
footer {
border-top: 3px double var(--rule);
padding: 30px 32px 50px;
background: var(--paper);
margin-top: 60px;
}
.footer-inner {
max-width: 1100px;
margin: 0 auto;
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.04em;
color: var(--muted);
line-height: 1.7;
}
.footer-inner strong { color: var(--ink); font-weight: 700; }
</style>
</head>
<body>
<header class="masthead">
<div class="masthead-inner">
<div class="kicker">RISER Captain's Logic · Marketing Plan Generator · v1</div>
<h1 class="title">Find Your Customers <em>·</em> Build the Plan</h1>
<p class="subtitle">Tell me your profession and your target buyer. I'll return a real marketing plan — pain points in your buyer's words, the channels that actually work for your niche, a 90-day rollout, and the offer angle. Built on Hormozi, Brunson, Cialdini, and operator's discipline. No generic advice.</p>
<div class="stages">
<div class="stage-pill active" data-stage="setup"><span class="num">1</span><span>Profession & Avatar</span></div>
<div class="stage-pill" data-stage="sharpen"><span class="num">2</span><span>Sharpen the Brief</span></div>
<div class="stage-pill" data-stage="plan"><span class="num">3</span><span>The Plan</span></div>
</div>
</div>
</header>
<main>
<!-- ========== STAGE 1: SETUP ========== -->
<section class="stage active" id="stage-setup">
<div class="stage-header">
<h2>Stage 1 — Profession & Avatar</h2>
<p>The avatar matters more than the profession. A tax attorney serving small business owners needs a fundamentally different plan than one serving HNW individuals — same profession, totally different acquisition channel.</p>
</div>
<div class="field field-primary">
<div class="field-step-marker">Step 1 of 3 · The Foundation</div>
<label class="field-label" for="profession">Your Profession <span class="field-required">*</span></label>
<p class="field-help">Type the specific work you do. Suggestions appear as you type — pick one or just keep typing whatever describes your practice. <strong>The more specific, the sharper the plan.</strong></p>
<div class="input-wrap">
<input type="text" id="profession" placeholder="e.g. Forensic engineer specializing in HVAC failure analysis" autocomplete="off">
<div class="autocomplete-list" id="autocomplete"></div>
</div>
</div>
<div class="field">
<label class="field-label">Your Target Avatar</label>
<p class="field-help">Who specifically pays you? Be precise — title, industry, firm size, geography, the moment they need you. If you don't know yet, click "Show me archetypes" to see realistic options for your profession.</p>
<div class="avatar-toggle">
<button id="toggle-describe" class="active">Describe my avatar</button>
<button id="toggle-pick">Show me archetypes</button>
</div>
<div id="avatar-describe-panel">
<textarea id="avatar-text" placeholder="e.g. Insurance defense attorneys at mid-sized firms in Arizona handling commercial property subrogation cases involving HVAC/VRF failures. Senior associates and junior partners, billing $400-650/hr. They need credentialed experts who can write Daubert-defensible reports in 10-14 days."></textarea>
</div>
<div id="avatar-pick-panel" style="display: none;">
<p class="field-help" style="margin-top: 0;">Click <strong>Show archetypes</strong> below to see four realistic buyer types for your profession. Pick one or use it as a starting point.</p>
<button class="btn btn-primary" id="generate-archetypes" style="margin-bottom: 14px;">Show archetypes</button>
<div class="archetype-grid" id="archetype-grid"></div>
</div>
</div>
<!-- API key section -->
<div class="api-key-section">
<h3>Anthropic API Key</h3>
<p>This widget calls the Anthropic API directly from your browser. Your key is stored only in your browser's localStorage — never sent anywhere except Anthropic. <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noopener">Get a key here</a> if you don't have one.</p>
<input type="password" id="api-key" placeholder="sk-ant-…" autocomplete="off">
<div class="model-toggle">
<button id="model-sonnet" class="active" data-model="claude-sonnet-4-6">Sonnet 4.6 (faster · cheaper)</button>
<button id="model-opus" data-model="claude-opus-4-7">Opus 4.7 (highest quality)</button>
</div>
<div class="toggle-row">
<label><input type="checkbox" id="remember-key" checked> Remember key in this browser</label>
</div>
</div>
<div class="btn-row">
<button class="btn btn-primary" id="to-stage-2" disabled>Continue to Sharpen →</button>
</div>
<div id="setup-hint" style="font-family: var(--mono); font-size: 11px; letter-spacing: 0.06em; color: var(--red-deep); margin-top: 12px; padding: 10px 14px; background: var(--red-tint); border-left: 3px solid var(--red-deep); display: none;"></div>
<div class="saved-plans" id="saved-plans-list" style="display: none;">
<h3>Your saved plans</h3>
<div id="saved-plans-content"></div>
</div>
</section>
<!-- ========== STAGE 2: SHARPEN ========== -->
<section class="stage" id="stage-sharpen">
<div class="stage-header">
<h2>Stage 2 — Sharpen the Brief</h2>
<p>Four questions that adapt to your profession and avatar. They're not optional — the answers decide whether you get a generic plan or a real one.</p>
</div>
<div class="banner banner-info" id="sharpen-banner" style="display: none;">
<strong>Generating sharpening questions for your specific situation…</strong>
</div>
<div id="sharpen-questions"></div>
<div class="btn-row">
<button class="btn btn-ghost" id="back-to-1">← Back</button>
<button class="btn btn-primary" id="to-stage-3" disabled>Generate the plan →</button>
</div>
</section>
<!-- ========== STAGE 3: PLAN ========== -->
<section class="stage" id="stage-plan">
<div class="stage-header">
<h2>Stage 3 — Your Marketing Plan</h2>
<p>Generated from your inputs. Save it. Print it. Tape it to the wall. Walk it for 90 days before deciding what's working.</p>
</div>
<div id="plan-loading" class="loading-state" style="display: none;">
<div><span class="dot">•</span><span class="dot">•</span><span class="dot">•</span></div>
<div class="step-text" id="loading-step">Reading your brief…</div>
</div>
<div id="plan-content"></div>
<div class="btn-row" id="plan-actions" style="display: none;">
<button class="btn btn-ghost" id="back-to-2">← Adjust inputs</button>
<button class="btn" id="save-plan">Save this plan</button>
<button class="btn" id="print-plan">Print</button>
<button class="btn btn-primary" id="new-plan">New plan</button>
</div>
</section>
</main>
<footer>
<div class="footer-inner">
<strong>RISER Captain's Logic</strong> · Marketing Plan Generator v1 · April 2026 · Powered by Anthropic Claude API · Plans are AI-generated suggestions grounded in marketing fundamentals (Hormozi, Brunson, Cialdini, Schwartz). They are not guarantees, ROI projections, or substitutes for testing in your real market. Verify recommendations before investing time or money. No fabricated firm names, fake metrics, or invented case studies are produced — when the model lacks niche knowledge, it says so.
</div>
</footer>
<script>
'use strict';
// =========================================================================
// PROFESSION AUTOCOMPLETE LIST — ~80 common B2B/professional services
// =========================================================================
const PROFESSIONS = [
// Forensic & Engineering
"Forensic engineer", "Forensic engineer specializing in HVAC/VRF systems",
"Forensic engineer specializing in fire investigation",
"Forensic engineer specializing in structural failure",
"Forensic engineer specializing in vehicle accident reconstruction",
"Forensic accountant", "Structural engineer", "Civil engineer",
"Mechanical engineer", "Electrical engineer", "Geotechnical engineer",
"Building envelope consultant", "MEP design consultant",
// Legal-adjacent / Expert Witness
"Expert witness consultant", "Litigation support specialist",
"Medical-legal consultant", "Vocational rehabilitation expert",
"Economic damages expert", "Premises liability expert",
// Healthcare consulting
"Independent medical examiner", "Medical chart review consultant",
"Healthcare compliance consultant", "Medical practice consultant",
// Trades & Inspection
"Home inspector", "Commercial building inspector",
"Industrial hygienist", "Environmental site assessor",
"Mold remediation specialist", "Asbestos consultant",
// Tax & Financial
"Tax attorney", "Estate planning attorney",
"Tax attorney serving high-net-worth individuals",
"Tax attorney serving small businesses",
"CPA serving small businesses", "CPA serving startups",
"Financial advisor for physicians", "Financial advisor for tech executives",
"Wealth manager", "Insurance broker", "Commercial insurance broker",
// Marketing & Creative
"Brand strategist", "Marketing consultant for SaaS startups",
"Marketing consultant for law firms", "Marketing consultant for medical practices",
"Wedding photographer", "Commercial photographer",
"Brand designer", "UX/UI designer", "Web designer for small businesses",
"Copywriter for B2B SaaS", "Direct response copywriter",
// Tech consulting
"Cybersecurity consultant", "DevOps consultant",
"Cloud migration consultant", "Data engineering consultant",
"AI/ML consultant", "IT consultant for small businesses",
// HR & Recruiting
"Executive recruiter", "Technical recruiter",
"Compensation consultant", "HR consultant for startups",
// Real Estate
"Commercial real estate broker", "Industrial real estate broker",
"Real estate agent serving luxury market",
"Property manager for multi-family",
// Coaching & Training
"Executive coach", "Sales trainer", "Leadership development consultant",
"Public speaking coach",
// Manufacturing & Industrial
"Manufacturing process consultant", "Lean manufacturing consultant",
"Quality assurance consultant", "Supply chain consultant",
// Construction
"General contractor for high-end residential",
"Construction defect consultant", "Construction project manager",
// Architecture & Design
"Residential architect", "Commercial architect",
"Interior designer for hospitality",
"Landscape architect"
];
// =========================================================================
// STATE
// =========================================================================
let state = {
profession: '',
avatar: '',
avatarMode: 'describe', // 'describe' or 'pick'
selectedArchetype: null,
archetypes: [],
sharpening: {}, // { question_id: answer }
sharpeningQuestions: [],
plan: null,
apiKey: '',
model: 'claude-sonnet-4-6'
};
// Load saved key if present
const savedKey = localStorage.getItem('riser_anthropic_key');
if (savedKey) {
state.apiKey = savedKey;
document.getElementById('api-key').value = savedKey;
}
// =========================================================================
// AUTOCOMPLETE
// =========================================================================
const profInput = document.getElementById('profession');
const acList = document.getElementById('autocomplete');
let acHighlight = -1;
function escapeHtml(s) {
return String(s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
}
function renderAutocomplete(query) {
if (!query || query.length < 2) { acList.classList.remove('visible'); return; }
const q = query.toLowerCase();
const matches = PROFESSIONS.filter(p => p.toLowerCase().includes(q)).slice(0, 8);
if (matches.length === 0) { acList.classList.remove('visible'); return; }
acList.innerHTML = matches.map((p, i) => {
const idx = p.toLowerCase().indexOf(q);
const before = escapeHtml(p.slice(0, idx));
const match = escapeHtml(p.slice(idx, idx + q.length));
const after = escapeHtml(p.slice(idx + q.length));
return `<div class="autocomplete-item" data-idx="${i}">${before}<span class="match">${match}</span>${after}</div>`;
}).join('');
acList.classList.add('visible');
acHighlight = -1;
acList.querySelectorAll('.autocomplete-item').forEach((el, i) => {
el.addEventListener('mousedown', e => {
e.preventDefault();
profInput.value = matches[i];
state.profession = matches[i];
acList.classList.remove('visible');
checkSetupComplete();
});
});
}
profInput.addEventListener('input', e => {
state.profession = e.target.value.trim();
renderAutocomplete(state.profession);
checkSetupComplete();
});
profInput.addEventListener('blur', () => {
setTimeout(() => acList.classList.remove('visible'), 150);
});
profInput.addEventListener('keydown', e => {
const items = acList.querySelectorAll('.autocomplete-item');
if (!items.length || !acList.classList.contains('visible')) return;
if (e.key === 'ArrowDown') {
e.preventDefault();
acHighlight = Math.min(acHighlight + 1, items.length - 1);
} else if (e.key === 'ArrowUp') {
e.preventDefault();
acHighlight = Math.max(acHighlight - 1, -1);
} else if (e.key === 'Enter' && acHighlight >= 0) {
e.preventDefault();
items[acHighlight].dispatchEvent(new MouseEvent('mousedown'));
return;
} else if (e.key === 'Escape') {
acList.classList.remove('visible');
return;
}
items.forEach((el, i) => el.classList.toggle('highlighted', i === acHighlight));
});
// =========================================================================
// AVATAR TOGGLE
// =========================================================================
const tgDescribe = document.getElementById('toggle-describe');
const tgPick = document.getElementById('toggle-pick');
const panelDescribe = document.getElementById('avatar-describe-panel');
const panelPick = document.getElementById('avatar-pick-panel');
const avatarText = document.getElementById('avatar-text');
tgDescribe.addEventListener('click', () => {
state.avatarMode = 'describe';
tgDescribe.classList.add('active');
tgPick.classList.remove('active');
panelDescribe.style.display = 'block';
panelPick.style.display = 'none';
state.selectedArchetype = null;
checkSetupComplete();
});
tgPick.addEventListener('click', () => {
state.avatarMode = 'pick';
tgPick.classList.add('active');
tgDescribe.classList.remove('active');
panelDescribe.style.display = 'none';
panelPick.style.display = 'block';
state.avatar = '';
checkSetupComplete();
});
avatarText.addEventListener('input', e => {
state.avatar = e.target.value.trim();
checkSetupComplete();
});
// =========================================================================
// API KEY + MODEL
// =========================================================================
document.getElementById('api-key').addEventListener('input', e => {
state.apiKey = e.target.value.trim();
if (document.getElementById('remember-key').checked && state.apiKey) {
localStorage.setItem('riser_anthropic_key', state.apiKey);
}
checkSetupComplete();
});
document.getElementById('remember-key').addEventListener('change', e => {
if (e.target.checked && state.apiKey) {
localStorage.setItem('riser_anthropic_key', state.apiKey);
} else {
localStorage.removeItem('riser_anthropic_key');
}
});
document.querySelectorAll('.model-toggle button').forEach(b => {
b.addEventListener('click', () => {
document.querySelectorAll('.model-toggle button').forEach(x => x.classList.remove('active'));
b.classList.add('active');
state.model = b.dataset.model;
});
});
// =========================================================================
// CHECK STATE → ENABLE BUTTONS
// =========================================================================
function checkSetupComplete() {
const hasProfession = state.profession.length >= 4;
const hasAvatar = state.avatarMode === 'describe' ? state.avatar.length >= 20
: state.selectedArchetype !== null;
const hasKey = state.apiKey.length >= 20;
const ok = hasProfession && hasAvatar && hasKey;
document.getElementById('to-stage-2').disabled = !ok;
// Show what's missing
const hint = document.getElementById('setup-hint');
if (hint) {
if (ok) {
hint.style.display = 'none';
} else {
const missing = [];
if (!hasProfession) missing.push('Profession (need at least 4 characters)');
if (!hasAvatar) {
missing.push(state.avatarMode === 'describe'
? 'Avatar description (need at least 20 characters)'
: 'Avatar archetype (click one of the cards to select)');
}
if (!hasKey) missing.push('Anthropic API key (need at least 20 characters)');
hint.textContent = 'Still needed: ' + missing.join(' · ');
hint.style.display = 'block';
}
}
}
// =========================================================================
// ARCHETYPE GENERATION
// =========================================================================
const generateBtn = document.getElementById('generate-archetypes');
const archetypeGrid = document.getElementById('archetype-grid');
generateBtn.addEventListener('click', async () => {
if (!state.profession || state.profession.length < 4) {
alert('Enter your profession first.');
return;
}
if (!state.apiKey) {
alert('Enter your Anthropic API key first.');
return;
}
generateBtn.disabled = true;
generateBtn.textContent = 'Thinking…';
archetypeGrid.innerHTML = '';
try {
const archetypes = await fetchArchetypes(state.profession);
state.archetypes = archetypes;
renderArchetypes(archetypes);
generateBtn.textContent = 'Refresh archetypes';
generateBtn.disabled = false;
} catch (err) {
archetypeGrid.innerHTML = `<div class="banner banner-warn"><strong>Couldn't generate archetypes.</strong> ${escapeHtml(err.message || 'Unknown error')}</div>`;
generateBtn.textContent = 'Try again';
generateBtn.disabled = false;
}
});
function renderArchetypes(archetypes) {
archetypeGrid.innerHTML = archetypes.map((a, i) => `
<div class="archetype-card" data-idx="${i}">
<h4>${escapeHtml(a.title)}</h4>
<p>${escapeHtml(a.description)}</p>
</div>
`).join('');
archetypeGrid.querySelectorAll('.archetype-card').forEach((card, i) => {
card.addEventListener('click', () => {
archetypeGrid.querySelectorAll('.archetype-card').forEach(c => c.classList.remove('selected'));
card.classList.add('selected');
state.selectedArchetype = archetypes[i];
state.avatar = `${archetypes[i].title}. ${archetypes[i].description}`;
checkSetupComplete();
});
});
}
// =========================================================================
// ANTHROPIC API CALLS
// =========================================================================
async function callClaude(systemPrompt, userMessage, opts = {}) {
const body = {
model: opts.model || state.model,
max_tokens: opts.maxTokens || 4096,
system: systemPrompt,
messages: [{ role: 'user', content: userMessage }]
};
const response = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': state.apiKey,
'anthropic-version': '2023-06-01',
'anthropic-dangerous-direct-browser-access': 'true'
},
body: JSON.stringify(body)
});
if (!response.ok) {
const errText = await response.text();
throw new Error(`API error ${response.status}: ${errText.slice(0, 200)}`);
}
const data = await response.json();
return data.content?.[0]?.text || '';
}
function extractJSON(text) {
// Try fenced code block first
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
if (fenced) {
try { return JSON.parse(fenced[1].trim()); } catch (e) { /* fall through */ }
}
// Try first { … last }
const start = text.indexOf('{');
const end = text.lastIndexOf('}');
if (start !== -1 && end > start) {
try { return JSON.parse(text.slice(start, end + 1)); } catch (e) { /* fall through */ }
}
// Try array
const arrStart = text.indexOf('[');
const arrEnd = text.lastIndexOf(']');
if (arrStart !== -1 && arrEnd > arrStart) {
try { return JSON.parse(text.slice(arrStart, arrEnd + 1)); } catch (e) { /* fall through */ }
}
throw new Error('Could not parse JSON from response');
}
// ---------- Archetypes ----------
async function fetchArchetypes(profession) {
const sys = `You are an expert B2B marketing strategist working in the lineage of Alex Hormozi (offers), Russell Brunson (Dream 100), Robert Cialdini (persuasion), and Eugene Schwartz (awareness staging). You produce realistic, specific buyer archetypes for a given profession.
CRITICAL RULES:
- Never invent fake firm names, fake people, fake testimonials, or fabricated metrics.
- Use realistic role titles, industry segments, and demographic detail that an experienced practitioner in that profession would recognize.
- If you genuinely don't know enough about a niche profession, output 2 archetypes maximum and note in the description that the model has limited niche knowledge.
- No generic categories like "small business owners" or "high-net-worth individuals" without specifying industry, geography style, or deeper context.
Return EXACTLY this JSON shape, no prose before or after:
{
"archetypes": [
{ "title": "Short specific title (5-9 words)", "description": "One concrete sentence (20-35 words) describing who they are, where they work, and the moment they need this profession's services." }
]
}
Output 4 archetypes for the profession given. Each archetype must be MEANINGFULLY different from the others — not three flavors of the same buyer.`;
const user = `Profession: ${profession}
Return 4 realistic, distinct buyer archetypes for this profession. Make them specific enough that someone in this field would say "yes, I'd recognize that buyer."`;
const text = await callClaude(sys, user, { maxTokens: 1500 });
const obj = extractJSON(text);
if (!obj.archetypes || !Array.isArray(obj.archetypes)) throw new Error('No archetypes returned');
return obj.archetypes;
}
// ---------- Sharpening Questions ----------
async function fetchSharpeningQuestions(profession, avatar) {
const sys = `You are a B2B marketing strategist gathering the minimum viable inputs needed to build a real marketing plan. You ask 4 sharpening questions tailored to the specific profession + avatar combination.
CRITICAL RULES:
- Each question must change the marketing plan if answered differently. No throwaway demographic questions.
- Questions should cover: (1) geography or market scope, (2) price point or deal size, (3) current main acquisition source, (4) the biggest current bottleneck or constraint. Adapt these themes to the specific profession.
- Provide 3-5 short multiple-choice options per question PLUS a "free-text" fallback option labeled "Other (specify)".
- Questions should be 8-15 words each. Options should be 2-8 words each.
Return EXACTLY this JSON shape:
{
"questions": [
{
"id": "geo",
"question": "Question text here?",
"options": ["Option 1", "Option 2", "Option 3", "Other (specify)"]
}
]
}
Output 4 questions.`;
const user = `Profession: ${profession}
Avatar: ${avatar}
Generate 4 sharpening questions specific to this combination.`;
const text = await callClaude(sys, user, { maxTokens: 1500 });
const obj = extractJSON(text);
if (!obj.questions || !Array.isArray(obj.questions)) throw new Error('No questions returned');
return obj.questions;
}
// ---------- The Plan ----------
async function fetchPlan(profession, avatar, sharpening) {
const sys = `You are a B2B marketing strategist working in the lineage of Alex Hormozi, Russell Brunson, Robert Cialdini, and Eugene Schwartz. You produce real, specific marketing plans for professional service providers.
CRITICAL RULES — these are non-negotiable:
1. NEVER invent fake firm names, fake testimonials, fake quotes from real people, or fabricated ROI metrics.
2. NEVER write "this strategy generates X leads per month" or any specific outcome guarantee.
3. Use REALISTIC pain language — what the avatar would actually say in their own words. Quote them as if you're paraphrasing real discovery calls. Mark all such quotes as "representative" not "verified."
4. If you lack deep knowledge of a niche profession, say so explicitly in the caveats section. Don't bluff.
5. Channel recommendations must be SPECIFIC — name actual platforms, associations, or directories where this avatar gathers, not "social media" or "online communities."
6. The plan must reflect what the operator answered in the sharpening questions. If they said "I'm at $400/hr in Phoenix," don't recommend a strategy designed for $50/hr nationwide work.
Marketing fundamentals to apply:
- Hormozi's Value Equation (Dream Outcome × Perceived Likelihood) / (Time Delay × Effort)
- Brunson's Dream 100 (find the people who already gathered your audience)
- Cialdini's principles (reciprocity, social proof, authority, scarcity, unity, consistency, liking)
- Schwartz awareness staging (unaware → problem-aware → solution-aware → product-aware → most-aware)
- The six-step buyer journey: Identify → Get Listed → Trigger Reciprocity → Capture Intent → Convert Warm → Compound
Return EXACTLY this JSON structure (no prose before or after, no markdown fences):
{
"avatar_profile": "A 2-3 sentence refined description of the avatar incorporating the sharpening answers.",
"pain_points": [
{
"pain": "Specific pain in 1 sentence.",
"quote": "Verbatim language they'd use to describe this pain (1-2 sentences, in their voice).",
"intensity": "high|medium|low",
"why_it_matters": "1 sentence on why this pain drives buying behavior."
}
],
"where_they_gather": [
{ "place": "Specific platform/association/publication name", "what_to_do_there": "Concrete action: post, attend, speak, sponsor, list, etc." }
],
"channels": [
{ "rank": 1, "channel": "Channel name", "reasoning": "Why this is #1 for this specific avatar (2-3 sentences)." }
],
"lead_magnet": {
"title": "Specific lead magnet title (the gift you give first)",
"description": "What it is and why it triggers reciprocity for this avatar (2-3 sentences).",
"format": "PDF / checklist / calculator / template / etc."
},
"hook_and_headline": {
"hook": "First-3-seconds attention grabber in the avatar's language (1 sentence).",
"headline": "The promise. Format: outcome in timeframe without objection (1 sentence).",
"body_skeleton": "5-line body structure: problem → status quo → mechanism → proof → CTA (write the actual draft, ~80 words)."
},
"cadence_30_60_90": {
"days_1_30": ["Action 1", "Action 2", "Action 3"],
"days_31_60": ["Action 1", "Action 2", "Action 3"],
"days_61_90": ["Action 1", "Action 2", "Action 3"]
},
"offer_angle": {
"named_mechanism": "Name the method/system/protocol you sell. Specific.",
"core_promise": "1 sentence the avatar would pay for.",
"proof_strategy": "How you build perceived likelihood (Hormozi value equation numerator)."
},
"outreach_scripts": {
"linkedin_first_touch": "A 4-6 sentence first-touch LinkedIn message. NO PITCH. Lead with genuine reciprocity (gift, observation, or specific compliment grounded in something the recipient actually does). Reference the avatar's pain in their own language. Use [FIRST NAME] and [SPECIFIC THING THEY DO] as obvious user-fill placeholders. End with a low-friction question, NOT a meeting ask.",
"cold_email": "A 5-8 sentence cold email. Subject line first (in format 'Subject: ...'), then body. Open by naming the avatar's pain in their language (no 'Hope you're well'). Reference one specific concrete trigger that would make them care RIGHT NOW. Close with a single specific ask. Use [FIRST NAME], [FIRM NAME], etc. as obvious placeholders.",
"reddit_or_community_reply": "A 4-7 sentence template for replying to a relevant post in the avatar's community (Reddit, LinkedIn, association forum). Lead with genuine helpful answer to whatever question/pain was posted. Mention you have a related resource ONLY at the end and ONLY if the post explicitly asks for one. Otherwise just be helpful and let the credibility compound."
},
"caveats": [
"Honest limitation 1 (e.g., niche knowledge, unverified assumption, tested at higher/lower price points)."
]
}
Required counts:
- pain_points: exactly 3
- where_they_gather: 4-6 entries
- channels: 3 ranked entries
- caveats: 2-4 honest limitations
CRITICAL for outreach_scripts:
- Use [BRACKETS] for ALL user-fill placeholders so they're obvious
- Never invent a real person's name in any script
- Never write fake testimonials, fake company names, or fake metrics in the scripts
- Each script should sound like a literate professional, not a marketer cosplaying empathy`;
const sharpeningStr = Object.entries(sharpening)
.map(([k, v]) => `Q (${k}): ${v.question}\nA: ${v.answer}`)
.join('\n\n');
const user = `Profession: ${profession}
Avatar: ${avatar}
Sharpening answers:
${sharpeningStr}
Build the marketing plan.`;
const text = await callClaude(sys, user, { maxTokens: 6000 });
const obj = extractJSON(text);
// Validate required fields
const required = ['avatar_profile', 'pain_points', 'where_they_gather', 'channels', 'lead_magnet', 'hook_and_headline', 'cadence_30_60_90', 'offer_angle', 'outreach_scripts', 'caveats'];
for (const k of required) {
if (!(k in obj)) throw new Error(`Plan missing required field: ${k}`);
}
return obj;
}
// =========================================================================
// STAGE TRANSITIONS
// =========================================================================
function showStage(name) {
document.querySelectorAll('.stage').forEach(s => s.classList.remove('active'));
document.getElementById('stage-' + name).classList.add('active');
document.querySelectorAll('.stage-pill').forEach(p => {
p.classList.remove('active', 'complete');
if (p.dataset.stage === name) p.classList.add('active');
});
// Mark earlier stages complete
const order = ['setup', 'sharpen', 'plan'];
const idx = order.indexOf(name);
for (let i = 0; i < idx; i++) {
document.querySelector(`.stage-pill[data-stage="${order[i]}"]`).classList.add('complete');
}
window.scrollTo({ top: 0, behavior: 'smooth' });
}
// To Stage 2
document.getElementById('to-stage-2').addEventListener('click', async () => {
showStage('sharpen');
const banner = document.getElementById('sharpen-banner');
banner.style.display = 'block';
banner.className = 'banner banner-info';
banner.innerHTML = '<strong>Generating sharpening questions for your specific situation…</strong>';
document.getElementById('sharpen-questions').innerHTML = '';
document.getElementById('to-stage-3').disabled = true;
try {
const questions = await fetchSharpeningQuestions(state.profession, state.avatar);
state.sharpeningQuestions = questions;
state.sharpening = {};
renderSharpeningQuestions(questions);
banner.style.display = 'none';
} catch (err) {
banner.className = 'banner banner-warn';
banner.innerHTML = `<strong>Couldn't generate questions.</strong> ${escapeHtml(err.message || 'Unknown error')}<br>You can still proceed — the plan generator will work with the avatar info you provided.`;
// Provide a minimal fallback
state.sharpeningQuestions = [
{ id: 'geo', question: 'What is your geographic scope?', options: ['Local/regional', 'Statewide', 'National', 'International', 'Other (specify)'] },
{ id: 'price', question: 'Roughly what is your price point per engagement?', options: ['Under $1k', '$1k–$10k', '$10k–$50k', '$50k+', 'Other (specify)'] },
{ id: 'source', question: 'What is your current main client acquisition source?', options: ['Referrals', 'Online search', 'Networking', 'Outbound', 'Other (specify)'] },
{ id: 'bottleneck', question: 'What is your biggest current acquisition bottleneck?', options: ['Not enough leads', 'Wrong-fit leads', 'Slow conversion', 'Other (specify)'] }
];
state.sharpening = {};
renderSharpeningQuestions(state.sharpeningQuestions);
}
});
document.getElementById('back-to-1').addEventListener('click', () => showStage('setup'));
document.getElementById('back-to-2').addEventListener('click', () => showStage('sharpen'));
function renderSharpeningQuestions(questions) {
const html = questions.map((q, qi) => `
<div class="field">
<label class="field-label">${qi + 1}. ${escapeHtml(q.question)}</label>
<div class="archetype-grid" style="grid-template-columns: 1fr 1fr; gap: 10px;">
${q.options.map((opt, oi) => `
<div class="archetype-card sharpening-option" data-qid="${q.id}" data-question="${escapeHtml(q.question)}" data-option="${escapeHtml(opt)}" data-qi="${qi}" data-oi="${oi}" style="padding: 12px 14px;">
<h4 style="font-size: 15px; margin-bottom: 0;">${escapeHtml(opt)}</h4>
</div>
`).join('')}
</div>
<div class="sharpening-other" data-qid="${q.id}" style="display:none; margin-top: 10px;">
<input type="text" class="sharpening-other-input" data-qid="${q.id}" placeholder="Specify…">
</div>
</div>
`).join('');
document.getElementById('sharpen-questions').innerHTML = html;
document.querySelectorAll('.sharpening-option').forEach(opt => {
opt.addEventListener('click', () => {
const qi = opt.dataset.qi;
// Deselect siblings in same question
document.querySelectorAll(`.sharpening-option[data-qi="${qi}"]`).forEach(s => s.classList.remove('selected'));
opt.classList.add('selected');
const qid = opt.dataset.qid;
const isOther = opt.dataset.option.toLowerCase().startsWith('other');
const otherDiv = document.querySelector(`.sharpening-other[data-qid="${qid}"]`);
if (isOther) {
otherDiv.style.display = 'block';
const inp = otherDiv.querySelector('input');
inp.focus();
inp.oninput = () => {
state.sharpening[qid] = { question: opt.dataset.question, answer: inp.value.trim() || 'Other (not specified)' };
updateSharpenButton();
};
state.sharpening[qid] = { question: opt.dataset.question, answer: 'Other (not specified)' };
} else {
otherDiv.style.display = 'none';
state.sharpening[qid] = { question: opt.dataset.question, answer: opt.dataset.option };
}
updateSharpenButton();
});
});
}
function updateSharpenButton() {
const allAnswered = state.sharpeningQuestions.every(q => state.sharpening[q.id]);
document.getElementById('to-stage-3').disabled = !allAnswered;
}
// To Stage 3 — Generate plan
document.getElementById('to-stage-3').addEventListener('click', async () => {
showStage('plan');
document.getElementById('plan-loading').style.display = 'block';
document.getElementById('plan-content').innerHTML = '';
document.getElementById('plan-actions').style.display = 'none';
const steps = [
'Reading your brief…',
'Identifying the avatar\'s real pain points…',
'Mapping the channels that work for this niche…',
'Drafting hook and lead magnet copy…',
'Building the 90-day cadence…',
'Writing the offer angle…',
'Finalizing the plan…'
];
let stepIdx = 0;
const stepEl = document.getElementById('loading-step');
stepEl.textContent = steps[0];
const stepInterval = setInterval(() => {
stepIdx = Math.min(stepIdx + 1, steps.length - 1);
stepEl.textContent = steps[stepIdx];
}, 4000);
try {
const plan = await fetchPlan(state.profession, state.avatar, state.sharpening);
state.plan = plan;
clearInterval(stepInterval);
document.getElementById('plan-loading').style.display = 'none';
renderPlan(plan);
document.getElementById('plan-actions').style.display = 'flex';
} catch (err) {
clearInterval(stepInterval);
document.getElementById('plan-loading').style.display = 'none';
document.getElementById('plan-content').innerHTML = `<div class="banner banner-warn"><strong>Plan generation failed.</strong> ${escapeHtml(err.message || 'Unknown error')}<br><br>This usually means: API key missing or invalid · rate limit hit · network error · the model returned malformed JSON.<br><br>Click "Adjust inputs" below to revise and try again.</div>`;
document.getElementById('plan-actions').style.display = 'flex';
}
});
// =========================================================================
// PLAN RENDERING
// =========================================================================
// Build a compact keyword string from profession + avatar + lead pain
function buildSearchKeywords(plan) {
const words = new Set();
// Pull strong keywords from avatar (first 8 meaningful words)
const avatarWords = (state.avatar || '').toLowerCase()
.replace(/[^\w\s]/g, ' ')
.split(/\s+/)
.filter(w => w.length > 3 && !STOPWORDS.has(w))
.slice(0, 6);
avatarWords.forEach(w => words.add(w));
// Pull from first pain point if available
if (plan && plan.pain_points && plan.pain_points[0]) {
const painWords = plan.pain_points[0].pain.toLowerCase()
.replace(/[^\w\s]/g, ' ')
.split(/\s+/)
.filter(w => w.length > 4 && !STOPWORDS.has(w))
.slice(0, 3);
painWords.forEach(w => words.add(w));
}
return Array.from(words).slice(0, 6).join(' ');
}
const STOPWORDS = new Set([
'their','they','them','this','that','these','those','with','from','have','need',
'about','will','would','should','could','than','then','also','because','through',
'where','what','which','when','while','more','most','some','many','other','such',
'into','onto','upon','over','under','after','before','between','during','within',
'against','very','just','only','even','same','being','having','doing','make',
'made','taken','given','said','people','person','users','user','business','companies',
'company','professional','professionals','services','service','industry','market',
'specific','specifically','really','actually','sized','typically','generally'
]);
function wireScanButtons() {
const grid = document.getElementById('scan-grid');
if (!grid || !state.plan) return;
const keywords = buildSearchKeywords(state.plan);
const profession = state.profession;
const avatarShort = state.selectedArchetype ? state.selectedArchetype.title : state.avatar.slice(0, 80);
// Build target URLs
const redditQuery = encodeURIComponent(keywords);
const googleRedditQuery = encodeURIComponent(`site:reddit.com ${keywords}`);
const linkedinQuery = encodeURIComponent(avatarShort);
const fullKeywordsForClipboard = `Profession: ${profession}\nAvatar: ${avatarShort}\nKeywords: ${keywords}\nLead pain: ${state.plan.pain_points?.[0]?.pain || ''}`;
const buttons = [
{
label: 'Reddit · search',
icon: 'RDT',
url: `https://www.reddit.com/search/?q=${redditQuery}`,
type: 'link'
},
{
label: 'Google site:reddit',
icon: 'GGL',
url: `https://www.google.com/search?q=${googleRedditQuery}`,
type: 'link'
},
{
label: 'LinkedIn · people search',
icon: 'LI',
url: `https://www.linkedin.com/search/results/people/?keywords=${linkedinQuery}`,
type: 'link'
},
{
label: 'PainOnSocial · copy keywords',
icon: 'POS',
url: 'https://www.painonsocial.com/',
type: 'copy-and-link',
copyText: fullKeywordsForClipboard
},
{
label: 'SparkToro · copy avatar',
icon: 'SPK',
url: 'https://sparktoro.com/',
type: 'copy-and-link',
copyText: avatarShort
},
{
label: 'AnswerThePublic · search',
icon: 'ATP',
url: `https://answerthepublic.com/?q=${redditQuery}&search=&hl=en`,
type: 'link'
}
];
grid.innerHTML = buttons.map((b, i) => `
<a class="scan-btn" data-idx="${i}" ${b.type === 'link' ? `href="${b.url}" target="_blank" rel="noopener"` : 'href="#"'}>
<span class="scan-icon">${b.icon}</span>
<span class="scan-label">${escapeHtml(b.label)}</span>
<span class="scan-arrow">→</span>
</a>
`).join('');
grid.querySelectorAll('.scan-btn').forEach((el, i) => {
const cfg = buttons[i];
if (cfg.type === 'copy-and-link') {
el.addEventListener('click', e => {
e.preventDefault();
navigator.clipboard.writeText(cfg.copyText).then(() => {
const orig = el.querySelector('.scan-label').textContent;
el.querySelector('.scan-label').textContent = 'Copied — opening tool…';
setTimeout(() => {
el.querySelector('.scan-label').textContent = orig;
window.open(cfg.url, '_blank', 'noopener');
}, 700);
}).catch(() => {
window.open(cfg.url, '_blank', 'noopener');
});
});
}
});
}
function renderPlan(p) {
const intensityColor = { high: 'var(--red-deep)', medium: 'var(--gold)', low: 'var(--teal)' };
const profession = state.profession;
const avatar = state.selectedArchetype ? state.selectedArchetype.title : (state.avatar.length > 100 ? state.avatar.slice(0, 100) + '…' : state.avatar);
let html = `
<div class="plan-summary">
<h3>The Brief</h3>
<div class="profession">${escapeHtml(profession)}</div>
<div class="avatar">Targeting: ${escapeHtml(avatar)}</div>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">01</div>
<h3>Avatar Profile</h3>
</div>
<p>${escapeHtml(p.avatar_profile)}</p>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">02</div>
<h3>The 3 Pain Points</h3>
</div>
`;
p.pain_points.forEach((pp, i) => {
html += `
<div style="margin-bottom: 18px; ${i < p.pain_points.length - 1 ? 'border-bottom: 1px dashed var(--muted); padding-bottom: 18px;' : ''}">
<p style="font-weight: 600; font-family: var(--serif); font-size: 17px; margin-bottom: 6px;">Pain ${i+1}: ${escapeHtml(pp.pain)}</p>
<div class="pain-quote">"${escapeHtml(pp.quote)}"</div>
<div class="pain-meta" style="color: ${intensityColor[pp.intensity] || 'var(--muted)'};">Intensity: ${escapeHtml(pp.intensity)}</div>
<p style="margin-top: 8px; font-size: 14px; color: var(--muted); font-style: italic;">${escapeHtml(pp.why_it_matters)}</p>
</div>
`;
});
html += `</div>`;
html += `
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">03</div>
<h3>Where They Gather</h3>
</div>
<ul>
${p.where_they_gather.map(w => `<li><strong>${escapeHtml(w.place)}</strong> — ${escapeHtml(w.what_to_do_there)}</li>`).join('')}
</ul>
</div>
<div class="scan-buttons-wrap">
<h3>Run pain scans · external tools</h3>
<p class="scan-help">One-click into the tools that actually mine pain language. Reddit and Google searches launch with your keywords pre-filled. PainOnSocial and SparkToro require login; the keyword set is copied to your clipboard so you can paste once you're in.</p>
<div class="scan-grid" id="scan-grid"></div>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">04</div>
<h3>Channel Priority</h3>
</div>
${p.channels.map(c => `
<div class="channel-priority">
<div class="channel-rank">${c.rank}</div>
<div>
<div class="channel-name">${escapeHtml(c.channel)}</div>
<div class="channel-reason">${escapeHtml(c.reasoning)}</div>
</div>
</div>
`).join('')}
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">05</div>
<h3>The Lead Magnet (Gift First)</h3>
</div>
<p style="font-weight: 600; font-family: var(--serif); font-size: 18px;">${escapeHtml(p.lead_magnet.title)}</p>
<p>${escapeHtml(p.lead_magnet.description)}</p>
<p class="pain-meta">Format: ${escapeHtml(p.lead_magnet.format)}</p>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">06</div>
<h3>Hook, Headline & Body</h3>
</div>
<p style="font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-top: 6px;">Hook</p>
<div class="copy-block">${escapeHtml(p.hook_and_headline.hook)}</div>
<p style="font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--red-deep); font-weight: 700;">Headline</p>
<div class="copy-block">${escapeHtml(p.hook_and_headline.headline)}</div>
<p style="font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--red-deep); font-weight: 700;">Body skeleton</p>
<div class="copy-block">${escapeHtml(p.hook_and_headline.body_skeleton)}</div>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">07</div>
<h3>30 / 60 / 90-Day Cadence</h3>
</div>
<div class="cadence-grid">
<div class="cadence-card">
<h5>Days 1–30</h5>
<ul>${p.cadence_30_60_90.days_1_30.map(a => `<li>${escapeHtml(a)}</li>`).join('')}</ul>
</div>
<div class="cadence-card">
<h5>Days 31–60</h5>
<ul>${p.cadence_30_60_90.days_31_60.map(a => `<li>${escapeHtml(a)}</li>`).join('')}</ul>
</div>
<div class="cadence-card">
<h5>Days 61–90</h5>
<ul>${p.cadence_30_60_90.days_61_90.map(a => `<li>${escapeHtml(a)}</li>`).join('')}</ul>
</div>
</div>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">08</div>
<h3>Offer Angle (Hormozi)</h3>
</div>
<p><strong>Named mechanism:</strong> ${escapeHtml(p.offer_angle.named_mechanism)}</p>
<p><strong>Core promise:</strong> ${escapeHtml(p.offer_angle.core_promise)}</p>
<p><strong>Proof strategy:</strong> ${escapeHtml(p.offer_angle.proof_strategy)}</p>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">09</div>
<h3>Outreach Scripts — Channel-Specific Drafts</h3>
</div>
<p style="font-family: var(--serif); font-style: italic; color: var(--muted); font-size: 14px; margin-bottom: 16px;">Three drafts tuned to your avatar and channels. Anything in [BRACKETS] is a placeholder you fill in. These are starting points — read them aloud, edit until they sound like you, then send.</p>
<div class="script-card">
<div class="script-header">
<span class="script-channel-num">A</span>
<h4>LinkedIn First Touch</h4>
<button class="copy-btn" data-copy-target="script-linkedin">Copy</button>
</div>
<div class="script-body" id="script-linkedin">${escapeHtml(p.outreach_scripts.linkedin_first_touch)}</div>
</div>
<div class="script-card">
<div class="script-header">
<span class="script-channel-num">B</span>
<h4>Cold Email</h4>
<button class="copy-btn" data-copy-target="script-email">Copy</button>
</div>
<div class="script-body" id="script-email">${escapeHtml(p.outreach_scripts.cold_email)}</div>
</div>
<div class="script-card">
<div class="script-header">
<span class="script-channel-num">C</span>
<h4>Reddit / Community Reply</h4>
<button class="copy-btn" data-copy-target="script-reddit">Copy</button>
</div>
<div class="script-body" id="script-reddit">${escapeHtml(p.outreach_scripts.reddit_or_community_reply)}</div>
</div>
</div>
<div class="plan-section">
<div class="plan-section-header">
<div class="plan-section-num">10</div>
<h3>Caveats — What Could Go Wrong</h3>
</div>
${p.caveats.map(c => `<div class="caveat-box">${escapeHtml(c)}</div>`).join('')}
</div>
`;
document.getElementById('plan-content').innerHTML = html;
// Wire up copy buttons (after innerHTML is set)
document.querySelectorAll('.copy-btn').forEach(btn => {
btn.addEventListener('click', () => {
const target = document.getElementById(btn.dataset.copyTarget);
if (!target) return;
navigator.clipboard.writeText(target.textContent).then(() => {
const orig = btn.textContent;
btn.textContent = 'Copied ✓';
btn.classList.add('copied');
setTimeout(() => { btn.textContent = orig; btn.classList.remove('copied'); }, 1600);
}).catch(() => { btn.textContent = 'Copy failed'; });
});
});
// Wire up scan buttons after render
wireScanButtons();
}
// =========================================================================
// SAVED PLANS
// =========================================================================
const SAVED_KEY = 'riser_marketing_plans_v1';
function loadSavedPlans() {
try {
return JSON.parse(localStorage.getItem(SAVED_KEY) || '[]');
} catch (e) { return []; }
}
function savePlan() {
if (!state.plan) return;
const plans = loadSavedPlans();
const id = Date.now().toString();
plans.unshift({
id,
profession: state.profession,
avatar: state.avatar,
selectedArchetype: state.selectedArchetype,
sharpening: state.sharpening,
plan: state.plan,
savedAt: new Date().toISOString()
});
localStorage.setItem(SAVED_KEY, JSON.stringify(plans.slice(0, 30))); // cap at 30
renderSavedPlans();
alert('Plan saved.');
}
function renderSavedPlans() {
const plans = loadSavedPlans();
const list = document.getElementById('saved-plans-list');
const content = document.getElementById('saved-plans-content');
if (plans.length === 0) {
list.style.display = 'none';
return;
}
list.style.display = 'block';
content.innerHTML = plans.map(p => {
const date = new Date(p.savedAt).toLocaleDateString();
const avatarShort = (p.selectedArchetype?.title) || (p.avatar.length > 70 ? p.avatar.slice(0, 70) + '…' : p.avatar);
return `
<div class="saved-plan-item" data-id="${p.id}">
<div class="saved-plan-info">
<div class="sp-prof">${escapeHtml(p.profession)}</div>
<div class="sp-avt">${escapeHtml(avatarShort)} · saved ${date}</div>
</div>
<div class="saved-plan-actions">
<button class="sp-btn sp-load" data-id="${p.id}">Load</button>
<button class="sp-btn sp-delete" data-id="${p.id}">×</button>
</div>
</div>
`;
}).join('');
content.querySelectorAll('.sp-load').forEach(b => {
b.addEventListener('click', e => {
e.stopPropagation();
const p = plans.find(x => x.id === b.dataset.id);
if (!p) return;
state.profession = p.profession;
state.avatar = p.avatar;
state.selectedArchetype = p.selectedArchetype;
state.sharpening = p.sharpening;
state.plan = p.plan;
showStage('plan');
renderPlan(p.plan);
document.getElementById('plan-actions').style.display = 'flex';
});
});
content.querySelectorAll('.sp-delete').forEach(b => {
b.addEventListener('click', e => {
e.stopPropagation();
if (!confirm('Delete this plan?')) return;
const filtered = plans.filter(x => x.id !== b.dataset.id);
localStorage.setItem(SAVED_KEY, JSON.stringify(filtered));
renderSavedPlans();
});
});
}
document.getElementById('save-plan').addEventListener('click', savePlan);
document.getElementById('print-plan').addEventListener('click', () => window.print());
document.getElementById('new-plan').addEventListener('click', () => {
state.plan = null;
state.sharpening = {};
state.sharpeningQuestions = [];
document.getElementById('avatar-text').value = '';
document.getElementById('profession').value = '';
state.profession = '';
state.avatar = '';
state.selectedArchetype = null;
archetypeGrid.innerHTML = '';
generateBtn.textContent = 'Show archetypes';
showStage('setup');
checkSetupComplete();
});
// Init
renderSavedPlans();
checkSetupComplete(); // Fix: saved API key wasn't enabling the button on page load
console.log('RISER Marketing Plan Generator loaded. Professions:', PROFESSIONS.length);
console.log('Initial state:', {
professionLen: state.profession.length,
avatarLen: state.avatar.length,
avatarMode: state.avatarMode,
selectedArchetype: state.selectedArchetype,
apiKeyLen: state.apiKey.length
});
</script>
</body>
</html>
Original asset: RISER-MVO-Widget-Direct.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RISER MVO Widget — Idea or No Idea</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,700;0,9..144,900;1,9..144,400;1,9..144,500&family=JetBrains+Mono:wght@400;500;700&family=Inter+Tight:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a;
--paper: #f7f4ee;
--paper-warm: #f0eadf;
--paper-deep: #e9e2d2;
--rule: #1a1a1a;
--red: #c9302a;
--red-deep: #8b1f1c;
--red-tint: #fbe8e6;
--red-soft: #f9d8d5;
--green: #1d6e3a;
--green-tint: #dcefe2;
--gold: #b8893a;
--gold-tint: #f5ead0;
--teal: #2c5f5a;
--muted: #5a564f;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
background: var(--paper);
color: var(--ink);
font-family: var(--serif);
font-size: 17px;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
min-height: 100vh;
background-image:
radial-gradient(circle at 15% 25%, rgba(201, 48, 42, 0.04) 0, transparent 40%),
radial-gradient(circle at 85% 75%, rgba(184, 137, 58, 0.035) 0, transparent 45%);
}
/* APP SHELL */
.app {
max-width: 980px;
margin: 0 auto;
padding: 32px 28px 80px;
}
/* HEADER */
.app-header {
border-top: 8px solid var(--ink);
border-bottom: 1px solid var(--ink);
padding: 18px 0 22px;
margin-bottom: 28px;
display: grid;
grid-template-columns: 1fr auto;
gap: 20px;
align-items: end;
}
.app-header .meta {
font-family: var(--mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.18em;
color: var(--muted);
margin-bottom: 8px;
}
.app-header .meta .red { color: var(--red); }
.app-header h1 {
font-family: var(--serif);
font-weight: 900;
font-size: clamp(34px, 5vw, 52px);
line-height: 0.95;
letter-spacing: -0.025em;
}
.app-header h1 em { font-style: italic; font-weight: 500; color: var(--red); }
.app-header .deck {
font-family: var(--serif);
font-style: italic;
font-size: 15px;
color: var(--muted);
line-height: 1.4;
margin-top: 8px;
max-width: 540px;
}
.header-actions {
display: flex;
gap: 8px;
flex-wrap: wrap;
justify-content: flex-end;
}
.btn-mini {
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.15em;
padding: 7px 11px;
background: var(--paper);
border: 1px solid var(--ink);
color: var(--ink);
cursor: pointer;
font-weight: 600;
transition: all 0.15s ease;
white-space: nowrap;
}
.btn-mini:hover {
background: var(--ink);
color: var(--paper);
}
.btn-mini.danger:hover {
background: var(--red);
color: var(--paper);
border-color: var(--red);
}
/* PROGRESS RAIL */
.progress-rail {
display: grid;
grid-template-columns: repeat(17, 1fr);
gap: 2px;
margin-bottom: 28px;
padding: 0;
}
.gate-cell {
display: flex;
flex-direction: column;
align-items: center;
padding: 8px 2px 6px;
background: var(--paper-warm);
border: 1px solid var(--paper-deep);
cursor: pointer;
transition: all 0.15s ease;
position: relative;
text-align: center;
min-width: 0;
}
.gate-cell:hover { background: var(--paper-deep); }
.gate-cell.active {
background: var(--ink);
border-color: var(--ink);
color: var(--paper);
}
.gate-cell.go { background: var(--green-tint); border-color: var(--green); }
.gate-cell.no { background: #4a1010; border-color: #4a1010; color: var(--paper); }
.gate-cell.rework { background: var(--gold-tint); border-color: var(--gold); }
.gate-cell.active.go { background: var(--green); color: var(--paper); }
.gate-cell.active.no { background: var(--red); color: var(--paper); border-color: var(--red); }
.gate-cell.active.rework { background: var(--gold); color: var(--paper); border-color: var(--gold); }
.gate-cell .num {
font-family: var(--mono);
font-size: 10px;
font-weight: 700;
letter-spacing: 0.03em;
white-space: nowrap;
}
.gate-cell .name {
font-family: var(--sans);
font-size: 8.5px;
font-weight: 600;
line-height: 1.1;
margin-top: 3px;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
/* GATE SCREEN */
.gate-screen {
display: none;
animation: fadeIn 0.25s ease;
}
.gate-screen.visible { display: block; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(4px);} to { opacity: 1; transform: none;} }
.gate-rubric {
font-family: var(--mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--red);
margin-bottom: 6px;
display: flex;
align-items: center;
gap: 10px;
}
.gate-rubric::before {
content: '';
width: 22px; height: 2px;
background: var(--red);
}
.gate-screen h2 {
font-family: var(--serif);
font-weight: 700;
font-size: clamp(28px, 4.2vw, 42px);
line-height: 1.05;
letter-spacing: -0.02em;
margin-bottom: 10px;
}
.gate-screen h2 em { font-style: italic; color: var(--red); font-weight: 500; }
.gate-screen .principle {
background: var(--paper-warm);
border-left: 4px solid var(--ink);
padding: 16px 22px;
margin: 22px 0 28px;
font-family: var(--serif);
font-style: italic;
font-size: 16px;
line-height: 1.5;
color: var(--ink);
}
.gate-screen .principle strong { font-weight: 700; font-style: normal; }
.gate-screen .principle .source {
display: block;
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--muted);
font-style: normal;
margin-top: 8px;
}
/* INPUT GROUPS */
.input-group {
margin-bottom: 22px;
}
.input-group label {
display: block;
font-family: var(--mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.15em;
font-weight: 700;
margin-bottom: 8px;
color: var(--ink);
}
.input-group .help {
font-family: var(--serif);
font-style: italic;
font-size: 14.5px;
color: var(--muted);
margin-bottom: 10px;
line-height: 1.4;
}
.input-group input[type="text"],
.input-group input[type="number"],
.input-group textarea,
.input-group select {
width: 100%;
padding: 11px 14px;
font-family: var(--sans);
font-size: 14.5px;
line-height: 1.5;
background: var(--paper);
border: 1px solid var(--ink);
color: var(--ink);
border-radius: 0;
transition: all 0.15s ease;
font-weight: 500;
}
.input-group input:focus,
.input-group textarea:focus,
.input-group select:focus {
outline: none;
border-color: var(--red);
background: #fff;
box-shadow: 0 0 0 3px var(--red-soft);
}
.input-group textarea {
resize: vertical;
min-height: 80px;
font-family: var(--serif);
}
/* SCALE INPUT (1-10) */
.scale {
display: grid;
grid-template-columns: repeat(10, 1fr);
gap: 4px;
margin-top: 8px;
}
.scale-btn {
aspect-ratio: 1;
background: var(--paper);
border: 1px solid var(--paper-deep);
font-family: var(--mono);
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: all 0.1s ease;
color: var(--ink);
}
.scale-btn:hover {
border-color: var(--ink);
background: var(--paper-warm);
}
.scale-btn.selected {
background: var(--ink);
color: var(--paper);
border-color: var(--ink);
}
.scale-labels {
display: flex;
justify-content: space-between;
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--muted);
margin-top: 6px;
}
/* RADIO/CHOICE */
.choice-group {
display: grid;
gap: 8px;
}
.choice-group.cols-2 { grid-template-columns: 1fr 1fr; }
.choice-group.cols-3 { grid-template-columns: 1fr 1fr 1fr; }
.choice-btn {
background: var(--paper);
border: 1px solid var(--ink);
padding: 12px 16px;
text-align: left;
cursor: pointer;
font-family: var(--sans);
font-size: 14px;
font-weight: 500;
color: var(--ink);
transition: all 0.1s ease;
line-height: 1.4;
}
.choice-btn:hover { background: var(--paper-warm); }
.choice-btn.selected {
background: var(--ink);
color: var(--paper);
}
.choice-btn .label {
display: block;
font-weight: 700;
margin-bottom: 4px;
}
.choice-btn .sub {
display: block;
font-family: var(--serif);
font-style: italic;
font-size: 12.5px;
line-height: 1.35;
opacity: 0.8;
font-weight: 400;
}
/* ACTION ROW */
.action-row {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
margin-top: 32px;
padding-top: 22px;
border-top: 2px solid var(--ink);
}
.btn {
font-family: var(--sans);
font-size: 14px;
font-weight: 700;
padding: 12px 20px;
border: 1px solid var(--ink);
cursor: pointer;
transition: all 0.15s ease;
background: var(--paper);
color: var(--ink);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.btn:hover { background: var(--ink); color: var(--paper); }
.btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.btn:disabled:hover { background: var(--paper); color: var(--ink); }
.btn.primary {
background: var(--ink);
color: var(--paper);
}
.btn.primary:hover { background: var(--red); border-color: var(--red); }
.btn.danger {
border-color: var(--red);
color: var(--red);
}
.btn.danger:hover { background: var(--red); color: var(--paper); }
/* VERDICT BLOCK */
.verdict {
margin-top: 28px;
border: 2px solid var(--ink);
overflow: hidden;
}
.verdict-header {
padding: 16px 22px;
color: var(--paper);
display: flex;
justify-content: space-between;
align-items: baseline;
}
.verdict.go .verdict-header { background: var(--green); }
.verdict.no .verdict-header { background: var(--red-deep); }
.verdict.rework .verdict-header { background: var(--gold); }
.verdict-header .label {
font-family: var(--mono);
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.2em;
font-weight: 700;
}
.verdict-header .name {
font-family: var(--serif);
font-size: 22px;
font-weight: 700;
}
.verdict-body {
padding: 22px 26px;
background: var(--paper);
}
.verdict.go .verdict-body { background: var(--green-tint); }
.verdict.no .verdict-body { background: var(--red-tint); color: var(--red-deep); }
.verdict.rework .verdict-body { background: var(--gold-tint); }
.verdict-body p {
font-size: 15.5px;
line-height: 1.55;
margin-bottom: 12px;
}
.verdict-body p:last-child { margin-bottom: 0; }
.verdict-body ul {
list-style: none;
padding: 0;
margin: 12px 0;
}
.verdict-body li {
padding: 8px 0 8px 22px;
position: relative;
font-family: var(--sans);
font-size: 14px;
line-height: 1.5;
border-bottom: 1px dotted rgba(0,0,0,0.15);
}
.verdict-body li:last-child { border-bottom: none; }
.verdict-body li::before {
content: '→';
position: absolute;
left: 0;
top: 8px;
font-family: var(--mono);
font-weight: 700;
}
.verdict-body li strong { font-weight: 700; }
/* SCORE DISPLAY */
.score-display {
background: var(--ink);
color: var(--paper);
padding: 18px 22px;
margin: 18px 0;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
gap: 16px;
}
.score-display .label {
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.18em;
color: #c9b88a;
margin-bottom: 4px;
}
.score-display .breakdown {
font-family: var(--sans);
font-size: 13.5px;
color: #d6d2c8;
}
.score-display .total {
font-family: var(--serif);
font-size: 56px;
font-weight: 900;
line-height: 0.9;
color: var(--paper);
}
.score-display .total .max {
font-size: 24px;
font-weight: 400;
color: #c9b88a;
}
/* CALLOUT */
.callout {
background: var(--paper-warm);
border-left: 4px solid var(--red);
padding: 16px 22px;
margin: 20px 0;
font-family: var(--serif);
font-size: 14.5px;
line-height: 1.5;
}
.callout strong { font-weight: 700; }
/* PILL */
.pill {
display: inline-block;
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
padding: 3px 8px;
border: 1px solid currentColor;
margin-right: 4px;
font-weight: 700;
vertical-align: middle;
}
/* PRINTABLE BRIEF */
.brief {
background: var(--paper);
border: 2px solid var(--ink);
padding: 32px 36px;
margin-top: 24px;
}
.brief h3 {
font-family: var(--serif);
font-weight: 900;
font-size: 26px;
line-height: 1;
margin-bottom: 6px;
}
.brief h3 em { font-style: italic; color: var(--red); font-weight: 500; }
.brief .brief-meta {
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.18em;
color: var(--muted);
margin-bottom: 22px;
padding-bottom: 10px;
border-bottom: 1px solid var(--ink);
}
.brief-section {
margin-bottom: 18px;
padding-bottom: 14px;
border-bottom: 1px dotted var(--paper-deep);
}
.brief-section:last-child { border-bottom: none; }
.brief-section h4 {
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.15em;
margin-bottom: 6px;
color: var(--red);
}
.brief-section p {
font-family: var(--serif);
font-size: 15px;
line-height: 1.45;
margin-bottom: 4px;
}
.brief-section p.empty {
font-style: italic;
color: var(--muted);
font-size: 13.5px;
}
/* INTRO LANDING */
.intro-card {
background: var(--paper);
border: 2px solid var(--ink);
padding: 30px 32px;
margin-bottom: 22px;
}
.intro-card h3 {
font-family: var(--serif);
font-weight: 700;
font-size: 22px;
margin-bottom: 12px;
}
.intro-card p {
font-family: var(--serif);
font-size: 15.5px;
line-height: 1.55;
margin-bottom: 12px;
}
.intro-card .gate-list {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px;
margin: 18px 0;
list-style: none;
padding: 0;
}
.intro-card .gate-list li {
font-family: var(--sans);
font-size: 13.5px;
padding: 7px 12px;
background: var(--paper-warm);
border-left: 3px solid var(--ink);
line-height: 1.35;
}
.intro-card .gate-list li .num {
font-family: var(--mono);
font-size: 10px;
font-weight: 700;
color: var(--red);
margin-right: 8px;
}
.resume-banner {
background: var(--gold-tint);
border: 1px solid var(--gold);
padding: 14px 18px;
margin-bottom: 20px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
font-family: var(--sans);
font-size: 14px;
}
.resume-banner strong { font-weight: 700; }
/* TWO-COL LAYOUT */
.grid-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
/* COLOPHON */
.app-colophon {
margin-top: 56px;
padding: 22px 0 0;
border-top: 4px solid var(--ink);
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.18em;
color: var(--muted);
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
gap: 8px 14px;
text-align: center;
line-height: 1.6;
}
.app-colophon .dot { opacity: 0.5; }
.app-colophon .credit {
flex-basis: 100%;
margin-top: 6px;
font-size: 9px;
letter-spacing: 0.12em;
text-transform: none;
font-style: italic;
font-family: var(--serif);
color: var(--muted);
opacity: 0.75;
max-width: 720px;
margin-left: auto;
margin-right: auto;
}
/* STEP ONE HELP SYSTEM (Gate 01) */
.help-rail {
display: flex;
gap: 6px;
margin: 8px 0 12px;
flex-wrap: wrap;
}
.help-toggle {
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
padding: 5px 10px;
background: transparent;
border: 1px solid var(--ink);
color: var(--ink);
cursor: pointer;
font-weight: 600;
transition: all 0.15s ease;
}
.help-toggle:hover { background: var(--ink); color: var(--paper); }
.help-toggle.active { background: var(--ink); color: var(--paper); }
.help-toggle.verify { border-color: var(--red); color: var(--red); }
.help-toggle.verify:hover { background: var(--red); color: var(--paper); }
.help-toggle.verify.active { background: var(--red); color: var(--paper); }
.help-panel {
display: none;
margin: 4px 0 14px;
padding: 16px 18px;
background: var(--paper-warm);
border: 1px solid var(--ink);
font-family: var(--sans);
font-size: 13.5px;
line-height: 1.55;
animation: panelIn 0.2s ease;
}
.help-panel.visible { display: block; }
@keyframes panelIn { from { opacity: 0; transform: translateY(-4px);} to { opacity: 1; transform: none;} }
/* EXAMPLES PANEL */
.examples-panel .col-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.examples-panel h6 {
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.15em;
margin-bottom: 8px;
font-weight: 700;
}
.examples-panel .good-col h6 { color: var(--green); }
.examples-panel .bad-col h6 { color: var(--red-deep); }
.examples-panel .good-col h6::before { content: '✓ '; }
.examples-panel .bad-col h6::before { content: '✗ '; }
.examples-panel ul {
list-style: none;
padding: 0;
margin: 0;
}
.examples-panel li {
padding: 8px 12px;
margin-bottom: 6px;
background: var(--paper);
border-left: 3px solid;
font-family: var(--serif);
font-size: 13px;
line-height: 1.45;
font-style: italic;
}
.examples-panel .good-col li { border-left-color: var(--green); }
.examples-panel .bad-col li { border-left-color: var(--red); color: var(--muted); }
/* SHARPEN PANEL */
.sharpen-panel ol {
list-style: none;
counter-reset: s;
padding: 0;
margin: 0;
}
.sharpen-panel li {
counter-increment: s;
padding: 10px 0 10px 30px;
position: relative;
border-bottom: 1px dotted var(--paper-deep);
font-family: var(--serif);
font-size: 14px;
line-height: 1.5;
}
.sharpen-panel li:last-child { border-bottom: none; }
.sharpen-panel li::before {
content: counter(s, decimal-leading-zero);
position: absolute;
left: 0;
top: 11px;
font-family: var(--mono);
font-size: 10px;
color: var(--red);
font-weight: 700;
}
.sharpen-panel .closer {
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--ink);
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--muted);
font-weight: 600;
}
/* VERIFY PANEL */
.verify-panel .verify-intro {
font-family: var(--serif);
font-style: italic;
font-size: 13.5px;
line-height: 1.45;
color: var(--muted);
margin-bottom: 10px;
}
.verify-panel .verify-grid {
display: grid;
gap: 6px;
}
.verify-link {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 14px;
background: var(--paper);
border: 1px solid var(--ink);
color: var(--ink);
text-decoration: none;
font-family: var(--sans);
font-size: 13px;
font-weight: 500;
transition: all 0.15s ease;
}
.verify-link:hover {
background: var(--ink);
color: var(--paper);
}
.verify-link::after {
content: '↗';
font-family: var(--mono);
margin-left: 12px;
opacity: 0.6;
}
.verify-empty {
margin-top: 12px;
padding: 10px 14px;
background: var(--gold-tint);
border-left: 3px solid var(--gold);
font-family: var(--serif);
font-style: italic;
font-size: 13.5px;
line-height: 1.5;
color: var(--ink);
}
/* AI SHARPEN PANEL */
.help-toggle.ai {
border-color: var(--red);
color: var(--red);
font-weight: 700;
}
.help-toggle.ai:hover { background: var(--red); color: var(--paper); }
.help-toggle.ai.active { background: var(--red); color: var(--paper); }
.ai-panel { background: var(--paper); border-color: var(--red); border-width: 2px; }
.ai-panel .ai-intro {
font-family: var(--serif);
font-size: 14px;
line-height: 1.5;
color: var(--ink);
margin-bottom: 12px;
}
.ai-go-btn {
display: inline-block;
padding: 10px 18px;
background: var(--red);
color: var(--paper);
border: none;
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.14em;
font-weight: 700;
cursor: pointer;
transition: background 0.15s ease;
}
.ai-go-btn:hover { background: var(--ink); }
.ai-go-btn:disabled { opacity: 0.5; cursor: default; }
.ai-loading {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 0;
font-family: var(--mono);
font-size: 12px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.ai-spinner {
width: 18px;
height: 18px;
border: 2px solid var(--paper-deep);
border-top-color: var(--red);
border-radius: 50%;
animation: aiSpin 0.7s linear infinite;
}
@keyframes aiSpin { to { transform: rotate(360deg); } }
.ai-error {
padding: 12px 14px;
background: var(--paper-warm);
border-left: 3px solid var(--red);
font-family: var(--serif);
font-size: 13.5px;
line-height: 1.5;
}
.ai-error code {
font-family: var(--mono);
font-size: 12px;
background: var(--paper-deep);
padding: 1px 5px;
}
.ai-result h6 {
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--muted);
font-weight: 700;
margin-bottom: 6px;
}
.ai-result p {
font-family: var(--serif);
font-size: 14px;
line-height: 1.55;
margin: 0;
}
.ai-score-row {
display: flex;
gap: 16px;
align-items: center;
padding-bottom: 14px;
border-bottom: 1px solid var(--paper-deep);
margin-bottom: 14px;
}
.ai-score {
flex: 0 0 auto;
width: 70px;
height: 70px;
border-radius: 50%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border: 3px solid;
font-family: var(--mono);
}
.ai-score-num {
font-size: 22px;
font-weight: 700;
line-height: 1;
}
.ai-score-label {
font-size: 9px;
text-transform: uppercase;
letter-spacing: 0.1em;
margin-top: 2px;
opacity: 0.7;
}
.ai-score-good { border-color: var(--green); color: var(--green); }
.ai-score-mid { border-color: var(--gold); color: var(--gold-deep); }
.ai-score-weak { border-color: var(--red); color: var(--red); }
.ai-score-text { flex: 1; min-width: 0; }
.ai-section {
padding: 14px 0;
border-bottom: 1px solid var(--paper-deep);
}
.ai-section:last-of-type { border-bottom: none; }
.ai-rewrite { background: var(--paper-warm); padding: 14px 16px; margin-top: 8px; }
.ai-rewrite-text {
font-style: italic;
margin-bottom: 12px !important;
}
.ai-use-btn {
padding: 7px 14px;
background: transparent;
color: var(--ink);
border: 1px solid var(--ink);
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 700;
cursor: pointer;
transition: all 0.15s ease;
}
.ai-use-btn:hover { background: var(--ink); color: var(--paper); }
.ai-use-btn:disabled {
background: var(--green-tint, #e8f5e8);
border-color: var(--green);
color: var(--green);
cursor: default;
}
.ai-attribution {
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--muted);
margin-top: 14px !important;
padding-top: 12px;
border-top: 1px solid var(--paper-deep);
line-height: 1.5 !important;
}
/* PAIN DISCOVERY GATE (Gate 00½) */
.pain-intro-callout {
background: var(--paper-warm);
border: 2px solid var(--ink);
padding: 18px 22px;
margin-bottom: 24px;
font-family: var(--serif);
font-size: 15px;
line-height: 1.55;
}
.pain-intro-callout strong { font-weight: 700; }
.pain-intro-callout .skip-row {
display: flex;
justify-content: flex-end;
margin-top: 12px;
}
.pain-cards-list {
display: flex;
flex-direction: column;
gap: 14px;
margin: 22px 0;
}
.pain-card {
border: 1px solid var(--ink);
background: var(--paper);
padding: 16px 18px;
position: relative;
}
.pain-card.is-lead {
border-width: 2px;
background: var(--gold-tint);
border-color: var(--gold);
}
.pain-card .card-head {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 12px;
margin-bottom: 10px;
padding-bottom: 8px;
border-bottom: 1px dotted var(--paper-deep);
}
.pain-card .card-num {
font-family: var(--mono);
font-size: 10px;
font-weight: 700;
color: var(--red);
letter-spacing: 0.15em;
}
.pain-card .card-actions {
display: flex;
gap: 6px;
}
.pain-card .card-grid {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
gap: 10px;
}
.pain-card .card-grid label {
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 700;
margin-bottom: 4px;
display: block;
color: var(--ink);
}
.pain-card input[type="text"],
.pain-card input[type="number"],
.pain-card textarea,
.pain-card select {
width: 100%;
padding: 8px 10px;
font-family: var(--sans);
font-size: 13px;
background: var(--paper);
border: 1px solid var(--ink);
color: var(--ink);
font-weight: 500;
border-radius: 0;
}
.pain-card.is-lead input,
.pain-card.is-lead textarea,
.pain-card.is-lead select {
background: #fff;
}
.pain-card textarea {
font-family: var(--serif);
min-height: 60px;
resize: vertical;
}
.pain-card .row-full { margin-top: 10px; }
.pain-card .row-full label {
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 700;
margin-bottom: 4px;
display: block;
}
.pain-card .quotes-block {
margin-top: 10px;
}
.pain-card .quote-row {
display: flex;
gap: 6px;
margin-bottom: 6px;
}
.pain-card .quote-row textarea {
flex: 1;
min-height: 38px;
}
.pain-card .quote-row .x-btn {
background: transparent;
border: 1px solid var(--paper-deep);
color: var(--muted);
font-family: var(--mono);
font-size: 12px;
padding: 0 8px;
cursor: pointer;
align-self: stretch;
}
.pain-card .quote-row .x-btn:hover {
border-color: var(--red);
color: var(--red);
}
.pain-card .add-quote-btn {
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
padding: 5px 10px;
background: transparent;
border: 1px dashed var(--ink);
color: var(--ink);
cursor: pointer;
margin-top: 4px;
}
.pain-card .add-quote-btn:hover {
background: var(--ink);
color: var(--paper);
border-style: solid;
}
.pain-card .lead-badge {
display: inline-block;
font-family: var(--mono);
font-size: 9px;
text-transform: uppercase;
letter-spacing: 0.15em;
background: var(--gold);
color: var(--paper);
padding: 2px 7px;
font-weight: 700;
margin-left: 6px;
vertical-align: middle;
}
.pain-card .cluster-pill {
display: inline-block;
font-family: var(--mono);
font-size: 9px;
text-transform: uppercase;
letter-spacing: 0.12em;
background: var(--paper-deep);
color: var(--ink);
padding: 2px 7px;
font-weight: 700;
margin-left: 6px;
vertical-align: middle;
}
.add-pain-card-btn {
display: block;
width: 100%;
padding: 14px;
background: transparent;
border: 2px dashed var(--ink);
font-family: var(--mono);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--ink);
cursor: pointer;
margin-top: 12px;
}
.add-pain-card-btn:hover {
background: var(--ink);
color: var(--paper);
border-style: solid;
}
.add-pain-card-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.add-pain-card-btn:disabled:hover {
background: transparent;
color: var(--ink);
border-style: dashed;
}
.lead-picker {
background: var(--paper-warm);
border-left: 4px solid var(--gold);
padding: 14px 18px;
margin: 22px 0;
}
.lead-picker h4 {
font-family: var(--mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--ink);
margin-bottom: 8px;
font-weight: 700;
}
.lead-picker .help {
font-family: var(--serif);
font-style: italic;
font-size: 13.5px;
color: var(--muted);
margin-bottom: 10px;
line-height: 1.4;
}
.voc-summary {
background: var(--ink);
color: var(--paper);
padding: 14px 18px;
margin: 22px 0 12px;
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.15em;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 10px;
}
.voc-summary .count {
font-family: var(--serif);
font-size: 28px;
font-weight: 900;
text-transform: none;
letter-spacing: 0;
line-height: 1;
color: #c9b88a;
}
.skip-pain-banner {
background: var(--paper);
border: 1px dashed var(--muted);
padding: 12px 16px;
margin: 16px 0;
font-family: var(--serif);
font-style: italic;
font-size: 13.5px;
color: var(--muted);
line-height: 1.5;
}
/* VOC VAULT INLINE BUTTON + POPOVER */
.voc-pull-btn {
display: inline-block;
margin-bottom: 6px;
padding: 5px 10px;
background: transparent;
border: 1px solid var(--gold);
color: var(--gold);
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 700;
cursor: pointer;
}
.voc-pull-btn:hover {
background: var(--gold);
color: var(--paper);
}
.voc-pull-btn:disabled {
opacity: 0.35;
cursor: not-allowed;
border-color: var(--paper-deep);
color: var(--muted);
}
.voc-pull-btn:disabled:hover {
background: transparent;
color: var(--muted);
}
.voc-popover {
position: fixed;
inset: 0;
z-index: 1100;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.voc-popover-backdrop {
position: absolute;
inset: 0;
background: rgba(10, 10, 10, 0.55);
}
.voc-popover-card {
position: relative;
max-width: 640px;
width: 100%;
background: var(--paper);
border: 4px solid var(--ink);
padding: 24px 28px;
max-height: 80vh;
overflow-y: auto;
box-shadow: 0 20px 60px rgba(0,0,0,0.25);
}
.voc-popover-card h3 {
font-family: var(--serif);
font-size: 22px;
margin-bottom: 6px;
}
.voc-popover-card .voc-help {
font-family: var(--serif);
font-style: italic;
font-size: 14px;
color: var(--muted);
margin-bottom: 14px;
line-height: 1.4;
}
.voc-popover-card .voc-quote {
padding: 12px 14px;
background: var(--paper-warm);
border-left: 3px solid var(--gold);
margin-bottom: 8px;
font-family: var(--serif);
font-size: 14px;
line-height: 1.5;
cursor: pointer;
transition: all 0.1s ease;
}
.voc-popover-card .voc-quote:hover {
background: var(--gold-tint);
border-left-color: var(--ink);
}
.voc-popover-card .voc-quote .src {
display: block;
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--muted);
font-style: normal;
margin-top: 6px;
}
.voc-popover-close {
position: absolute;
top: 10px;
right: 12px;
background: transparent;
border: none;
font-size: 26px;
line-height: 1;
cursor: pointer;
color: var(--muted);
padding: 4px 10px;
}
.voc-popover-close:hover { color: var(--ink); }
/* LEAD PAIN CONTEXT BANNER (shown on Gate 01 + Gate 03 when lead pain exists) */
.lead-context-banner {
background: var(--gold-tint);
border-left: 4px solid var(--gold);
padding: 12px 16px;
margin: 0 0 18px;
font-family: var(--serif);
font-size: 14px;
line-height: 1.5;
}
.lead-context-banner strong { font-weight: 700; }
.lead-context-banner .label {
font-family: var(--mono);
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--ink);
margin-right: 8px;
font-weight: 700;
}
/* MOBILE adjustments for pain cards */
@media (max-width: 720px) {
.pain-card .card-grid { grid-template-columns: 1fr; }
}
/* SETTINGS MODAL */
.settings-modal {
position: fixed;
inset: 0;
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.settings-backdrop {
position: absolute;
inset: 0;
background: rgba(10, 10, 10, 0.55);
}
.settings-card {
position: relative;
max-width: 540px;
width: 100%;
background: var(--paper);
border: 4px solid var(--ink);
padding: 28px 32px 24px;
box-shadow: 0 20px 60px rgba(0,0,0,0.25);
max-height: 90vh;
overflow-y: auto;
}
.settings-card h2 {
font-family: var(--serif);
font-size: 22px;
font-weight: 600;
margin: 0 0 8px;
}
.settings-intro {
font-family: var(--serif);
font-size: 14px;
line-height: 1.55;
color: var(--muted);
margin: 0 0 20px;
}
.settings-intro a { color: var(--ink); }
.settings-card label {
display: block;
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.15em;
font-weight: 700;
margin-bottom: 6px;
}
.settings-card input[type="password"] {
width: 100%;
padding: 10px 12px;
border: 2px solid var(--ink);
background: var(--paper-warm);
font-family: var(--mono);
font-size: 13px;
margin-bottom: 12px;
box-sizing: border-box;
}
.settings-card input[type="password"]:focus {
outline: none;
background: var(--paper);
}
.settings-status {
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.1em;
margin-bottom: 14px;
min-height: 16px;
color: var(--muted);
}
.settings-status.ok { color: var(--green); }
.settings-status.err { color: var(--red); }
.settings-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
flex-wrap: wrap;
}
.btn-mini.primary {
background: var(--ink);
color: var(--paper);
}
.settings-close-btn {
position: absolute;
top: 12px;
right: 14px;
background: transparent;
border: none;
font-size: 26px;
line-height: 1;
cursor: pointer;
color: var(--muted);
padding: 4px 10px;
}
.settings-close-btn:hover { color: var(--ink); }
.settings-details {
margin-top: 22px;
padding-top: 14px;
border-top: 1px solid var(--paper-deep);
font-family: var(--serif);
font-size: 13px;
line-height: 1.5;
color: var(--muted);
}
.settings-details summary {
cursor: pointer;
font-family: var(--mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 700;
color: var(--ink);
margin-bottom: 8px;
}
.settings-details p { margin: 0; }
/* PRINT */
@media print {
@page { size: Letter; margin: 0.6in; }
body { background: white; background-image: none; }
.app-header, .progress-rail, .header-actions, .action-row,
.gate-screen:not(#gate-summary), .resume-banner, .btn-mini, .btn,
.app-colophon { display: none !important; }
#gate-summary { display: block !important; }
.brief { border: none; padding: 0; margin: 0; }
.brief-section { page-break-inside: avoid; }
}
/* MOBILE */
@media (max-width: 720px) {
.app { padding: 20px 16px 60px; }
.app-header { grid-template-columns: 1fr; }
.header-actions { justify-content: flex-start; }
.progress-rail { grid-template-columns: repeat(17, 1fr); gap: 1px; }
.gate-cell { padding: 6px 2px; }
.gate-cell .name { display: none; }
.gate-cell .num { font-size: 10px; }
.choice-group.cols-2, .choice-group.cols-3, .grid-2 { grid-template-columns: 1fr; }
.scale { grid-template-columns: repeat(5, 1fr); }
.scale-btn { aspect-ratio: 1.5; }
.gate-screen h2 { font-size: 28px; }
.score-display { grid-template-columns: 1fr; text-align: left; }
.score-display .total { font-size: 42px; }
}
</style>
</head>
<body>
<div class="app">
<!-- HEADER -->
<header class="app-header">
<div>
<div class="meta">RISER · MVO Decision Engine · <span class="red">Captain's Logic</span></div>
<h1>Idea or <em>No Idea</em></h1>
<p class="deck">Sixteen gates from "what does the market actually hurt over?" to "compound the moat." At each gate: <strong>GO</strong>, <strong>NO</strong>, or <strong>REWORK</strong> — with the specific reason and next action. Built on Hormozi, Brunson, Kennedy, and Cialdini, with a Pain-Discovery import layer for PainOnSocial / VOC research. Designed to save you 90 days on a bad idea, or compress 90 days on a good one.</p>
</div>
<div class="header-actions">
<button class="btn-mini" id="btn-settings" title="API key settings">⚙ Settings</button>
<button class="btn-mini" id="btn-print">Print Brief</button>
<button class="btn-mini" id="btn-export">Export JSON</button>
<button class="btn-mini danger" id="btn-reset">Reset</button>
</div>
</header>
<!-- PROGRESS RAIL -->
<nav class="progress-rail" id="progress-rail" aria-label="Gate progress"></nav>
<!-- GATE SCREENS — populated by JS -->
<main id="gate-host"></main>
<!-- COLOPHON -->
<footer class="app-colophon">
<span>RISER Nation · Maritime Academy · MVO Decision Engine v1</span>
<span class="dot">·</span>
<span>Captain's Logic · 16 Gates · v3 · April 2026</span>
<span class="dot">·</span>
<span class="credit">Frameworks adapted from operator literature including Alex Hormozi's $100M Offers and $100M Leads.</span>
</footer>
</div>
<!-- API Key Settings Modal -->
<div id="settings-modal" class="settings-modal" style="display:none;">
<div class="settings-backdrop" data-settings-close></div>
<div class="settings-card">
<button class="settings-close-btn" data-settings-close aria-label="Close">×</button>
<h2>API Key Settings</h2>
<p class="settings-intro">The "Sharpen with AI" feature on Gate 01 calls the Anthropic API directly from your browser. Your key is stored only in this browser's localStorage. Get a key at <a href="https://console.anthropic.com" target="_blank" rel="noopener">console.anthropic.com</a> → API Keys.</p>
<label for="settings-key-input">Anthropic API Key</label>
<input type="password" id="settings-key-input" placeholder="sk-ant-..." autocomplete="off" spellcheck="false" />
<div class="settings-status" id="settings-status"></div>
<div class="settings-actions">
<button class="btn-mini danger" id="settings-clear">Clear key</button>
<button class="btn-mini" id="settings-cancel" data-settings-close>Cancel</button>
<button class="btn-mini primary" id="settings-save">Save</button>
</div>
<details class="settings-details">
<summary>Why direct browser access? (security note)</summary>
<p>Direct browser-to-Anthropic calls bypass the usual server-side proxy that hides your API key. For single-user, personal use this is acceptable: only you have access to this browser, and you can set spending caps in your Anthropic console. For any shared, public, or production use, deploy with a backend proxy instead.</p>
</details>
</div>
</div>
<!-- App logic begins here in next file -->
<script>
'use strict';
// ============================================================
// HORMOZI MVO DECISION ENGINE — Gate Definitions
// ============================================================
// Source attribution legend:
// All gates teach RISER Captain's Logic — operating doctrine refined
// across multiple operator playbooks and stress-tested in live launches.
// Each gate cites the specific maritime metaphor + operating principle.
const GATES = [
// ----------------------------------------------------------
// GATE 0 — INTRO / LANDING
// ----------------------------------------------------------
{
id: 'intro',
num: '00',
name: 'Start',
title: 'Welcome to the <em>MVO Engine</em>',
rubric: 'How this works',
isIntro: true
},
// ----------------------------------------------------------
// GATE 0½ — PAIN DISCOVERY (PainOnSocial / VOC import)
// ----------------------------------------------------------
{
id: 'paindiscovery',
num: '00½',
name: 'Pain Discovery',
title: 'Import the <em>voice of the customer</em>',
rubric: 'Gate 00½ · Pain Import',
principle: {
text: '"Operators who guess at pain build for themselves. Operators who import pain build for the market. The most expensive line in any business is the one that begins, \'I think the customer wants...\' If you have run a PainOnSocial scan, a customer interview series, or any structured voice-of-customer research, paste the cards here. Every gate downstream gets sharper."',
source: 'RISER Captain\'s Logic · The Voice-of-Customer Manifest'
},
isPainDiscovery: true
},
// ----------------------------------------------------------
// GATE 1 — HUNGRY AVATAR CHECK
// ----------------------------------------------------------
{
id: 'avatar',
num: '01',
name: 'Hungry Avatar',
title: 'Is there a <em>starving crowd?</em>',
rubric: 'Gate 01 · Avatar',
principle: {
text: '"The most important thing you sell is not your product — it is the market you sell it into. A starving crowd is the difference between selling steak and selling sand. Get the market right and a mediocre offer wins. Get it wrong and the best offer in the world dies."',
source: 'RISER Captain\'s Logic · The Hungry Harbor Doctrine'
},
inputs: [
{
id: 'avatar_who',
type: 'textarea',
label: 'Who exactly is the avatar?',
help: 'Specific. "Marketing managers at SaaS companies between $5M–$20M ARR who are personally accountable for pipeline" — not "small business owners."',
placeholder: 'e.g., Solo accountants in their first year of practice, age 28-40, post-MBA, billing under $5K/month...',
aiSharpen: true,
examples: {
good: [
'Solo CPAs in their first 24 months of practice, billing under $7K/month, ages 32–45, who got their license post-Big-4 and now work from home offices in suburban metros.',
'In-house marketing leads at Series-B SaaS companies ($10M–$30M ARR), 2–4 years in role, personally accountable for pipeline, no SDR team yet, reporting to a CRO.'
],
bad: [
'Small business owners who want to grow.',
'Coaches and consultants looking for more clients.'
]
},
sharpen: [
'Can you describe what this person did last Tuesday between 9am and noon?',
'What is the difference between this avatar and the avatar one tier below them in income or experience?',
'If you walked into a room of 50 of them, what would they have in common that a stranger would notice in 30 seconds?'
],
verify: [
{ source: 'reddit', label: 'Search Reddit for this avatar' },
{ source: 'google_site_reddit', label: 'Google → Reddit posts about this niche' },
{ source: 'youtube', label: 'YouTube — see who already serves them' },
{ source: 'twitter', label: 'Twitter/X search — recent conversations' },
{ source: 'google_trends', label: 'Google Trends — keyword trajectory' },
{ source: 'indeed', label: 'Indeed — job postings (B2B avatars)' }
]
},
{
id: 'avatar_pain',
type: 'textarea',
label: 'What is the specific pain — in their words, not yours?',
help: 'Quote them. If you cannot quote them, you have not talked to them. Generic pain ("I want more clients") is not pain. Specific pain ("I lose 3 hours every Friday reconciling Stripe") is pain.',
placeholder: 'e.g., "I keep losing deals at the proposal stage and I do not know why"...',
aiSharpen: true,
vocPull: true,
examples: {
good: [
'"I send proposals on Monday and by Friday I get ghosted. I never know if it was the price, the scope, or that they just went with someone else."',
'"My pipeline looks fine on paper but I have not closed a deal in six weeks and I am starting to panic about payroll."'
],
bad: [
'They struggle with sales and need more leads.',
'They feel overwhelmed by the marketing landscape.'
]
},
sharpen: [
'Did you copy this pain from a real conversation, post, or interview — or did you write it yourself?',
'If yes, paste the source link or the conversation date. If no, that is the homework.',
'Does the pain include a specific time, place, or trigger? "Every Monday morning" beats "in general."'
],
verify: [
{ source: 'reddit_pain', label: 'Reddit — search this niche + pain words' },
{ source: 'google_site_reddit', label: 'Google → real complaints on Reddit' },
{ source: 'twitter_complaint', label: 'Twitter/X — "I hate" / "I cannot" rants' },
{ source: 'youtube_howto', label: 'YouTube — "how do I" + this niche, read comments' },
{ source: 'quora', label: 'Quora — search the active questions' }
]
},
{
id: 'avatar_size_purchasing',
type: 'scale',
label: 'Purchasing power — can they actually pay?',
help: 'Operating rule: target markets where buyers have demonstrated willingness to spend $1,000+ on similar problems already. 1 = broke audience, 10 = active buyers spending now.',
examples: {
good: [
'I see the avatar paying $200–$500/mo for similar SaaS tools, $2K–$5K for one-time courses, and $5K–$15K for done-with-you programs. Three competitors at this price point are profitable.',
'The category supports $497–$2,000 offers consistently — Skool groups in this niche have 50–200 paying members at $39–$99/mo.'
],
bad: [
'I think they would pay because the value is there.',
'My friend said he would pay for this.'
]
},
sharpen: [
'Name three real competitors charging $1,000+ on similar problems. Live URLs.',
'What is the average spend the avatar already makes on adjacent tools or services per month?',
'Have you seen at least one case study or income claim from a competitor in this category?'
],
verify: [
{ source: 'google_pricing', label: 'Google → competitor pricing pages' },
{ source: 'youtube_course', label: 'YouTube — search niche + "course"' },
{ source: 'reddit_pricing', label: 'Reddit — niche + "how much do you charge"' },
{ source: 'flippa', label: 'Flippa — actual transaction prices' },
{ source: 'indiehackers', label: 'Indie Hackers — operator revenue stories' }
]
},
{
id: 'avatar_size_growing',
type: 'scale',
label: 'Market trajectory — growing, flat, or shrinking?',
help: 'Growing markets forgive errors. Shrinking markets punish even great offers. 1 = dying category, 10 = exploding category.',
examples: {
good: [
'Google Trends shows 60% YoY increase on the category terms. Three new competitors entered the space in the last 18 months. Industry reports project 25–40% CAGR through 2028.',
'The category is mature/flat but with significant operator turnover — older incumbents losing share to newer operators with better positioning. Net opportunity is real.'
],
bad: [
'I feel like this market is growing.',
'AI is going to make this category bigger.'
]
},
sharpen: [
'What does Google Trends show for the top 3 keywords in this category, 5-year view?',
'How many new competitors entered the space in the last 24 months?',
'Is funding flowing into this category (VC deals, accelerator focus, M&A activity)?'
],
verify: [
{ source: 'google_trends', label: 'Google Trends — 5-year keyword trajectory' },
{ source: 'youtube', label: 'YouTube — channel growth in this niche' },
{ source: 'tiktok', label: 'TikTok — short-form trend in this niche' },
{ source: 'google_news', label: 'Google News — funding + launches' },
{ source: 'reddit_growth', label: 'Reddit — niche subreddit growth signals' }
]
},
{
id: 'avatar_size_easy',
type: 'scale',
label: 'Easy to reach — can you find them and message them?',
help: 'A perfect avatar you cannot reach is worthless. Pick avatars who hang out somewhere you can pay or post into. 1 = invisible, 10 = obvious channel.',
examples: {
good: [
'They aggregate in three subreddits with 50K+ members each, two private Slack groups, and one well-known LinkedIn hashtag with 100+ daily posts. I can reach 10K of them via Meta ads at $1.20 CPM.',
'There is a specific industry conference 2x/year, a trade publication with 30K subscribers, and a Telegram group of ~3,000 active members. Three reachable channels, no gatekeeper.'
],
bad: [
'I will reach them through SEO and content marketing.',
'I think LinkedIn would work.'
]
},
sharpen: [
'Name the top 3 specific places (URL/group/event) where this avatar gathers.',
'For each, what is the audience size and engagement level?',
'What does it cost (in dollars OR hours) to reach 100 of them per week?'
],
verify: [
{ source: 'reddit_communities', label: 'Reddit — find subreddits in this niche' },
{ source: 'google_site_reddit', label: 'Google → Reddit communities for this niche' },
{ source: 'youtube_channels', label: 'YouTube — channels serving this niche' },
{ source: 'twitter', label: 'Twitter/X — see who posts in this niche' },
{ source: 'facebook_groups', label: 'Google → public Facebook groups' }
]
},
{
id: 'avatar_pain_intensity',
type: 'scale',
label: 'Pain intensity — is this a top-3 problem for them right now?',
help: 'Top-3 pain = budget exists. Bottom-10 pain = nice-to-have, infinite sales cycle. 1 = mild annoyance, 10 = crisis.',
examples: {
good: [
'Customers describe this pain in their first 90 seconds of a sales call without prompting. 3 of last 5 prospects said this is the #1 reason they reached out.',
'I see this complaint in the top 5 posts every week in their primary subreddit. People say things like "I cannot keep doing this" and "I will pay anyone to fix this."'
],
bad: [
'It is a real problem and they need a solution.',
'I know it is painful because I felt it myself.'
]
},
sharpen: [
'Have you watched 3+ real prospects describe this pain unprompted?',
'Have they used emotional language ("I hate," "I cannot keep doing," "I am desperate") or transactional language ("it would be nice")?',
'Is the pain felt regularly (daily/weekly) or only in specific moments?'
],
verify: [
{ source: 'reddit_pain_intensity', label: 'Reddit — emotional pain language search' },
{ source: 'youtube_howto', label: 'YouTube — "how do I" + niche, read top comments' },
{ source: 'twitter_complaint', label: 'Twitter/X — frustrated rants in this niche' },
{ source: 'quora', label: 'Quora — desperate questions in this niche' },
{ source: 'reddit_top', label: 'Reddit — sort top posts by month, this niche' }
]
}
]
},
// ----------------------------------------------------------
// GATE 2 — IDEA OR NO-IDEA FILTER
// ----------------------------------------------------------
{
id: 'idea',
num: '02',
name: 'Idea / No Idea',
title: 'Does the <em>idea earn the slot?</em>',
rubric: 'Gate 02 · Filter',
principle: {
text: '"There are four things that determine whether a market is worth attacking: massive pain, purchasing power, easy to target, and growing. If three of four are true, you have a great market. If two, you have a hard road. If one, you have a hobby. Most people pick markets based on what they know, not on whether the market deserves their next twelve months."',
source: 'RISER Captain\'s Logic · The Four-Quadrant Territory Test'
},
inputs: [
{
id: 'idea_one_sentence',
type: 'textarea',
label: 'State the offer in one sentence — for whom, what outcome, by when.',
help: 'Format: "I help [avatar] get [outcome] in [timeframe] without [common objection]." If you cannot fit it in one sentence, the offer is unclear.',
placeholder: 'e.g., I help solo accountants land their first 10 retainer clients in 90 days without cold outreach.'
},
{
id: 'idea_competition',
type: 'choice',
label: 'What is the competitive reality?',
help: 'RISER doctrine: "If no one is doing it, that is usually a sign no one wants it." Competition validates demand. Absence of competition is rarely a moat — it is usually a graveyard.',
cols: 1,
options: [
{ value: 'busy', label: 'Crowded market with successful operators', sub: 'Best signal. Demand is proven. You differentiate, not invent.' },
{ value: 'mid', label: 'Some competitors, mostly mediocre', sub: 'Strong signal. Real demand, weak supply. Most opportunities live here.' },
{ value: 'thin', label: 'Almost no competition', sub: 'Caution. Either you found gold OR no one wants this. Default to second.' },
{ value: 'none', label: 'I will be first', sub: 'Almost always wrong. "First mover" usually means "first to die."' }
]
},
{
id: 'idea_money_now',
type: 'choice',
label: 'The $100 today test — would 10 of these people pay $100 right now for a janky v1?',
help: 'From the Profitable Widget Playbook (and the "presell before build" doctrine). If you cannot picture 10 specific names paying $100 today, the idea is theoretical.',
cols: 1,
options: [
{ value: 'named', label: 'Yes — I can name the 10 people right now', sub: 'GO signal. You have proximity to demand.' },
{ value: 'maybe', label: 'Probably — but I would have to find them', sub: 'REWORK. Until you can name them, you do not have an avatar — you have a hypothesis.' },
{ value: 'no', label: 'No — this would take weeks of marketing first', sub: 'NO. The marketing required to find them IS the validation. Do that before building.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 3 — PROFITABLE PROBLEM ANGLE
// ----------------------------------------------------------
{
id: 'problem',
num: '03',
name: 'Profitable Problem',
title: 'Is this a <em>painful, urgent, recurring</em> problem?',
rubric: 'Gate 03 · Problem',
principle: {
text: '"Every problem is not a profitable problem. Profitable problems share three features: high pain, high frequency, high cost-of-not-solving. If the problem only happens once and the cost of ignoring it is low, you are not in a business — you are in charity. The best businesses solve problems the customer pays you to keep solving."',
source: 'RISER Captain\'s Logic · The Profitable-Pain Calibration'
},
inputs: [
{
id: 'problem_specific',
type: 'textarea',
label: 'State the exact problem in one sentence.',
help: 'Use the customer\'s words. "They cannot get to inbox zero" is a problem. "Productivity" is a category.',
placeholder: 'e.g., They spend 8+ hours/week on manual invoice reconciliation and miss billing.',
vocPull: true
},
{
id: 'problem_frequency',
type: 'choice',
label: 'How often does the problem recur?',
help: 'Recurring pain = recurring revenue. One-and-done pain = transactional revenue with high re-acquisition cost.',
cols: 1,
options: [
{ value: 'daily', label: 'Daily or weekly', sub: 'Best. Continuity offer fits naturally. LTV compounds.' },
{ value: 'monthly', label: 'Monthly', sub: 'Strong. Subscription rhythm available.' },
{ value: 'quarterly', label: 'Quarterly or seasonal', sub: 'Moderate. Service-based or annual offer fits.' },
{ value: 'once', label: 'Once-in-a-lifetime / project-based', sub: 'Weakest. Every customer is a re-acquisition.' }
]
},
{
id: 'problem_cost',
type: 'choice',
label: 'What is the cost of NOT solving the problem?',
help: 'RISER doctrine: "Price is set by the cost of the problem, not the cost of the solution." High cost of inaction = pricing power.',
cols: 1,
options: [
{ value: 'high', label: 'High — losing money, customers, or status', sub: 'Premium pricing available. Sell against the loss.' },
{ value: 'moderate', label: 'Moderate — friction and frustration', sub: 'Mid-tier pricing. Sell against the time-drain.' },
{ value: 'low', label: 'Low — minor inconvenience', sub: 'Hard to monetize. Reframe to find higher-cost angle, or pick different problem.' }
]
},
{
id: 'problem_existing_solutions',
type: 'textarea',
label: 'What do they currently do to solve it (or fail to)?',
help: 'Name competitors AND non-consumption alternatives ("they just suffer", "they ask their CPA", "they Google it"). The status quo IS the competition.',
placeholder: 'e.g., They use spreadsheets, hire a part-time bookkeeper, or just get behind and panic at tax time.'
}
]
},
// ----------------------------------------------------------
// GATE 4 — GRAND SLAM OFFER BUILDER
// ----------------------------------------------------------
{
id: 'offer',
num: '04',
name: 'Grand Slam Offer',
title: 'Score the offer on <em>the Value Equation</em>',
rubric: 'Gate 04 · Offer',
principle: {
text: '"Value = (Dream Outcome × Perceived Likelihood) ÷ (Time Delay × Effort & Sacrifice). To make any offer better, do one of four things: increase the dream outcome, increase perceived likelihood, decrease time delay, or decrease effort. The numerator is what they want. The denominator is what they pay in pain. Move both."',
source: 'RISER Captain\'s Logic · The Cargo Value Equation'
},
inputs: [
{
id: 'offer_dream',
type: 'textarea',
label: 'Dream Outcome — what is the explicit transformation?',
help: 'Specific, vivid, measurable. "10 paying clients in 90 days, working from home, charging $2K/mo retainers." NOT "more freedom."',
placeholder: 'e.g., Land 10 retainer clients at $2K/mo within 90 days, working under 25 hrs/week.',
vocPull: true
},
{
id: 'offer_dream_score',
type: 'scale',
label: 'Dream Outcome strength (1-10)',
help: 'How emotionally compelling is the outcome? Would the avatar pay 10× to skip 5 years of pain to get there? 1 = mild benefit, 10 = life-changing.'
},
{
id: 'offer_likelihood',
type: 'textarea',
label: 'Perceived Likelihood — what is your proof that this works?',
help: 'RISER doctrine: "Stack proof until it gets ridiculous." Case studies, screenshots, testimonials, your own results, third-party validation. List what you have right now.',
placeholder: 'e.g., 3 case studies with named results, my own $0-$50K journey, 47 customer testimonials...'
},
{
id: 'offer_likelihood_score',
type: 'scale',
label: 'Perceived Likelihood (1-10)',
help: 'Looking at the proof above through skeptical buyer eyes — how believable is the promise? 1 = vapor, 10 = undeniable.'
},
{
id: 'offer_time_delay',
type: 'choice',
label: 'Time Delay — how fast does the customer feel results?',
help: 'Speed beats almost every other lever in mid-market offers. The faster the first win, the higher the conversion AND retention.',
cols: 1,
options: [
{ value: 'instant', label: 'Within 24 hours of purchase', sub: 'Premium pricing power. Speed is the moat.' },
{ value: 'week', label: 'Within first week', sub: 'Strong. Engineer a Day-1 quick win.' },
{ value: 'month', label: 'Within first 30 days', sub: 'Acceptable. Add interim wins to maintain momentum.' },
{ value: 'months', label: 'Months to first measurable result', sub: 'Hard. Refund risk high. Add quick wins or refund-and-pivot.' }
]
},
{
id: 'offer_effort',
type: 'choice',
label: 'Effort & Sacrifice — what does the customer have to DO?',
help: 'Done-with-you beats DIY. Done-for-you beats both. Every step you remove from the customer\'s plate raises perceived value.',
cols: 1,
options: [
{ value: 'dfy', label: 'Done-for-you — they barely lift a finger', sub: 'Highest pricing tier ($5K-$50K+). Limited delivery capacity.' },
{ value: 'dwy', label: 'Done-with-you — guided implementation', sub: 'Mid-tier sweet spot ($1K-$5K). Best price-to-effort ratio.' },
{ value: 'diy', label: 'DIY with templates and support', sub: 'Lower tier ($97-$997). Higher volume possible.' },
{ value: 'self', label: 'Self-paced with no human contact', sub: 'Lowest tier ($7-$297). Highest churn. Compete on volume only.' }
]
},
{
id: 'offer_mechanism',
type: 'textarea',
label: 'Named Mechanism — what is your proprietary process called, and why does it work differently?',
help: 'RISER doctrine: "A named mechanism is the difference between a $97 product and a $4,997 program containing the same content." Give your method a name (The Retainer Method®, The 90-Day Pulse™, The 4-Lane Framework). Then in one sentence explain why it works when generic approaches fail.',
placeholder: 'e.g., The Retainer Method™ — a 4-week sprint that replaces hourly billing with outcome-based packages by pre-selling 90 days of work in a single 30-minute conversation. Works because it inverts the proposal cycle: outcome first, scope second.'
}
]
},
// ----------------------------------------------------------
// GATE 4½ — OFFER STACK CONSTRUCTOR (Hormozi $100M Offers)
// ----------------------------------------------------------
{
id: 'stack',
num: '04½',
name: 'Offer Stack',
title: 'Build the <em>Grand Slam Stack</em>',
rubric: 'Gate 04½ · Stack',
principle: {
text: '"The naked core offer is never the offer. The offer is the core PLUS the stack: bonuses that solve the next three problems before they happen, a guarantee that flips the risk to you, scarcity that creates a real reason to act now, and a name that makes it sound like a thing rather than a thing-you-do. Every component you remove costs you 10% of conversion."',
source: 'RISER Captain\'s Logic · The Grand Slam Stack Doctrine'
},
inputs: [
{
id: 'stack_offer_name',
type: 'text',
label: 'Offer name — what do you call this thing?',
help: 'A named offer is a thing. An unnamed offer is a description. "The 90-Day Retainer Sprint" beats "my coaching program" by 30% on conversion. Use a number, an outcome word, or both.',
placeholder: 'e.g., The 90-Day Retainer Sprint · The First-10-Clients Accelerator · Founding Pulse Cohort'
},
{
id: 'stack_bonuses',
type: 'textarea',
label: 'Bonuses — name 3 to 5 bonuses, each solving the NEXT problem the customer will hit.',
help: 'Operating rule: bonuses are not "extras" — they are pre-emptive solutions to the objections the buyer has not yet voiced. Format: "Bonus 1: [Name] — [Outcome] — [Standalone value $X]." Each bonus needs a name, a result, and a price-anchor.',
placeholder: 'Bonus 1: The First-Client Script Library — 7 sales scripts that closed real deals — $497 value\nBonus 2: The Retainer Pricing Calculator — 3 pricing tiers with anchor logic — $297 value\nBonus 3: The 30-Day Onboarding SOP — copy-paste client-onboarding system — $997 value'
},
{
id: 'stack_guarantee_type',
type: 'choice',
label: 'Guarantee type — what risk are you absorbing?',
help: 'RISER doctrine: "If you will not stand behind your offer with a guarantee, neither will they." Hormozi\'s ladder: implied < unconditional < conditional < anti-guarantee. Pick the strongest your unit economics can absorb.',
cols: 1,
options: [
{ value: 'anti', label: 'Anti-guarantee — "no refunds, here is why"', sub: 'Boldest. Requires extreme trust + filtering. Not for first launch.' },
{ value: 'conditional', label: 'Conditional — "do X, Y, Z and if no result, double your money back"', sub: 'Best for most operators. Forces customer accountability + dramatic risk reversal.' },
{ value: 'unconditional', label: 'Unconditional — "30-day no-questions-asked refund"', sub: 'Standard. Lowest friction, highest refund risk. Use if delivery is bulletproof.' },
{ value: 'implied', label: 'Implied — "we are confident you will love it"', sub: 'Weakest. Not really a guarantee. Will halve conversion vs. any explicit guarantee.' },
{ value: 'none', label: 'No guarantee', sub: 'Almost always wrong. The buyer absorbs the risk and your conversion craters.' }
]
},
{
id: 'stack_guarantee_text',
type: 'textarea',
label: 'Write the guarantee — exact words you will use on the page.',
help: 'Specificity wins. "30-day money-back" beats "guaranteed." "If you don\'t land 3 retainer clients in 60 days, I work with you free until you do" beats "30-day money-back."',
placeholder: 'e.g., Land 3 retainer clients in 60 days or I work with you free until you do — and you keep all the bonuses.'
},
{
id: 'stack_scarcity',
type: 'choice',
label: 'Scarcity mechanism — what makes "buy now" real, not theatrical?',
help: 'Cialdini: scarcity drives action only when it is REAL. Fake countdown timers train your audience to ignore you. Pick a scarcity that is structurally true.',
cols: 1,
options: [
{ value: 'cohort', label: 'Cohort cap — "12 founding members, then closed for 90 days"', sub: 'Best for service/cohort offers. Real, defensible, repeatable.' },
{ value: 'price', label: 'Founding price — "locked at $497 for first 25, then $1,497"', sub: 'Strong. Real reason to act now. Price ladder must be enforced.' },
{ value: 'bonus', label: 'Bonus expiration — "Bonus 3 disappears after Friday"', sub: 'Workable. The bonus must actually go away or trust dies.' },
{ value: 'window', label: 'Launch window — "open Monday, closed Friday"', sub: 'Strong if true. Brunson\'s preferred mechanism. Requires real close.' },
{ value: 'fake', label: 'Fake countdown / inflated urgency', sub: 'NEVER. One discovery and you lose the audience permanently.' },
{ value: 'none', label: 'No scarcity', sub: 'Wrong. The buyer has no structural reason to decide today.' }
]
},
{
id: 'stack_total_value',
type: 'text',
label: 'Stack total value — sum of core + all bonuses (anchor price)',
help: 'Cialdini contrast principle: a $497 price next to no anchor looks expensive. A $497 price next to a $5,991 stack value looks like a steal. Add up your core + bonus prices honestly.',
placeholder: 'e.g., 5991'
},
{
id: 'stack_actual_price',
type: 'text',
label: 'Actual offer price (USD)',
help: 'The price the customer pays. Should be a fraction (typically 1/5 to 1/10) of the stack total above. If the ratio is less than 3:1, your stack is too thin or your price is too high.',
placeholder: 'e.g., 497'
}
]
},
// ----------------------------------------------------------
// GATE 5 — CORE FOUR DISTRIBUTION
// ----------------------------------------------------------
{
id: 'distribution',
num: '05',
name: 'Core Four',
title: 'Pick <em>one</em> of the four ways to get leads',
rubric: 'Gate 05 · Distribution',
principle: {
text: '"There are four ways to get a stranger to know about you: warm outreach, cold outreach, warm content, paid ads. That is it. Every business runs one or more of these. The mistake is picking three at the start. Pick ONE. Get to 100 customers from that one. Then add the next."',
source: 'RISER Captain\'s Logic · The Core Four Shipping Lanes'
},
inputs: [
{
id: 'dist_primary',
type: 'choice',
label: 'Pick your primary channel (one only).',
help: 'Operating rule: master one before adding another. The operator who runs LinkedIn cold outreach 5 days a week for 12 weeks beats the operator who tries 4 channels.',
cols: 2,
options: [
{
value: 'warm_outreach',
label: 'Warm outreach',
sub: 'DM/email people who already know you. Best for first 10 customers. Free. Low volume.'
},
{
value: 'cold_outreach',
label: 'Cold outreach',
sub: 'DM/email strangers at scale. Best when avatar is identifiable + reachable. Cheap. Skill-intensive.'
},
{
value: 'warm_content',
label: 'Warm content',
sub: 'Post valuable content to your audience. Compounds over time. Slow start.'
},
{
value: 'paid_ads',
label: 'Paid ads',
sub: 'Pay platforms to put your offer in front of strangers. Requires unit economics first. Fastest scaling.'
}
]
},
{
id: 'dist_volume',
type: 'textarea',
label: 'Volume math — how many touches per day to hit your numbers?',
help: 'RISER doctrine: "More is the answer. Always more." If you need 10 customers in 90 days at 1% conversion, you need 1,000 conversations = ~12/day. Do the math now.',
placeholder: 'e.g., 50 cold DMs/day × 5 days/week × 12 weeks = 3,000 conversations. At 1% close = 30 customers.'
},
{
id: 'dist_unit_econ',
type: 'choice',
label: 'Do you know your unit economics?',
help: 'Required before paid ads. Optional but useful for organic.',
cols: 1,
options: [
{ value: 'yes', label: 'Yes — I know CAC, LTV, payback period', sub: 'GO. Paid ads viable when CAC < 1/3 of 12-month LTV.' },
{ value: 'partial', label: 'Partially — rough estimates only', sub: 'Use organic until estimates become real numbers.' },
{ value: 'no', label: 'No — pre-revenue', sub: 'Stay organic. Paid ads will burn cash with no feedback loop.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 5½ — DREAM 100 (Brunson · Traffic Secrets)
// ----------------------------------------------------------
{
id: 'dream100',
num: '05½',
name: 'Dream 100',
title: 'Name the <em>100 people who own your audience</em>',
rubric: 'Gate 05½ · Dream 100',
principle: {
text: '"You do not need to find a million strangers. You need to find the 100 people who already gathered them. Every audience you want to reach has been pre-built by 100 specific operators — podcasters, newsletter writers, YouTubers, Skool group owners, association heads, top affiliates. Borrow their boats. Do not build your own dock from scratch."',
source: 'RISER Captain\'s Logic · The Dream 100 Convoy'
},
inputs: [
{
id: 'dream100_list',
type: 'textarea',
label: 'List 25 specific people, podcasts, newsletters, or groups your avatar already follows.',
help: 'Named handles. Real URLs. Not "fitness influencers" — but "@HybridAthlete", "ATG for Life YouTube", "Knees Over Toes Skool group", "Ben Patrick Substack". The first 25 take 2 hours of research. Skip this and you build distribution from zero.',
placeholder: 'e.g.,\n1. @hormozi (Twitter, 2.1M followers)\n2. The My First Million podcast\n3. Indie Hackers community (newsletter)\n4. SaaStr Skool group\n5. ...continue to 25'
},
{
id: 'dream100_strategy',
type: 'choice',
label: 'Primary Dream 100 strategy',
help: 'Brunson\'s framing: there are only three ways in. Pick one. Working two strategies on the same Dream 100 person at the same time = burned bridge.',
cols: 1,
options: [
{ value: 'work_in', label: 'Work your way in — provide value first, become known', sub: 'Slowest, most durable. Comment, share, send wins. 90 days to first invitation.' },
{ value: 'buy_in', label: 'Buy your way in — sponsor, advertise, run paid promo', sub: 'Fastest. Costs money. Use when you have unit economics.' },
{ value: 'partner', label: 'Partner — co-create, joint venture, revenue share', sub: 'Highest leverage. Requires you bring something they need.' }
]
},
{
id: 'dream100_first_outreach',
type: 'textarea',
label: 'First-touch script — what you will send to the first 10.',
help: 'No pitch. No ask. The first message is gift-only. Quote them, share a result, send a resource. Reciprocity is built before the ask is made. Cialdini\'s rule: the gift comes first or the ask is dead.',
placeholder: 'e.g., "Hey [Name] — just used your retainer-pricing framework with 3 clients. Closed 2 at $4K/mo. Wanted to send a thank-you and the case study screenshots. No ask, just gratitude."'
},
{
id: 'dream100_volume',
type: 'choice',
label: 'Outreach volume — how many Dream 100 contacts per week?',
help: 'Brunson: 100 contacts in a week is not unreasonable. 100 in a year means you do not believe in the strategy. The Dream 100 is a daily action, not a quarterly project.',
cols: 1,
options: [
{ value: 'high', label: '20+ per week', sub: 'Best. Compounds fast. By month 3 you are known in the niche.' },
{ value: 'medium', label: '5–20 per week', sub: 'Workable. Slower compound. 6+ months to network density.' },
{ value: 'low', label: '<5 per week', sub: 'Too slow. The Dream 100 stops working below this volume.' },
{ value: 'none', label: 'Not yet doing it', sub: 'NO. The Dream 100 is the highest-leverage activity in early growth. Start today.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 6 — HOOK / HEADLINE / BODY
// ----------------------------------------------------------
{
id: 'copy',
num: '06',
name: 'Hook / Body',
title: 'Write the <em>hook, headline, and body</em>',
rubric: 'Gate 06 · Copy',
principle: {
text: '"You have three seconds. The hook stops the scroll. The headline promises the dream. The body proves you can deliver. Most copy fails at the hook, blames the product. The hook is not a creative challenge — it is a calling-out exercise. Call out the avatar by their pain, by name, in the words they use about themselves."',
source: 'RISER Captain\'s Logic · The Three-Second Signal Flare'
},
inputs: [
{
id: 'copy_hook',
type: 'textarea',
label: 'Hook — first 3 seconds. What stops the scroll?',
help: 'Hook formats that work: callout question ("Solo accountants — are you charging by the hour?"), pattern interrupt ("I fired my agency yesterday."), specific stat ("47% of [avatar] do this wrong"). Avoid clever; choose clear.',
placeholder: 'e.g., Solo accountants under $5K/mo: stop trading hours for dollars by Q2.',
vocPull: true
},
{
id: 'copy_headline',
type: 'textarea',
label: 'Headline — the promise.',
help: 'Format: [Outcome] in [Timeframe] without [Objection]. Specific outcome, specific timeframe, named objection removed. Use numbers when possible.',
placeholder: 'e.g., Land 10 retainer clients at $2K/mo within 90 days — without cold outreach, paid ads, or a website rebuild.',
vocPull: true
},
{
id: 'copy_body',
type: 'textarea',
label: 'Body — proof + mechanism + call-to-action.',
help: '5-line skeleton: Problem · What\'s working now · How it works (named mechanism) · Proof · Specific CTA. Keep under 100 words for ads, under 250 for landing pages.',
placeholder: 'Most solo accountants are stuck billing by the hour, capping income at 40 hrs × $X. The shift is to retainer-based packages priced on outcomes, not time. The Retainer Method® gets accountants from hourly to $2K/mo retainer in 90 days...',
vocPull: true
},
{
id: 'copy_cta',
type: 'choice',
label: 'Call-to-action specificity',
help: 'Vague CTAs ("learn more") convert at half the rate of specific CTAs ("get the 5-page retainer template + 90-day guide").',
cols: 1,
options: [
{ value: 'specific', label: 'Named asset + specific outcome', sub: 'Best. "Get the 5-page Retainer Pricing Calculator." Concrete object.' },
{ value: 'mid', label: 'Action verb + topic', sub: 'OK. "Apply for a strategy call." "Download the playbook."' },
{ value: 'vague', label: 'Generic ("learn more")', sub: 'Weakest. Rewrite before deploy.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 6½ — PERSUASION ARCHITECTURE (Cialdini · Brunson · Kennedy)
// ----------------------------------------------------------
{
id: 'persuasion',
num: '06½',
name: 'Persuasion',
title: 'Audit the <em>persuasion architecture</em>',
rubric: 'Gate 06½ · Persuasion',
principle: {
text: '"Copy is downstream of persuasion. Most operators write copy and hope persuasion happens. The reverse is correct: identify the one belief you must break, the seven psychological levers your page activates, and the lead magnet that creates reciprocity before the ask. Copy is the surface; persuasion is the structure underneath."',
source: 'RISER Captain\'s Logic · The Persuasion Architecture'
},
inputs: [
{
id: 'persuasion_big_domino',
type: 'textarea',
label: 'The Big Domino — what is the ONE belief you must break for the sale to happen?',
help: 'Brunson\'s One Big Domino: "If I can make my prospect believe ONE thing is true, all other objections become irrelevant." Format: "If they believe [X], then they will buy." Make it specific to your avatar and your offer\'s mechanism.',
placeholder: 'e.g., If solo accountants believe that retainer pricing is achievable in 90 days without losing their existing hourly clients, the rest of the offer sells itself.'
},
{
id: 'persuasion_false_beliefs',
type: 'textarea',
label: 'False Belief Audit — name the 3 false beliefs blocking the sale.',
help: 'Brunson\'s 3-belief framework: (1) belief about the VEHICLE ("retainer pricing only works for big firms"), (2) belief about THEMSELVES ("I am too new to charge that much"), (3) belief about EXTERNAL ("my market is too price-sensitive"). Name one of each.',
placeholder: 'Vehicle: "Retainers only work for established firms with reputations."\nSelf: "I do not have the credibility to charge $2K/mo yet."\nExternal: "My local market will not pay retainer rates."'
},
{
id: 'persuasion_lead_magnet',
type: 'textarea',
label: 'Reciprocity gift — what do you GIVE before you ask?',
help: 'Cialdini\'s reciprocity rule: the gift comes first or the ask is dead. Brunson\'s Bait. Hormozi\'s Lead Magnet. Specific, useful, immediate. Not "a free guide" — a named, valuable asset.',
placeholder: 'e.g., The Retainer Pricing Calculator — 3-tier model with anchor logic + 5 sample proposals that closed real $2K-$5K/mo deals. PDF + Notion template. 7 minutes to use.',
vocPull: true
},
{
id: 'persuasion_reciprocity',
type: 'choice',
label: 'Reciprocity — does your funnel give before it asks?',
help: 'Cialdini\'s most under-leveraged principle. The lead magnet, the free workshop, the pre-call resource. Without a gift first, the ask sounds like a demand.',
cols: 1,
options: [
{ value: 'strong', label: 'Strong — named, useful asset given freely before any pitch', sub: 'GO. Reciprocity debt is established.' },
{ value: 'weak', label: 'Weak — generic "newsletter" or "free webinar"', sub: 'REWORK. Generic gifts are not gifts. Make it specific and valuable.' },
{ value: 'none', label: 'None — direct pitch, no gift', sub: 'NO. Cold ask without reciprocity converts at 1/3 the rate.' }
]
},
{
id: 'persuasion_social_proof',
type: 'choice',
label: 'Social Proof — what density and similarity?',
help: 'Cialdini: people follow people who look like them. 3 testimonials from people who match the avatar exactly beat 30 generic testimonials. Specificity > volume.',
cols: 1,
options: [
{ value: 'high', label: '5+ testimonials from avatar-similar customers, with named results', sub: 'GO. Strong proof density. Names, photos, specific numbers.' },
{ value: 'medium', label: '2-4 testimonials, partial similarity', sub: 'REWORK. Stack more, get exact-avatar matches.' },
{ value: 'low', label: '0-1 testimonials OR generic praise', sub: 'NO. The proof gap is the conversion gap. Get 3 specific testimonials before launch.' }
]
},
{
id: 'persuasion_authority',
type: 'choice',
label: 'Authority — what credentials, results, or associations are visible?',
help: 'Cialdini: people defer to expertise. Specific results > vague credentials. "Built and sold a $4M agency" beats "12 years experience." Numbers + names + outcomes.',
cols: 1,
options: [
{ value: 'strong', label: 'Strong — specific track record, results, or recognized association', sub: 'GO. Authority is unambiguous.' },
{ value: 'borrowed', label: 'Borrowed — endorsement from named authority figure', sub: 'Workable. Borrowed authority is real authority if attributed.' },
{ value: 'thin', label: 'Thin — generic credentials, no specific results', sub: 'REWORK. Replace credentials with results. Numbers > letters after your name.' }
]
},
{
id: 'persuasion_unity',
type: 'choice',
label: 'Unity — does your copy use shared-identity language?',
help: 'Cialdini\'s 7th principle (the most overlooked): "we," "us," "our kind," "people like us." Tribe language. The avatar should feel they belong to a group, not a market segment.',
cols: 1,
options: [
{ value: 'strong', label: 'Strong — explicit shared identity, named tribe', sub: 'Best. "Solo accountants who refuse to bill by the hour."' },
{ value: 'medium', label: 'Implicit — written for the avatar but no tribe naming', sub: 'OK. Add explicit identity language for 20% conversion lift.' },
{ value: 'absent', label: 'Absent — generic "you" with no identity layer', sub: 'REWORK. Name the tribe.' }
]
},
{
id: 'persuasion_consistency',
type: 'choice',
label: 'Consistency — what small "yes" do you secure before the big yes?',
help: 'Cialdini: people stay consistent with prior commitments. The micro-yes (download, quiz, opt-in, free call) creates the consistency pressure that makes the macro-yes feel natural.',
cols: 1,
options: [
{ value: 'multistep', label: 'Multi-step funnel — opt-in → engagement → ask', sub: 'Best. Each step is a small yes.' },
{ value: 'singlestep', label: 'Single-step — direct ask, no priming', sub: 'REWORK. Add at least one micro-commitment before the ask.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 7 — DEPLOY GATE
// ----------------------------------------------------------
{
id: 'deploy',
num: '07',
name: 'Deploy',
title: '<em>Ship</em> the minimum viable launch',
rubric: 'Gate 07 · Deploy',
principle: {
text: '"Done beats perfect every single time. The launch you do not run cannot teach you anything. The launch that embarrasses you in 12 months is the right launch — anything you ship today that you would still be proud of in a year was over-engineered. Ship in 30 days. The market is the editor."',
source: 'RISER Captain\'s Logic · The Launch-Ugly Doctrine'
},
inputs: [
{
id: 'deploy_date',
type: 'text',
label: 'Beta launch date (specific calendar date, ≤ 30 days out)',
help: 'A date is not a commitment until it is signed. Pick a Friday. Tell another operator. Make it expensive to slip.',
placeholder: 'e.g., 2026-05-23'
},
{
id: 'deploy_size',
type: 'choice',
label: 'Beta cohort size',
help: 'Captain\'s rule for first launch: smaller is better. 10 over-served founding members produce 10× the testimonial density of 50 mediocre members. 0 is too few; 50 is too many.',
cols: 1,
options: [
{ value: 'tiny', label: '5–10 founding members', sub: 'Best for first-time launch. Over-serve. 10× testimonial density.' },
{ value: 'small', label: '10–25 members', sub: 'Strong. Workable delivery capacity.' },
{ value: 'medium', label: '25–50 members', sub: 'Risky on first launch. Delivery quality slips.' },
{ value: 'big', label: '50+ members', sub: 'Almost always wrong on first launch.' }
]
},
{
id: 'deploy_price',
type: 'text',
label: 'Beta price (single number, USD)',
help: 'Founding rate, locked. Avoid the "Muddled Middle" ($500–$900). Default for service/coaching: $497–$997 founding rate, future $1497–$1997. For productized: $97–$297 founding, future $297–$497.',
placeholder: 'e.g., 497'
},
{
id: 'deploy_kill_rule',
type: 'choice',
label: 'Kill rule — what happens if you do not hit the number?',
help: 'RISER doctrine: "If you cannot say what failure looks like in advance, you cannot tell the difference between a struggling launch and a dead launch." Kill rules protect from sunk-cost grinding.',
cols: 1,
options: [
{ value: 'tight', label: '< 5 paid in 14 days = pivot offer angle', sub: 'Best. Forces a decision before sunk cost compounds.' },
{ value: 'medium', label: '< 3 paid in 21 days = pivot', sub: 'Acceptable. Slightly slower trigger.' },
{ value: 'loose', label: 'I will keep going regardless', sub: 'Wrong answer. Define failure or it will define you.' }
]
},
{
id: 'deploy_4_tools',
type: 'choice',
label: 'Are the 4 minimum tools live?',
help: 'RISER minimum: a way to capture leads, a way to take payment, a way to deliver, a way to measure. Everything else is optional pre-launch.',
cols: 1,
options: [
{ value: 'all', label: 'All 4 live and tested', sub: 'GO.' },
{ value: 'three', label: '3 of 4 live', sub: 'REWORK. Name the missing one and ship it this week.' },
{ value: 'fewer', label: 'Fewer than 3', sub: 'NO. Tools are not the problem. Build the missing tools FIRST in the next 7 days.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 8 — ITERATE LOOP
// ----------------------------------------------------------
{
id: 'iterate',
num: '08',
name: 'Iterate',
title: '<em>Iterate</em> on real customer data',
rubric: 'Gate 08 · Iterate',
principle: {
text: '"Volume forgives mistakes. The operator who has 100 sales conversations in a month learns more than the operator who has 5 perfect ones. Iterate on data, not opinions. Talk to every customer. Ask the same five questions. After 30 conversations, the pattern is undeniable."',
source: 'RISER Captain\'s Logic · The Voyage Log Iteration Cycle'
},
inputs: [
{
id: 'iter_at_bats',
type: 'choice',
label: 'How many at-bats before iterating?',
help: 'Iterating after 3 calls = noise. Iterating after 30 calls = signal. Iterating after 300 = late.',
cols: 1,
options: [
{ value: 'enough', label: '20–30 sales conversations or 30+ users', sub: 'GO. Sample size large enough to see patterns.' },
{ value: 'partial', label: '10–20 conversations', sub: 'REWORK. Pattern unclear. Run 10 more before changing anything.' },
{ value: 'tiny', label: 'Fewer than 10', sub: 'NO. Iteration is premature. Get to 30 first.' }
]
},
{
id: 'iter_signal',
type: 'textarea',
label: 'What is the dominant pattern from real customers?',
help: 'RISER doctrine: "Customers tell you exactly what is wrong. Most operators do not believe them." What objection comes up most? What feature do they ignore? What outcome do they actually celebrate?',
placeholder: 'e.g., 7 of 10 customers say the templates worked but the live calls were too long. 3 dropped at week 4 because of pacing.'
},
{
id: 'iter_lever',
type: 'choice',
label: 'Which Value Equation lever do you adjust?',
help: 'Pick one. Changing all four at once is rebuild, not iterate. Iterate is one lever per cycle.',
cols: 2,
options: [
{ value: 'dream', label: 'Strengthen Dream Outcome', sub: 'Reframe transformation, raise specificity.' },
{ value: 'likelihood', label: 'Increase Perceived Likelihood', sub: 'Add proof, case studies, guarantees.' },
{ value: 'time', label: 'Decrease Time Delay', sub: 'Engineer faster first win, add quick wins.' },
{ value: 'effort', label: 'Decrease Effort & Sacrifice', sub: 'Remove DIY steps, add templates, raise tier to DWY/DFY.' }
]
},
{
id: 'iter_awareness',
type: 'choice',
label: 'Awareness stage — where is the market relative to the solution?',
help: 'Eugene Schwartz\'s 5 stages (used by Hormozi + Brunson): the right copy depends on what the market already knows. A Stage 1 audience needs the problem named. A Stage 5 audience needs a new mechanism. Most copy fails because it is written for the wrong stage.',
cols: 1,
options: [
{ value: 'unaware', label: 'Stage 1 — Unaware: do not know they have the problem', sub: 'Lead with a story or stat that names the pain. Direct claims fall flat here.' },
{ value: 'problem', label: 'Stage 2 — Problem-Aware: feel the pain, do not know solutions exist', sub: 'Lead with the pain in their words. Promise the category of relief.' },
{ value: 'solution', label: 'Stage 3 — Solution-Aware: know solutions exist, comparing options', sub: 'Lead with your unique mechanism. Differentiate, do not invent.' },
{ value: 'product', label: 'Stage 4 — Product-Aware: know your product, weighing it', sub: 'Lead with proof + risk reversal. They need permission to act.' },
{ value: 'most', label: 'Stage 5 — Most Aware: know your product, just need a reason now', sub: 'Lead with offer + scarcity. Direct ask. Brevity wins.' }
]
},
{
id: 'iter_sophistication',
type: 'choice',
label: 'Market sophistication — how worn-out are the claims in this niche?',
help: 'Schwartz\'s sophistication ladder: every claim works once, weakens with repetition, dies when the market has heard it 1,000 times. The fix is a NEW MECHANISM that resets the claim. Your market sophistication tells you how hard the new-mechanism work has to be.',
cols: 1,
options: [
{ value: 's1', label: 'Stage 1 — first to make the claim', sub: 'Direct claims work. Rare in 2026; usually means the niche is small.' },
{ value: 's2', label: 'Stage 2 — claim works, you must make it bigger', sub: '"Lose 30 lbs" → "Lose 30 lbs in 30 days." Amplify.' },
{ value: 's3', label: 'Stage 3 — claims worn, need a unique mechanism', sub: 'Most niches in 2026 live here. Named mechanism is mandatory.' },
{ value: 's4', label: 'Stage 4 — mechanisms saturated, need a NEW mechanism', sub: '"Not keto, not fasting — the metabolic-window method." Reset the category.' },
{ value: 's5', label: 'Stage 5 — every mechanism heard, must lead with identity / story', sub: 'Tribe + identity wins. The mechanism is a side-effect of who you are.' }
]
},
{
id: 'iter_refund_interviews',
type: 'choice',
label: 'Refund interview discipline — are you running them?',
help: 'Hormozi: "The refund call is the single most valuable sales call you will ever take." 5 questions: (1) What did you hope this would do for you? (2) What part of the experience caused you to step back? (3) Was the issue hook, audience, offer, onboarding, or delivery? (4) What would have changed your mind? (5) Would you refer someone else? The pattern is in the answers.',
cols: 1,
options: [
{ value: 'always', label: 'Yes — every refund triggers a structured 5-question call', sub: 'GO. You are mining the highest-signal data in the business.' },
{ value: 'sometimes', label: 'Sometimes — informal refund conversations', sub: 'REWORK. Formalize the 5 questions. Track the pattern across 10 refunds.' },
{ value: 'never', label: 'Never — refunds are processed silently', sub: 'NO. You are throwing away your best diagnostic data. Start tomorrow.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 9 — PIVOT GATE
// ----------------------------------------------------------
{
id: 'pivot',
num: '09',
name: 'Pivot or Hold',
title: 'Is the offer dead, the audience wrong, or the hook off?',
rubric: 'Gate 09 · Diagnostic',
principle: {
text: '"Three things can be wrong: the offer, the audience, or the hook. They look identical from the outside — both produce zero sales. The diagnostic is in the data. Hook problem: low click-through. Audience problem: high click-through, no conversion. Offer problem: high conversion, fast refund. Stop guessing. Read the funnel."',
source: 'RISER Captain\'s Logic · The Three-Failure-Mode Diagnostic'
},
inputs: [
{
id: 'pivot_metric_ctr',
type: 'choice',
label: 'Are people clicking through your hooks?',
help: 'Cold ad CTR baseline: 1-2%. Organic post engagement baseline: 1-3% of followers. Below = hook problem.',
cols: 1,
options: [
{ value: 'yes', label: 'Yes — CTR / engagement is normal or above', sub: 'Hook is fine. Look elsewhere.' },
{ value: 'no', label: 'No — barely anyone clicks or engages', sub: 'HOOK problem. Rewrite hooks before changing offer or audience.' }
]
},
{
id: 'pivot_metric_optin',
type: 'choice',
label: 'Of clicks, what % opt-in / start the buying conversation?',
help: 'Cold landing page baseline: 20-40%. Sales page to purchase baseline: 1-3%. Application/booking baseline: 5-15%.',
cols: 1,
options: [
{ value: 'high', label: 'Above baseline (great)', sub: 'Audience is right and offer is interesting.' },
{ value: 'mid', label: 'At baseline', sub: 'OK. Look at conversion deeper in funnel.' },
{ value: 'low', label: 'Below baseline (people click, do not opt-in)', sub: 'AUDIENCE problem. Wrong people are showing up. Refine targeting.' }
]
},
{
id: 'pivot_metric_close',
type: 'choice',
label: 'Of buyers, what % stay, refer, or upsell?',
help: 'Refund rate >10% in first 30 days = offer problem. Refund rate <5% = offer is at minimum acceptable.',
cols: 1,
options: [
{ value: 'good', label: 'Refund rate <5%, NPS positive', sub: 'Offer works. Scale.' },
{ value: 'mid', label: 'Refund rate 5-10%', sub: 'REWORK. Offer is borderline. Improve delivery before scaling.' },
{ value: 'bad', label: 'Refund rate >10% OR negative NPS', sub: 'OFFER problem. Do not scale. Fix the delivery or the promise.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 10 — SCALE GATE
// ----------------------------------------------------------
{
id: 'scale',
num: '10',
name: 'Scale',
title: '<em>Scale</em> what is working',
rubric: 'Gate 10 · Scale',
principle: {
text: '"You scale what works. You do not scale what might work. The signal you can scale: same offer, same audience, same channel, repeatedly producing customers at known unit economics. Scaling before this signal is gambling. Scaling after is math."',
source: 'RISER Captain\'s Logic · The Scale Signal Doctrine'
},
inputs: [
{
id: 'scale_signal',
type: 'choice',
label: 'Do you have the scale signal?',
help: 'Operating rule: 10 customers from one channel at known CAC and 6+ months of retention data = scale signal. Anything less = volume gambling.',
cols: 1,
options: [
{ value: 'yes', label: 'Yes — 10+ customers from one channel, known unit economics, 6+ months of retention data', sub: 'GO. Scale begins.' },
{ value: 'partial', label: 'Some signal, partial data', sub: 'REWORK. Get to 10 customers + 6 months retention before scaling.' },
{ value: 'no', label: 'No — early or unstable', sub: 'NO scale. Stay in iterate loop. Volume is not the answer yet.' }
]
},
{
id: 'scale_lever',
type: 'choice',
label: 'How do you scale? (Pick one)',
help: 'The three scale levers: increase price, increase volume, increase retention. Most operators reach for volume first; that is usually wrong.',
cols: 1,
options: [
{ value: 'price', label: 'Raise price first', sub: 'Highest leverage. 10% price increase ≈ 50%+ profit increase. Test before raising.' },
{ value: 'retention', label: 'Increase retention / LTV', sub: 'Second-highest. Reduce churn 20% ≈ 100% LTV increase.' },
{ value: 'volume', label: 'Increase volume (more leads, more conversion)', sub: 'Third lever. Most expensive. Use only when price + retention are maxed.' }
]
},
{
id: 'scale_constraint',
type: 'textarea',
label: 'What is the current bottleneck?',
help: 'Theory of Constraints: there is one bottleneck at a time. Lead gen, sales, delivery, retention. Name it. Fix it. Move to the next.',
placeholder: 'e.g., Delivery — I cannot onboard more than 5 new clients per month without burning out.'
}
]
},
// ----------------------------------------------------------
// GATE 11 — REPEAT
// ----------------------------------------------------------
{
id: 'repeat',
num: '11',
name: 'Repeat',
title: 'Find <em>another angle</em> — scale, profit, repeat',
rubric: 'Gate 11 · Compound',
principle: {
text: '"One offer, one audience, one channel — that is a business. Two offers to the same audience — that is a customer base. Three offers to the same audience — that is a moat. Most operators jump to a second business before they have built one. The compound move is to deepen the same audience with the next problem they will pay you to solve."',
source: 'RISER Captain\'s Logic · The Compound Moat Principle'
},
inputs: [
{
id: 'repeat_next_problem',
type: 'textarea',
label: 'What is the NEXT problem your existing customers will pay you to solve?',
help: 'Operating rule: ask 20 customers "what is the next thing you would buy from me?" Build that. Same audience, no new acquisition cost. LTV doubles.',
placeholder: 'e.g., Customers landed retainers but struggle to scale past $20K/mo. Next offer: "Retainer to Agency" coaching at $4,997.'
},
{
id: 'repeat_decision',
type: 'choice',
label: 'What is the right next move?',
help: 'Most operators get this wrong. The temptation is "another business." The right answer is almost always "another offer to the same audience."',
cols: 1,
options: [
{ value: 'deepen', label: 'New offer, SAME audience, SAME channel', sub: 'Best. Compound the moat. 5x LTV from existing customers.' },
{ value: 'expand', label: 'Same offer, new adjacent audience', sub: 'Second-best. Tested offer reduces risk.' },
{ value: 'channel', label: 'Same offer, same audience, NEW channel', sub: 'Third option. Channel diversification reduces platform risk.' },
{ value: 'new', label: 'New business entirely', sub: 'Almost always wrong. You are leaving compound returns on the table.' }
]
},
{
id: 'repeat_constraint_check',
type: 'choice',
label: 'Have you maxed out the current offer first?',
help: 'RISER doctrine: "Do not start a second business until the first is at the limit of what one operator can extract from it." Most operators are at 30% of that limit when they get bored and pivot.',
cols: 1,
options: [
{ value: 'maxed', label: 'Yes — same offer at $X-million ARR with healthy retention', sub: 'GO compound.' },
{ value: 'midway', label: 'No — still room in the current offer', sub: 'REWORK. Stay focused. Maximize before adding.' },
{ value: 'bored', label: 'I am bored / want something new', sub: 'NO. Boredom is not strategy. Re-engage the current business.' }
]
},
{
id: 'repeat_ladder_bait',
type: 'text',
label: 'Value Ladder Rung 1 — BAIT (free lead magnet, name + format)',
help: 'Brunson\'s ladder starts here. Free, named, valuable. The first rung exists to create reciprocity and build the list. If you have no bait, you have no ladder.',
placeholder: 'e.g., The Retainer Pricing Calculator (PDF + Notion template)'
},
{
id: 'repeat_ladder_tripwire',
type: 'text',
label: 'Rung 2 — TRIPWIRE ($7-$97 entry offer, name + price)',
help: 'Low-ticket entry point. Converts a lead to a buyer for the price of a coffee. Buyers behave fundamentally differently from leads — this is the rung that creates the buyer-list segment.',
placeholder: 'e.g., The 7-Day Retainer Email Course — $27'
},
{
id: 'repeat_ladder_core',
type: 'text',
label: 'Rung 3 — CORE OFFER ($297-$1,997, name + price)',
help: 'Your main offer. The Grand Slam. Most operators only have this rung and wonder why they cannot scale.',
placeholder: 'e.g., The 90-Day Retainer Sprint — $497'
},
{
id: 'repeat_ladder_continuity',
type: 'text',
label: 'Rung 4 — CONTINUITY (recurring offer, name + monthly price)',
help: 'Hormozi: "The single highest LTV-per-dollar move is continuity." Skool community, software subscription, monthly coaching, certification renewal. If you have no continuity, you are leaving 60% of LTV on the table.',
placeholder: 'e.g., The Retainer Captains Skool — $97/mo'
},
{
id: 'repeat_ladder_high',
type: 'text',
label: 'Rung 5 — HIGH-TICKET / BACK-END ($5K-$50K+, name + price)',
help: 'The premium DFY tier. 80% of operator profit lives here. Often "Done-with-me" or "Done-for-you" implementation of the core offer\'s outcome.',
placeholder: 'e.g., The Agency Architect — $9,997 12-week 1:1 build'
},
{
id: 'repeat_continuity_status',
type: 'choice',
label: 'Continuity health — what % of customers are on a recurring offer?',
help: 'The single highest-leverage metric for compound LTV. Below 20% = you have not built the continuity offer yet. Above 60% = you have a real moat.',
cols: 1,
options: [
{ value: 'strong', label: '60%+ on continuity', sub: 'GO. Real LTV. Real moat.' },
{ value: 'mid', label: '20-60% on continuity', sub: 'Workable. Improve the continuity offer or migration path.' },
{ value: 'low', label: '<20% on continuity', sub: 'REWORK. Build the continuity offer. Highest-leverage gap in your business.' },
{ value: 'none', label: 'No continuity offer exists', sub: 'NO. Build it before scaling acquisition further.' }
]
},
{
id: 'repeat_dream100_affiliate',
type: 'choice',
label: 'Affiliate / partner activation — have you turned customers into affiliates?',
help: 'Brunson: the second wave of growth comes from your customers selling for you. 10 customer-affiliates each bringing 5 clients = 50 clients with zero acquisition cost.',
cols: 1,
options: [
{ value: 'active', label: 'Yes — formal program with named affiliates already producing', sub: 'GO. Compound is engaged.' },
{ value: 'informal', label: 'Informal referrals, no program', sub: 'REWORK. Formalize. A 30%-commission affiliate program turns your customer list into a sales force.' },
{ value: 'none', label: 'No referral or affiliate motion', sub: 'NO. You are paying for every customer when half of them would pay to bring others.' }
]
}
]
},
// ----------------------------------------------------------
// GATE 12 — SUMMARY / BRIEF
// ----------------------------------------------------------
{
id: 'summary',
num: '12',
name: 'Brief',
title: 'Your <em>One-Page Brief</em>',
rubric: 'Decision Document',
isSummary: true
}
];
// ============================================================
// STATE MANAGEMENT
// ============================================================
const STORAGE_KEY = 'riser-mvo-widget-v3';
let state = {
currentGate: 0,
answers: {},
verdicts: {}, // { gateId: 'go'|'no'|'rework' }
painCards: [], // Array of { id, title, sourceUrl, sourceCommunity, score, frequency, audience, quotes:[], solutions:[], isLead:bool, clusterId:string|null }
voCVault: [], // Auto-derived flat list of all quotes for cross-gate use
leadPainId: null, // The pain card chosen as the avatar seed
startedAt: null,
updatedAt: null
};
async function loadState() {
// Hosted-environment storage: localStorage works in any browser.
try {
const raw = localStorage.getItem(STORAGE_KEY);
if (raw) {
const parsed = JSON.parse(raw);
Object.assign(state, parsed);
return true;
}
} catch (e) {
// No saved state or storage unavailable — fine, fresh session.
}
return false;
}
async function saveState() {
state.updatedAt = new Date().toISOString();
if (!state.startedAt) state.startedAt = state.updatedAt;
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(state));
} catch (e) {
console.warn('Save failed:', e);
}
}
async function resetState() {
if (!confirm('This will erase all your answers. Are you sure?')) return;
state = {
currentGate: 0,
answers: {},
verdicts: {},
painCards: [],
voCVault: [],
leadPainId: null,
startedAt: null,
updatedAt: null
};
try {
localStorage.removeItem(STORAGE_KEY);
} catch (e) {}
renderProgressRail();
renderGate(0);
}
// ============================================================
// PAIN CARD HELPERS — for Gate 00½ and cross-gate VOC vault
// ============================================================
function newPainCardId() {
return 'pain_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 6);
}
function getLeadPainCard() {
if (!state.leadPainId) return null;
return (state.painCards || []).find(c => c.id === state.leadPainId) || null;
}
function getClusterCards() {
// Cards in the same cluster as the lead, INCLUDING the lead card itself.
const lead = getLeadPainCard();
if (!lead) return [];
if (!lead.clusterId) return [lead];
return (state.painCards || []).filter(c => c.clusterId === lead.clusterId);
}
function rebuildVOCVault() {
// Aggregate all quotes across all pain cards.
const flat = [];
(state.painCards || []).forEach(card => {
(card.quotes || []).forEach(q => {
const trimmed = (q || '').trim();
if (trimmed) flat.push({
text: trimmed,
cardTitle: card.title || 'Untitled pain',
source: card.sourceCommunity || ''
});
});
});
state.voCVault = flat;
}
function hasVOCQuotes() {
return (state.voCVault || []).length > 0;
}
function paintFrequencyToWidget(painFrequency) {
// Map the pain card frequency string onto the Gate 03 frequency dropdown values.
const map = {
'daily': 'daily',
'weekly': 'daily', // daily/weekly bucket
'monthly': 'monthly',
'quarterly': 'quarterly',
'seasonal': 'quarterly',
'once': 'once',
'one-time': 'once'
};
return map[(painFrequency || '').toLowerCase()] || null;
}
function openVOCPopover(targetInputId) {
// Build the popover DOM. Click a quote → insert into the target textarea.
const vault = state.voCVault || [];
if (vault.length === 0) return;
// Remove any existing popover
const existing = document.querySelector('.voc-popover');
if (existing) existing.remove();
const overlay = document.createElement('div');
overlay.className = 'voc-popover';
overlay.innerHTML = `
<div class="voc-popover-backdrop" data-voc-close></div>
<div class="voc-popover-card">
<button type="button" class="voc-popover-close" data-voc-close>×</button>
<h3>Voice-of-Customer Vault</h3>
<p class="voc-help">Click a quote to append it to your answer above. The widget wraps it in quotes and adds an attribution line. Use multiple quotes to stack proof.</p>
${vault.map((q, i) => `
<div class="voc-quote" data-voc-insert="${i}">
${escapeHtml(q.text)}
<span class="src">From: ${escapeHtml(q.cardTitle)}${q.source ? ' · ' + escapeHtml(q.source) : ''}</span>
</div>
`).join('')}
</div>
`;
document.body.appendChild(overlay);
// Wire close
overlay.querySelectorAll('[data-voc-close]').forEach(el => {
el.addEventListener('click', () => overlay.remove());
});
// Wire insert-on-click
overlay.querySelectorAll('[data-voc-insert]').forEach(el => {
el.addEventListener('click', () => {
const idx = parseInt(el.getAttribute('data-voc-insert'));
const quote = vault[idx];
if (!quote) return;
const target = document.querySelector(`textarea[data-input="${targetInputId}"]`);
if (!target) return;
const current = target.value || '';
const insertion = (current.trim() ? '\n\n' : '') + `"${quote.text}" — voice of customer`;
target.value = current + insertion;
// Sync state
state.answers[targetInputId] = target.value;
saveState();
// Visual feedback
target.focus();
overlay.remove();
});
});
// ESC to close
const escHandler = (e) => {
if (e.key === 'Escape') {
overlay.remove();
document.removeEventListener('keydown', escHandler);
}
};
document.addEventListener('keydown', escHandler);
}
// ============================================================
// VERDICT ENGINE — RISER Captain's Logic
// ============================================================
function computeVerdict(gateId) {
const a = state.answers;
switch(gateId) {
case 'paindiscovery': {
const cards = state.painCards || [];
const lead = getLeadPainCard();
if (cards.length === 0) {
return {
verdict: 'rework',
name: 'No Pain Cards Imported',
reasons: [
'Pain Discovery is optional — but if you do not have external research, every gate downstream runs on hypothesis.',
'Action: either skip this gate (operator-judgment mode) OR run a PainOnSocial scan / customer interview series and import 1–5 cards before continuing.'
]
};
}
// Check card quality
const totalQuotes = cards.reduce((sum, c) => sum + (c.quotes || []).filter(q => q && q.trim().length >= 10).length, 0);
const cardsWithScore = cards.filter(c => c.score && c.score >= 70).length;
const hasLead = !!lead;
const leadHasAudience = lead && (lead.audience || '').trim().length >= 30;
const leadHasTitle = lead && (lead.title || '').trim().length >= 10;
if (!hasLead) {
return {
verdict: 'rework',
name: 'No Lead Pain Selected',
reasons: [
'You have pain cards but no lead. The lead card seeds Gate 01 (avatar) and Gate 03 (problem).',
'Action: pick the highest-scoring card with the strongest evidence as your lead.'
]
};
}
if (!leadHasTitle || !leadHasAudience) {
return {
verdict: 'rework',
name: 'Lead Pain Card Underspecified',
reasons: [
!leadHasTitle ? 'Lead card has no title (or under 10 chars). State the pain in one sentence.' : null,
!leadHasAudience ? 'Lead card has no audience profile (or under 30 chars). Describe who is suffering, in your words.' : null,
'Action: complete the lead card before applying it downstream.'
].filter(Boolean)
};
}
if (totalQuotes < 3) {
return {
verdict: 'rework',
name: 'Voice-of-Customer Vault Too Thin',
reasons: [
`Only ${totalQuotes} substantive quotes across all cards. The VOC vault drives copy, persuasion, and offer naming — fewer than 3 quotes means downstream gates will run on operator language, not customer language.`,
'Action: add at least 5 quotes total before proceeding. Reddit, support tickets, sales-call transcripts, and DMs all count.'
]
};
}
if (cardsWithScore === 0) {
return {
verdict: 'rework',
name: 'No High-Score Pain Card',
reasons: [
'No card with score ≥ 70. Low-score pains are weak signals. Operating rule: a market score below 70/100 means the pain is felt but not urgent.',
'Action: either find a stronger pain (the easier path) OR proceed knowing your offer will need to do more work to create urgency.'
]
};
}
// GO — different flavors based on strength
if (cardsWithScore >= 1 && totalQuotes >= 8) {
const leadScore = lead.score || 0;
const clusterCount = getClusterCards().length;
return {
verdict: 'go',
name: 'Pain Discovery Locked',
reasons: [
`Lead pain "${(lead.title || '').slice(0, 60)}" — score ${leadScore}/100.`,
`Total quotes in VOC vault: ${totalQuotes}. ${clusterCount > 1 ? `Cluster: ${clusterCount} cards.` : 'No cluster (single pain).'}`,
'RISER doctrine: "Operators who import pain build for the market. The widget is now running on real fuel."',
'Action: click "Apply lead pain to downstream gates" above, then proceed to Gate 01.'
],
score: { total: leadScore, max: 100, label: 'Lead Pain Score' }
};
}
return {
verdict: 'go',
name: 'Pain Discovery Sufficient',
reasons: [
`Lead pain "${(lead.title || '').slice(0, 60)}" — workable.`,
`${totalQuotes} quotes in vault, ${cardsWithScore} card${cardsWithScore !== 1 ? 's' : ''} above 70.`,
'Action: apply to Gate 01 and proceed. You can return here to add more cards anytime.'
]
};
}
case 'avatar': {
const scores = ['avatar_size_purchasing', 'avatar_size_growing',
'avatar_size_easy', 'avatar_pain_intensity']
.map(k => parseInt(a[k] || 0));
const total = scores.reduce((s, v) => s + v, 0);
const hasWho = (a.avatar_who || '').trim().length >= 20;
const hasPain = (a.avatar_pain || '').trim().length >= 20;
// PainOnSocial evidence boost: if a lead pain card with score ≥ 85 and
// ≥ 5 quotes exists, the market score gets a +4 boost (capped at 40).
// This implements the "score-as-evidence" idea.
const leadPain = getLeadPainCard();
const leadQuoteCount = leadPain ? (leadPain.quotes || []).filter(q => q && q.trim().length >= 10).length : 0;
const evidenceBoost = (leadPain && leadPain.score >= 85 && leadQuoteCount >= 5) ? 4 : 0;
const adjustedTotal = Math.min(40, total + evidenceBoost);
const evidenceLine = evidenceBoost > 0
? `Evidence boost: +${evidenceBoost} from PainOnSocial lead pain (score ${leadPain.score}/100, ${leadQuoteCount} verbatim quotes). Adjusted market score: ${adjustedTotal}/40.`
: null;
if (!hasWho || !hasPain) {
return {
verdict: 'rework',
name: 'Avatar Not Specific Enough',
reasons: [
!hasWho ? 'The avatar description is too vague. Operating rule: if you cannot describe the avatar in 50+ words including age, role, income, and what they did last Tuesday, you have not chosen one.' : null,
!hasPain ? 'The pain is not stated in their words. Quote them. If you cannot quote them, you have not talked to them yet.' : null,
'Action: spend 60 minutes on Reddit, Twitter, or LinkedIn finding 5 posts where this avatar describes the pain in their own words. Copy 5 quotes verbatim. Return.'
].filter(Boolean),
score: { total: adjustedTotal, max: 40, label: 'Market Score' }
};
}
if (adjustedTotal >= 32) {
return {
verdict: 'go',
name: 'Hungry Crowd Confirmed',
reasons: [
`Market score ${adjustedTotal}/40 — strong on all dimensions.`,
evidenceLine,
'You have a starving crowd. The next 90 days are about feeding them, not finding them.',
'Action: proceed to Gate 02. Lock the Idea.'
].filter(Boolean),
score: { total: adjustedTotal, max: 40, label: 'Market Score' }
};
}
if (adjustedTotal >= 24) {
return {
verdict: 'rework',
name: 'Workable But Constrained',
reasons: [
`Market score ${adjustedTotal}/40 — workable, but at least one dimension is weak.`,
evidenceLine,
scores[0] < 6 ? 'Purchasing power below threshold. If buyers cannot afford $1,000+ on similar problems, monetization will be slow.' : null,
scores[1] < 6 ? 'Growth below threshold. Flat or shrinking markets punish even good offers.' : null,
scores[2] < 6 ? 'Reach below threshold. An invisible avatar is worthless. Pick a channel where they aggregate.' : null,
scores[3] < 6 ? 'Pain intensity below threshold. Top-3 pain has budget. Bottom-10 pain has infinite sales cycles.' : null,
'Action: address the weakest dimension before proceeding. Either pivot the avatar or pivot the angle.'
].filter(Boolean),
score: { total: adjustedTotal, max: 40, label: 'Market Score' }
};
}
return {
verdict: 'no',
name: 'Wrong Market',
reasons: [
`Market score ${adjustedTotal}/40 — too many weak dimensions.`,
evidenceLine,
'Operating rule: if 3 of 4 (purchasing power, growth, reach, pain intensity) are below 6, the market is wrong. No offer can rescue a wrong market.',
'Action: pick a different avatar. Do NOT proceed. Going forward will burn 6+ months on a fundamentally wrong choice.'
].filter(Boolean),
score: { total: adjustedTotal, max: 40, label: 'Market Score' }
};
}
case 'idea': {
const sentence = (a.idea_one_sentence || '').trim();
const competition = a.idea_competition;
const moneyNow = a.idea_money_now;
const sentenceOK = sentence.length >= 30 && sentence.length <= 200;
if (!sentenceOK || !competition || !moneyNow) {
return {
verdict: 'rework',
name: 'Idea Not Stated Cleanly',
reasons: [
!sentenceOK ? 'The one-sentence offer is missing or unclear. Format: "I help [avatar] get [outcome] in [timeframe] without [common objection]." Try again.' : null,
!competition ? 'Pick the competitive reality.' : null,
!moneyNow ? 'Answer the $100 today test.' : null,
'Action: rewrite the one-sentence pitch using the format. If you cannot, the idea is not ready.'
].filter(Boolean)
};
}
if (competition === 'none' || moneyNow === 'no') {
return {
verdict: 'no',
name: 'Idea Will Not Earn the Slot',
reasons: [
competition === 'none' ? 'No competition is almost always a graveyard, not a goldmine. Operating rule: if no one is selling this, no one wants to buy it. Find competitors before continuing.' : null,
moneyNow === 'no' ? 'If you cannot find 10 paying customers without a marketing campaign first, the idea is theoretical. Validate by selling, not by polishing.' : null,
'Action: pivot the angle. Either pick a category with proven demand OR find a way to identify 10 paying customers right now.'
].filter(Boolean)
};
}
if (competition === 'thin' || moneyNow === 'maybe') {
return {
verdict: 'rework',
name: 'Promising — Test Before Committing',
reasons: [
competition === 'thin' ? 'Thin competition is often a graveyard. Verify: do similar businesses exist in adjacent niches making real money?' : null,
moneyNow === 'maybe' ? 'You think you can find buyers but have not yet. Until you can name 10 specific people who would pay, the idea is hypothesis, not validated.' : null,
'Action: run the $100 today test for real. Spend 4 hours messaging 20 strangers. If 2+ pay $100 today, return as GO. If 0 pay, kill.'
].filter(Boolean)
};
}
return {
verdict: 'go',
name: 'Idea Earns the Slot',
reasons: [
'Strong competition + named buyers = proven demand + real entry path.',
'RISER doctrine: "Crowded markets are good markets. You differentiate, you do not invent."',
'Action: proceed to Gate 03. Define the profitable problem angle.'
]
};
}
case 'problem': {
const specific = (a.problem_specific || '').trim().length >= 20;
const frequency = a.problem_frequency;
const cost = a.problem_cost;
const existing = (a.problem_existing_solutions || '').trim().length >= 20;
if (!specific || !frequency || !cost || !existing) {
return {
verdict: 'rework',
name: 'Problem Not Defined Precisely',
reasons: [
!specific ? 'Problem statement is too vague. Use customer\'s exact words.' : null,
!frequency ? 'Pick the frequency.' : null,
!cost ? 'Pick the cost-of-not-solving level.' : null,
!existing ? 'List existing solutions and non-consumption alternatives.' : null,
'Action: complete the missing fields before proceeding.'
].filter(Boolean)
};
}
if (cost === 'low') {
return {
verdict: 'no',
name: 'Problem Is Not Profitable',
reasons: [
'Operating rule: pricing power = cost-of-not-solving. Low-cost-of-inaction problems can only be sold cheap.',
'You are facing a structural ceiling no offer engineering will fix.',
'Action: reframe to find a higher-cost-of-inaction angle on the same avatar OR pivot to a different problem the same avatar has.'
]
};
}
if (frequency === 'once' && cost !== 'high') {
return {
verdict: 'rework',
name: 'One-Shot Problem, Moderate Pain',
reasons: [
'One-time problems require constant new-customer acquisition. Combined with moderate pain, the unit economics will be tight.',
'Workable but harder. Plan the LTV-extension offer (Gate 11) before launching.',
'Action: proceed but design the second offer for existing customers BEFORE Gate 04.'
]
};
}
const scoreFreq = { daily: 4, monthly: 3, quarterly: 2, once: 1 }[frequency] || 0;
const scoreCost = { high: 4, moderate: 2, low: 0 }[cost] || 0;
const total = scoreFreq + scoreCost;
if (total >= 6) {
return {
verdict: 'go',
name: 'Profitable Problem Confirmed',
reasons: [
`Recurring + high-cost = recurring revenue + pricing power.`,
'RISER doctrine: "Solve a problem they pay you to keep solving. That is a business."',
'Action: proceed to Gate 04. Build the Grand Slam Offer.'
]
};
}
return {
verdict: 'rework',
name: 'Problem Workable, Not Optimal',
reasons: [
'Frequency or cost-of-inaction is suboptimal. The business will work but unit economics will be tighter than necessary.',
'Action: see if you can reframe to a higher-frequency or higher-cost angle within the same avatar before locking the offer.'
]
};
}
case 'offer': {
const dream = (a.offer_dream || '').trim().length >= 20;
const likelihood = (a.offer_likelihood || '').trim().length >= 10;
const dreamScore = parseInt(a.offer_dream_score || 0);
const likelihoodScore = parseInt(a.offer_likelihood_score || 0);
const time = a.offer_time_delay;
const effort = a.offer_effort;
const mechanism = (a.offer_mechanism || '').trim().length >= 30;
if (!dream || !likelihood || !dreamScore || !likelihoodScore || !time || !effort || !mechanism) {
return {
verdict: 'rework',
name: 'Offer Incomplete',
reasons: [
!dream ? 'Dream Outcome missing or too vague.' : null,
!likelihood ? 'Proof / Likelihood field empty.' : null,
!dreamScore ? 'Score the Dream Outcome (1-10).' : null,
!likelihoodScore ? 'Score the Perceived Likelihood (1-10).' : null,
!time ? 'Pick the Time Delay tier.' : null,
!effort ? 'Pick the Effort tier.' : null,
!mechanism ? 'Named Mechanism missing. This is the difference between a $97 product and a $4,997 program. Name your method and explain why it works differently.' : null,
'Fill all seven fields before scoring.'
].filter(Boolean)
};
}
const timeScore = { instant: 10, week: 8, month: 6, months: 3 }[time];
const effortScore = { dfy: 10, dwy: 8, diy: 5, self: 3 }[effort];
const numerator = dreamScore * likelihoodScore;
const denominator = (11 - timeScore) + (11 - effortScore);
const valueScore = Math.round((numerator / denominator) * 10);
if (valueScore >= 35) {
return {
verdict: 'go',
name: 'Grand Slam Offer',
reasons: [
`Value score ${valueScore} — top decile. The numerator (dream × likelihood) is strong AND the denominator (time × effort) is small.`,
'RISER doctrine: "A Grand Slam Offer makes prospects feel stupid saying no."',
'Action: lock the offer. Proceed to Gate 05.'
],
score: { total: valueScore, max: 100, label: 'Value Score' }
};
}
if (valueScore >= 20) {
return {
verdict: 'rework',
name: 'Strong Offer, Sharpenable',
reasons: [
`Value score ${valueScore} — workable but not Grand Slam.`,
dreamScore < 8 ? 'Dream Outcome below 8: vague or weak transformation. Make it more specific, more vivid, more measurable.' : null,
likelihoodScore < 7 ? 'Likelihood below 7: not enough proof. Stack testimonials, case studies, guarantees until even skeptics nod.' : null,
timeScore < 6 ? 'Time delay too long: engineer at least one Day-1 quick win. The first 24 hours determines retention.' : null,
effortScore < 6 ? 'Effort too high: move from DIY to DWY (templates + guidance), or DWY to DFY (we do it).' : null,
'Action: pick the lowest-scoring lever and improve it before proceeding. One lever at a time.'
].filter(Boolean),
score: { total: valueScore, max: 100, label: 'Value Score' }
};
}
return {
verdict: 'no',
name: 'Offer Will Not Convert at Scale',
reasons: [
`Value score ${valueScore} — below threshold.`,
'The combination of weak transformation, thin proof, slow time-to-value, and high effort means the offer cannot survive even with great copy.',
'Action: rebuild the offer. Either pick a stronger transformation OR dramatically reduce time/effort. Do not proceed to copy or distribution with this score.'
],
score: { total: valueScore, max: 100, label: 'Value Score' }
};
}
case 'stack': {
const offerName = (a.stack_offer_name || '').trim();
const bonuses = (a.stack_bonuses || '').trim();
const guaranteeType = a.stack_guarantee_type;
const guaranteeText = (a.stack_guarantee_text || '').trim();
const scarcity = a.stack_scarcity;
const totalValue = parseFloat(a.stack_total_value || 0);
const actualPrice = parseFloat(a.stack_actual_price || 0);
const nameOK = offerName.length >= 5 && offerName.length <= 80;
const bonusesOK = bonuses.length >= 60;
const guaranteeOK = guaranteeText.length >= 20;
if (!nameOK || !bonusesOK || !guaranteeType || !guaranteeOK || !scarcity || !totalValue || !actualPrice) {
return {
verdict: 'rework',
name: 'Stack Incomplete',
reasons: [
!nameOK ? 'Offer name missing or weak. Named offers convert 30% better than descriptions.' : null,
!bonusesOK ? 'List 3-5 bonuses with names, outcomes, and price-anchors. Bonuses pre-empt objections — without them, the buyer hesitates.' : null,
!guaranteeType ? 'Pick a guarantee type.' : null,
!guaranteeOK ? 'Write the guarantee in your exact wording. Vague guarantees get vague results.' : null,
!scarcity ? 'Declare a scarcity mechanism.' : null,
!totalValue ? 'Sum the stack value (anchor price).' : null,
!actualPrice ? 'Set the actual offer price.' : null,
'Complete the missing fields before scoring the stack.'
].filter(Boolean)
};
}
if (scarcity === 'fake') {
return {
verdict: 'no',
name: 'Fake Scarcity Will Burn Trust',
reasons: [
'Fake countdown timers and inflated urgency get discovered. One discovery burns the audience permanently.',
'Cialdini: scarcity works only when it is structurally true. Pick a real cohort cap, founding price ladder, bonus expiration, or launch window.',
'Action: replace the fake mechanism with a real one. Run the stack again.'
]
};
}
if (guaranteeType === 'none') {
return {
verdict: 'no',
name: 'No Guarantee = Half the Conversion',
reasons: [
'A bare offer with no guarantee converts at half the rate of the same offer with even a basic guarantee.',
'Pick the strongest guarantee your unit economics can absorb. Conditional guarantees ("do X, Y, Z and if no result, double back") force customer accountability AND reduce risk perception.',
'Action: write the guarantee. Then return.'
]
};
}
if (scarcity === 'none') {
return {
verdict: 'rework',
name: 'No Reason to Decide Today',
reasons: [
'Without a structural scarcity mechanism, every prospect defers the decision. "I will think about it" = no.',
'Pick the scarcity that fits your delivery model: cohort cap, founding price ladder, bonus expiration, or launch window.',
'Action: pick one and bake it in.'
]
};
}
const valueRatio = totalValue / actualPrice;
if (valueRatio < 3) {
return {
verdict: 'rework',
name: 'Stack-to-Price Ratio Too Thin',
reasons: [
`Stack value $${totalValue} ÷ price $${actualPrice} = ${valueRatio.toFixed(1)}× ratio. Below 3× and the contrast does not register.`,
'Cialdini contrast principle: the price needs an anchor 3× to 10× larger to feel like a steal.',
'Action: either add bonuses to raise the stack value, or lower the price. The 5×-10× ratio is the conversion sweet spot.'
]
};
}
if (guaranteeType === 'implied') {
return {
verdict: 'rework',
name: 'Implied Guarantee = No Guarantee',
reasons: [
'"We are confident you will love it" is not a guarantee. The buyer reads it as marketing copy.',
'Action: upgrade to unconditional ("30-day refund") at minimum. Conditional is better.'
]
};
}
return {
verdict: 'go',
name: 'Grand Slam Stack Locked',
reasons: [
`Named offer: ${offerName}. Stack ratio ${valueRatio.toFixed(1)}× ($${totalValue} value, $${actualPrice} price).`,
`Guarantee: ${guaranteeType}. Scarcity: ${scarcity.replace('_', ' ')}.`,
'RISER doctrine: "The stack is the offer. The offer is not the product."',
'Action: proceed to Gate 05. Pick distribution.'
]
};
}
case 'distribution': {
const channel = a.dist_primary;
const volume = (a.dist_volume || '').trim().length >= 30;
const econ = a.dist_unit_econ;
if (!channel || !volume || !econ) {
return {
verdict: 'rework',
name: 'Distribution Plan Incomplete',
reasons: ['Pick a channel, do the volume math, declare unit-economics readiness.']
};
}
if (channel === 'paid_ads' && econ !== 'yes') {
return {
verdict: 'no',
name: 'Paid Ads Without Unit Economics = Fire',
reasons: [
'Operating rule: paid ads require known CAC < 1/3 of 12-month LTV. Without that math, paid ads burn cash with no feedback loop.',
'Action: switch primary to warm outreach, cold outreach, or warm content until you have unit economics. Add paid ads after first 50 customers organic.'
]
};
}
return {
verdict: 'go',
name: 'Distribution Channel Locked',
reasons: [
`Primary: ${channel.replace('_', ' ')}.`,
'Operating rule: master one channel before adding another. 18 months on one platform > 6 months on three.',
'Action: do not add a second channel until you have produced 100 customers from this one.'
]
};
}
case 'dream100': {
const list = (a.dream100_list || '').trim();
const strategy = a.dream100_strategy;
const outreach = (a.dream100_first_outreach || '').trim();
const volume = a.dream100_volume;
// Count entries — rough heuristic on newlines or numbered items
const entryCount = (list.match(/\n/g) || []).length + 1;
const listOK = list.length >= 100 && entryCount >= 10;
const outreachOK = outreach.length >= 30;
if (!listOK || !strategy || !outreachOK || !volume) {
return {
verdict: 'rework',
name: 'Dream 100 Not Built',
reasons: [
!listOK ? 'List fewer than 10 named contacts. The Dream 100 starts with 25 specific names — handles, URLs, podcasts. Generic categories do not count.' : null,
!strategy ? 'Pick the primary strategy: work in, buy in, or partner.' : null,
!outreachOK ? 'Write the first-touch script. Gift first, no ask.' : null,
!volume ? 'Declare your weekly outreach volume.' : null,
'Action: spend 90 minutes researching and listing 25 named Dream 100 contacts before proceeding.'
].filter(Boolean)
};
}
if (volume === 'none') {
return {
verdict: 'no',
name: 'Dream 100 Strategy Without Action',
reasons: [
'A Dream 100 list with zero outreach is a bookmark folder, not a strategy.',
'Action: send the first 5 messages this week. The first reply changes everything.'
]
};
}
if (volume === 'low') {
return {
verdict: 'rework',
name: 'Volume Too Low to Compound',
reasons: [
'Below 5 contacts/week, the Dream 100 does not reach the relationship density needed to produce invitations.',
'Action: raise to 10-20/week. The system rewards compound presence, not occasional drops.'
]
};
}
return {
verdict: 'go',
name: 'Dream 100 Engaged',
reasons: [
`Strategy: ${strategy.replace('_', ' ')}. Volume: ${volume}.`,
'Brunson doctrine: "The 100 people who already gathered your audience are worth more than the 10,000 strangers you could try to reach yourself."',
'Action: track every interaction. The first 10 reciprocity gifts seed the next 90 days of compound.'
]
};
}
case 'copy': {
const hook = (a.copy_hook || '').trim();
const headline = (a.copy_headline || '').trim();
const body = (a.copy_body || '').trim();
const cta = a.copy_cta;
const hookOK = hook.length >= 20 && hook.length <= 200;
const headlineOK = headline.length >= 20 && headline.length <= 250;
const bodyOK = body.length >= 80;
const ctaSpecific = cta === 'specific';
if (!hookOK || !headlineOK || !bodyOK || !cta) {
return {
verdict: 'rework',
name: 'Copy Not Ready',
reasons: [
!hookOK ? 'Hook is missing or out of length range. Aim for 8-25 words.' : null,
!headlineOK ? 'Headline is missing or weak. Use [Outcome] in [Timeframe] without [Objection].' : null,
!bodyOK ? 'Body is too short. Aim for 80-250 words including problem, mechanism, proof, CTA.' : null,
!cta ? 'Pick a CTA specificity level.' : null,
'Action: complete missing fields. Read each piece aloud — anything that sounds like marketing copy needs to be rewritten as plain speech.'
].filter(Boolean)
};
}
if (cta === 'vague') {
return {
verdict: 'rework',
name: 'CTA Will Halve Your Conversion',
reasons: [
'Generic CTAs ("learn more") convert at half the rate of specific ones.',
'Action: rewrite CTA to name a specific asset and outcome. "Get the [name] [format] that [does X]." Then return.'
]
};
}
return {
verdict: 'go',
name: 'Copy Ready to Test',
reasons: [
'Hook stops scroll. Headline promises. Body proves. CTA is specific.',
'RISER doctrine: "Copy is not creativity — it is fidelity to the customer\'s words." Re-read your copy and replace anything you wrote in YOUR words with the customer\'s words.',
'Action: deploy. Real engagement data tells you what works.'
]
};
}
case 'persuasion': {
const domino = (a.persuasion_big_domino || '').trim();
const beliefs = (a.persuasion_false_beliefs || '').trim();
const leadMagnet = (a.persuasion_lead_magnet || '').trim();
const reciprocity = a.persuasion_reciprocity;
const social = a.persuasion_social_proof;
const authority = a.persuasion_authority;
const unity = a.persuasion_unity;
const consistency = a.persuasion_consistency;
const dominoOK = domino.length >= 30;
const beliefsOK = beliefs.length >= 60;
const leadMagnetOK = leadMagnet.length >= 20;
if (!dominoOK || !beliefsOK || !leadMagnetOK || !reciprocity || !social || !authority || !unity || !consistency) {
return {
verdict: 'rework',
name: 'Persuasion Architecture Incomplete',
reasons: [
!dominoOK ? 'Big Domino missing. Name the ONE belief that breaks for the sale to happen.' : null,
!beliefsOK ? 'False Belief Audit incomplete. Name 3 false beliefs: vehicle, self, external.' : null,
!leadMagnetOK ? 'Reciprocity gift not named. Generic "newsletter" does not count.' : null,
!reciprocity ? 'Pick reciprocity level.' : null,
!social ? 'Pick social proof level.' : null,
!authority ? 'Pick authority level.' : null,
!unity ? 'Pick unity language level.' : null,
!consistency ? 'Pick consistency mechanism.' : null,
'Complete the audit before deploy. Persuasion structure is upstream of conversion rate.'
].filter(Boolean)
};
}
// Score Cialdini levers
const cialdiniScore = (() => {
let s = 0;
if (reciprocity === 'strong') s += 2;
else if (reciprocity === 'weak') s += 1;
if (social === 'high') s += 2;
else if (social === 'medium') s += 1;
if (authority === 'strong') s += 2;
else if (authority === 'borrowed') s += 1;
if (unity === 'strong') s += 2;
else if (unity === 'medium') s += 1;
if (consistency === 'multistep') s += 2;
return s;
})();
const maxScore = 10;
if (reciprocity === 'none' || social === 'low') {
return {
verdict: 'no',
name: 'Persuasion Foundation Missing',
reasons: [
reciprocity === 'none' ? 'Cold ask without reciprocity. Cialdini\'s most-violated principle. Conversion ceiling: 1/3 of what it could be.' : null,
social === 'low' ? 'Zero or generic social proof. Without 3+ avatar-similar testimonials, skeptics walk.' : null,
'Action: build the lead magnet AND collect 3 specific testimonials before deploy. These are not optional.'
].filter(Boolean),
score: { total: cialdiniScore, max: maxScore, label: 'Cialdini Score' }
};
}
if (cialdiniScore < 6) {
return {
verdict: 'rework',
name: 'Persuasion Levers Too Few',
reasons: [
`Cialdini score ${cialdiniScore}/${maxScore}. Strong launches activate 5+ levers visibly on the offer page.`,
unity !== 'strong' ? 'Unity language weak. Name the tribe explicitly. "Solo accountants who refuse to bill by the hour."' : null,
authority !== 'strong' && authority !== 'borrowed' ? 'Authority thin. Replace credentials with specific results.' : null,
consistency !== 'multistep' ? 'Single-step ask. Add a micro-commitment (quiz, opt-in, free call) before the macro-yes.' : null,
'Action: strengthen the weakest 2 levers before deploy.'
].filter(Boolean),
score: { total: cialdiniScore, max: maxScore, label: 'Cialdini Score' }
};
}
return {
verdict: 'go',
name: 'Persuasion Architecture Locked',
reasons: [
`Cialdini score ${cialdiniScore}/${maxScore}. Big Domino named. False beliefs mapped. Reciprocity gift in place.`,
'RISER doctrine: "Copy is the surface. Persuasion is the structure underneath. The structure decides the conversion rate."',
'Action: proceed to Gate 07. Deploy.'
],
score: { total: cialdiniScore, max: maxScore, label: 'Cialdini Score' }
};
}
case 'deploy': {
const date = (a.deploy_date || '').trim();
const size = a.deploy_size;
const price = parseFloat(a.deploy_price || 0);
const kill = a.deploy_kill_rule;
const tools = a.deploy_4_tools;
if (!date || !size || !price || !kill || !tools) {
return {
verdict: 'rework',
name: 'Deploy Plan Incomplete',
reasons: ['Lock all five fields before scheduling launch.']
};
}
if (tools === 'fewer') {
return {
verdict: 'no',
name: 'Tools Are Not Ready',
reasons: [
'RISER minimum: capture leads, take payment, deliver, measure. If you cannot do all four, the launch will fail invisibly.',
'Action: spend the next 7 days getting all 4 tools live. Then return.'
]
};
}
if (kill === 'loose') {
return {
verdict: 'rework',
name: 'No Kill Rule = No Discipline',
reasons: [
'RISER doctrine: "If you cannot define failure, you will rationalize it forever."',
'Action: pick a tight kill rule. <5 paid in 14 days = pivot is the default. Without this, a bad launch becomes a 6-month grind.'
]
};
}
if (size === 'big') {
return {
verdict: 'rework',
name: 'Beta Cohort Too Large',
reasons: [
'First-launch beta of 50+ almost always fails on delivery quality.',
'Operating rule: 10 over-served founding members produce 10× the testimonial density of 50 mediocre ones.',
'Action: cut size to 5-25 for the first cohort. Run a second cohort 60 days later if the first works.'
]
};
}
if (price >= 500 && price <= 900) {
return {
verdict: 'rework',
name: 'Muddled Middle Price',
reasons: [
`$${price} is in the Muddled Middle ($500-$900). Too expensive for impulse, too cheap for premium.`,
'Action: drop to $497 (impulse-adjacent) or raise to $997+ (premium). Pick one and commit.'
]
};
}
return {
verdict: 'go',
name: 'Cleared for Launch',
reasons: [
`Date locked: ${date}. Size: ${size}. Price: $${price}. Kill rule defined. Tools live.`,
'RISER doctrine: "Launch ugly. The market is the editor."',
'Action: ship. Then move to Gate 08 — iterate.'
]
};
}
case 'iterate': {
const atBats = a.iter_at_bats;
const signal = (a.iter_signal || '').trim().length >= 30;
const lever = a.iter_lever;
const awareness = a.iter_awareness;
const sophistication = a.iter_sophistication;
const refunds = a.iter_refund_interviews;
if (!atBats || !signal || !lever || !awareness || !sophistication || !refunds) {
return {
verdict: 'rework',
name: 'Iteration Plan Unclear',
reasons: [
!atBats ? 'Pick at-bats level.' : null,
!signal ? 'Name the dominant pattern from real customer data.' : null,
!lever ? 'Pick the lever to adjust.' : null,
!awareness ? 'Diagnose the awareness stage. Iterating without knowing the stage usually moves the wrong lever.' : null,
!sophistication ? 'Diagnose the market sophistication. Tells you whether you need a bigger claim or a new mechanism.' : null,
!refunds ? 'Declare your refund interview discipline.' : null,
'Complete all six fields before iterating.'
].filter(Boolean)
};
}
if (atBats === 'tiny') {
return {
verdict: 'no',
name: 'Iterating on Noise',
reasons: [
'Fewer than 10 conversations is not signal — it is anecdote.',
'RISER doctrine: "Volume forgives mistakes. The operator who has 100 conversations learns more than the one who has 5 perfect ones."',
'Action: do not iterate yet. Run 20 more conversations. Same questions. Same script. Then return.'
]
};
}
if (atBats === 'partial') {
return {
verdict: 'rework',
name: 'Almost Enough Data',
reasons: [
'10-20 conversations is borderline. The pattern may be real or may be small-sample distortion.',
'Action: run 10 more. If the pattern persists, iterate. If it shifts, the original "pattern" was noise.'
]
};
}
if (refunds === 'never') {
return {
verdict: 'rework',
name: 'Throwing Away Refund Data',
reasons: [
'Hormozi: "The refund call is the most valuable sales call you will ever take." Silent refunds = lost diagnostic.',
'Action: starting tomorrow, every refund triggers a 5-question call. Pattern across 10 refunds tells you whether it is hook, audience, offer, onboarding, or delivery.'
]
};
}
// Sophistication-aware lever guidance
const stageMessage = (() => {
if (sophistication === 's3' || sophistication === 's4' || sophistication === 's5') {
if (lever === 'dream' || lever === 'likelihood') {
return 'Note: in a Stage 3-5 market, dream/likelihood lever moves alone usually fail because the claim category is worn out. Pair this lever with a NEW MECHANISM rename for compound effect.';
}
}
return null;
})();
return {
verdict: 'go',
name: 'Iterate Lever Locked',
reasons: [
`Pattern observed in 20+ conversations. Adjusting Value Equation lever: ${lever}.`,
`Awareness stage: ${awareness}. Market sophistication: ${sophistication}.`,
stageMessage,
'RISER doctrine: "One lever per cycle. Multiple changes at once = rebuild, not iterate."',
'Action: change ONLY this lever. Re-launch. Re-measure for 30 days. Then assess.'
].filter(Boolean)
};
}
case 'pivot': {
const ctr = a.pivot_metric_ctr;
const optin = a.pivot_metric_optin;
const close = a.pivot_metric_close;
if (!ctr || !optin || !close) {
return {
verdict: 'rework',
name: 'Diagnostic Incomplete',
reasons: ['Answer all three funnel diagnostic questions.']
};
}
if (ctr === 'no') {
return {
verdict: 'rework',
name: 'HOOK Problem',
reasons: [
'Low CTR / low engagement = the audience does not look at your message.',
'RISER doctrine: "If the hook does not stop the scroll, nothing downstream matters."',
'Action: write 10 new hooks. Test each at minimum 100 impressions. Pick the top 2 and rebuild.'
]
};
}
if (optin === 'low') {
return {
verdict: 'rework',
name: 'AUDIENCE Problem',
reasons: [
'People click but do not opt-in or buy. The audience clicking is wrong.',
'RISER doctrine: "Clicks are vanity. Conversions are sanity."',
'Action: refine targeting. Look at WHO clicks. They probably are not your avatar. Tighten your messaging to repel non-buyers.'
]
};
}
if (close === 'bad') {
return {
verdict: 'no',
name: 'OFFER Problem — Do Not Scale',
reasons: [
'Refunds >10% or negative NPS means the offer cannot sustain customers.',
'Operating rule: do not scale a leaky bucket. Volume just produces refunds + reputation damage.',
'Action: pause acquisition. Fix delivery. Survey refunders. Do not deploy more spend until refund rate is below 5%.'
]
};
}
if (close === 'mid') {
return {
verdict: 'rework',
name: 'Offer Borderline',
reasons: [
'Refund rate 5-10% is workable but not scalable.',
'Action: improve onboarding before scaling. Engineer the first-week experience.'
]
};
}
return {
verdict: 'go',
name: 'Funnel Healthy',
reasons: [
'Hook stops scroll. Audience converts. Offer retains.',
'You have what most operators chase for years.',
'Action: proceed to Gate 10. Scale.'
]
};
}
case 'scale': {
const signal = a.scale_signal;
const lever = a.scale_lever;
const constraint = (a.scale_constraint || '').trim().length >= 20;
if (!signal || !lever || !constraint) {
return {
verdict: 'rework',
name: 'Scale Plan Unclear',
reasons: ['Pick the signal status, the scale lever, and name the constraint.']
};
}
if (signal === 'no') {
return {
verdict: 'no',
name: 'No Scale Signal',
reasons: [
'Without 10+ customers from one channel + 6 months retention data, "scale" is gambling.',
'Action: stay in iterate loop. Get to 10 customers + 6 months data first. Scaling now will multiply problems, not customers.'
]
};
}
if (signal === 'partial') {
return {
verdict: 'rework',
name: 'Almost Ready',
reasons: [
'Some signal, partial data. Premature scale risks burning cash before you know what works.',
'Action: get to full signal (10 customers, 6 months retention) before adding spend.'
]
};
}
if (lever === 'volume') {
return {
verdict: 'rework',
name: 'Volume Is the Wrong First Lever',
reasons: [
'Operating rule: 10% price increase ≈ 50%+ profit increase. Volume is the third lever, not the first.',
'Action: test a price increase first (raise by 10-20%, measure conversion impact). If conversion holds, the new price compounds with no extra acquisition cost.'
]
};
}
return {
verdict: 'go',
name: 'Cleared to Scale',
reasons: [
`Lever: ${lever}. Constraint named.`,
'RISER doctrine: "Scale what works. Do not scale what might work."',
'Action: pour gas on the named lever. Hold all other variables. Re-evaluate at 30 days.'
]
};
}
case 'repeat': {
const next = (a.repeat_next_problem || '').trim().length >= 30;
const decision = a.repeat_decision;
const maxed = a.repeat_constraint_check;
const bait = (a.repeat_ladder_bait || '').trim();
const tripwire = (a.repeat_ladder_tripwire || '').trim();
const core = (a.repeat_ladder_core || '').trim();
const continuityRung = (a.repeat_ladder_continuity || '').trim();
const high = (a.repeat_ladder_high || '').trim();
const continuityStatus = a.repeat_continuity_status;
const affiliate = a.repeat_dream100_affiliate;
// Count rungs filled
const ladderCount = [bait, tripwire, core, continuityRung, high].filter(r => r.length >= 5).length;
if (!next || !decision || !maxed || !continuityStatus || !affiliate) {
return {
verdict: 'rework',
name: 'Compound Plan Incomplete',
reasons: [
!next ? 'Name the next problem.' : null,
!decision ? 'Pick the next move.' : null,
!maxed ? 'Declare whether the current offer is maxed.' : null,
!continuityStatus ? 'Declare continuity health.' : null,
!affiliate ? 'Declare affiliate / partner activation status.' : null,
'Action: complete the missing fields before scoring.'
].filter(Boolean)
};
}
if (maxed === 'bored') {
return {
verdict: 'no',
name: 'Boredom Is Not Strategy',
reasons: [
'RISER doctrine: "Most operators leave 70% of the value in their first business on the table because they got bored at 30%."',
'Action: re-engage the current business. Boredom signals you have automated the wrong things or stopped talking to customers. Fix that first.'
]
};
}
if (decision === 'new') {
return {
verdict: 'rework',
name: 'New Business = Compound Tax',
reasons: [
'Building a second business from zero gives up the audience, channel, and brand equity you spent years building.',
'Operating rule: deepen before you broaden.',
'Action: re-pick the move. The compound move is "new offer to same audience." That is 5× the LTV at 0× the new acquisition cost.'
]
};
}
if (continuityStatus === 'none') {
return {
verdict: 'no',
name: 'No Continuity = No Compound',
reasons: [
'Hormozi: "The single highest LTV-per-dollar move is continuity." Without a continuity offer, every customer is a one-time transaction.',
'Action: build continuity FIRST. Skool community, software subscription, monthly coaching, certification renewal. The next compound move comes after this rung exists.'
]
};
}
if (ladderCount < 3) {
return {
verdict: 'rework',
name: 'Value Ladder Too Short',
reasons: [
`Only ${ladderCount} of 5 rungs named (Bait, Tripwire, Core, Continuity, High-Ticket).`,
'Brunson: "A single offer is a product. A ladder is a business." Without rungs above and below your core, you cannot capture upstream leads or downstream profit.',
'Action: name at least Bait + Core + Continuity. The high-ticket and tripwire can come later, but those three are the minimum viable ladder.'
]
};
}
if (maxed === 'midway') {
return {
verdict: 'rework',
name: 'Compound Premature',
reasons: [
'Adding a new offer before the current one is at its limit dilutes focus.',
'Action: maximize the current offer first. Raise prices. Improve retention. Add upsells. THEN add a new offer.'
]
};
}
if (affiliate === 'none' && continuityStatus !== 'strong') {
return {
verdict: 'rework',
name: 'Compound Engine Half-Built',
reasons: [
'No affiliate motion AND continuity below 60%. Two of the three compound levers are dormant.',
'Action: pick the easier one to activate first. For most operators, formalizing referrals into a 30%-commission affiliate program is the faster lift.'
]
};
}
return {
verdict: 'go',
name: 'Compound the Moat',
reasons: [
`Ladder rungs filled: ${ladderCount}/5. Continuity: ${continuityStatus}. Affiliate: ${affiliate}.`,
`Next move: ${decision === 'deepen' ? 'new offer, same audience, same channel — best play' : decision === 'expand' ? 'same offer, adjacent audience' : 'channel diversification'}.`,
'RISER doctrine: "Three offers to the same audience is a moat. A ladder, a continuity, and an affiliate army is a fortress."',
'Action: design the next offer using Gate 04 again. Same audience, new problem, same delivery rhythm.'
]
};
}
}
return null;
}
// ============================================================
// RENDERING
// ============================================================
function renderProgressRail() {
const rail = document.getElementById('progress-rail');
rail.innerHTML = '';
GATES.forEach((gate, i) => {
const cell = document.createElement('div');
cell.className = 'gate-cell';
if (i === state.currentGate) cell.classList.add('active');
const v = state.verdicts[gate.id];
if (v) cell.classList.add(v);
cell.innerHTML = `
<div class="num">${gate.num}</div>
<div class="name">${gate.name}</div>
`;
cell.addEventListener('click', () => navigateToGate(i));
rail.appendChild(cell);
});
}
function renderGate(idx) {
state.currentGate = idx;
const gate = GATES[idx];
const host = document.getElementById('gate-host');
host.innerHTML = '';
const screen = document.createElement('section');
screen.className = 'gate-screen visible';
screen.id = `gate-${gate.id}`;
if (gate.isIntro) {
screen.innerHTML = renderIntro();
} else if (gate.isSummary) {
screen.innerHTML = renderSummary();
} else if (gate.isPainDiscovery) {
screen.innerHTML = renderPainDiscovery(gate);
} else {
screen.innerHTML = renderQuestionGate(gate);
}
host.appendChild(screen);
attachGateHandlers(gate);
saveState();
renderProgressRail();
window.scrollTo({ top: 0, behavior: 'smooth' });
}
function renderIntro() {
const hasProgress = Object.keys(state.answers).length > 0;
return `
${hasProgress ? `
<div class="resume-banner">
<div><strong>Welcome back.</strong> You have answers saved from a previous session. Pick up where you left off, or reset to start over.</div>
<button class="btn-mini" id="btn-resume">Resume</button>
</div>
` : ''}
<div class="gate-rubric">How this works</div>
<h2>Welcome to the <em>MVO Engine</em></h2>
<div class="intro-card">
<h3>What this tool does</h3>
<p>Sixteen gates from "what does the market actually hurt over?" to "compound the moat." At each gate, the tool either says <strong>GO</strong> with the next concrete action, <strong>NO</strong> with the specific reason your idea fails this gate, or <strong>REWORK</strong> with what to sharpen before retrying. Gate 00½ (Pain Discovery) lets you import PainOnSocial scans, customer interviews, or any structured voice-of-customer research as the seed data — every downstream gate runs sharper when you do.</p>
<p>Built on RISER Captain's Logic — operating doctrine refined across multiple operator playbooks (Hormozi's $100M Offers + $100M Leads, Brunson's DotCom/Expert/Traffic Secrets, Dan Kennedy's No B.S. direct response, Cialdini's persuasion architecture) and stress-tested in live launches. At each gate, the tool tells you what a senior operator would tell you: where the idea is real, where it is theater, and what to fix before retrying.</p>
<p><strong>Your answers save automatically.</strong> Close the tab and come back. Your progress and verdicts persist. At the end, print or export your one-page brief.</p>
<ul class="gate-list">
${GATES.filter(g => !g.isIntro && !g.isSummary).map(g => `
<li><span class="num">${g.num}</span>${g.name}</li>
`).join('')}
</ul>
<p style="font-size: 14.5px; color: var(--muted); font-style: italic;">Designed to save you 90 days on a bad idea, or compress 90 days on a good one. The faster you get a NO, the faster you get to the YES that matters.</p>
</div>
<div class="action-row">
<div></div>
<button class="btn primary" id="btn-start">Begin →</button>
</div>
`;
}
function renderPainDiscovery(gate) {
const cards = state.painCards || [];
const lead = getLeadPainCard();
const vocCount = (state.voCVault || []).length;
const idx = GATES.findIndex(g => g.id === gate.id);
const verdict = state.verdicts[gate.id];
const verdictData = verdict ? computeVerdict(gate.id) : null;
let html = `
<div class="gate-rubric">${gate.rubric}</div>
<h2>${gate.title}</h2>
<div class="principle">
${gate.principle.text}
<span class="source">Source: ${gate.principle.source}</span>
</div>
<div class="pain-intro-callout">
<p><strong>If you have run external research</strong> — a PainOnSocial scan, customer interviews, support-ticket analysis, sales-call transcripts — paste 1–5 pain cards below. Each card seeds the gates downstream: avatar, problem, offer, copy, persuasion. The widget converts your research into structured verdicts.</p>
<p style="margin-top:10px;"><strong>If you have not done external research yet</strong> — skip this gate. Your answers will be operator hypotheses, not market evidence. The widget still works; it just runs on weaker fuel. You can return here anytime once you have data.</p>
<div class="skip-row">
<button class="btn-mini" id="pain-skip-btn">Skip · I have no research yet →</button>
</div>
</div>
`;
// Pain cards list
if (cards.length > 0) {
html += '<div class="pain-cards-list">';
cards.forEach((card, i) => {
const isLead = card.id === state.leadPainId;
html += renderPainCard(card, i, isLead);
});
html += '</div>';
} else {
html += `
<div class="skip-pain-banner">
No pain cards yet. Click "Add a pain card" to paste your first one. You can add up to 5.
</div>
`;
}
// Add card button
const canAddMore = cards.length < 5;
html += `
<button class="add-pain-card-btn" id="pain-add-btn" ${canAddMore ? '' : 'disabled'}>
${canAddMore ? '+ Add a pain card' : 'Maximum 5 cards reached'}
</button>
`;
// Lead picker
if (cards.length >= 2) {
html += `
<div class="lead-picker">
<h4>Pick the lead pain card</h4>
<p class="help">The lead card seeds Gate 01 (avatar + pain) and Gate 03 (problem). Other cards stay in the VOC vault as supporting evidence. You can change this anytime.</p>
<div class="choice-group cols-1" data-lead-picker>
`;
cards.forEach(card => {
const isLead = card.id === state.leadPainId;
const titleDisplay = (card.title || 'Untitled pain').slice(0, 100);
const score = card.score ? ` · score ${card.score}/100` : '';
const quotes = (card.quotes || []).filter(q => q && q.trim()).length;
const quotesDisplay = quotes ? ` · ${quotes} quote${quotes !== 1 ? 's' : ''}` : '';
html += `
<button type="button" class="choice-btn ${isLead ? 'selected' : ''}" data-pick-lead="${card.id}">
<span class="label">${escapeHtml(titleDisplay)}${score}${quotesDisplay}</span>
<span class="sub">Source: ${escapeHtml(card.sourceCommunity || 'Not specified')}</span>
</button>
`;
});
html += '</div></div>';
} else if (cards.length === 1) {
// Auto-lead the single card if not already set
if (!state.leadPainId) {
state.leadPainId = cards[0].id;
}
}
// Cluster picker (only shown when there's a lead AND ≥2 cards)
if (lead && cards.length >= 2) {
html += `
<div class="lead-picker" style="border-left-color: var(--teal); background: var(--paper-warm);">
<h4>Cluster (optional)</h4>
<p class="help">If multiple pain cards orbit the same root frustration, group them into a cluster. The cluster's combined evidence drives Gate 03 (Profitable Problem). Leave un-clustered if each pain stands alone.</p>
<div class="choice-group cols-1">
`;
cards.forEach(card => {
if (card.id === lead.id) return; // The lead is implicitly in its own cluster
const inCluster = card.clusterId && card.clusterId === lead.clusterId;
const titleDisplay = (card.title || 'Untitled pain').slice(0, 80);
html += `
<button type="button" class="choice-btn ${inCluster ? 'selected' : ''}" data-cluster-toggle="${card.id}">
<span class="label">${inCluster ? '✓ ' : ''}${escapeHtml(titleDisplay)}</span>
<span class="sub">${inCluster ? 'In cluster with the lead pain' : 'Click to add to cluster'}</span>
</button>
`;
});
html += '</div></div>';
}
// VOC summary
if (vocCount > 0) {
html += `
<div class="voc-summary">
<div>
<div>Voice-of-Customer Vault</div>
<div style="font-family: var(--serif); text-transform: none; letter-spacing: 0; font-style: italic; font-size: 13.5px; color: #c9b88a; margin-top: 4px;">Available across all downstream gates via the "Pull from VOC vault" button.</div>
</div>
<div class="count">${vocCount}</div>
</div>
`;
}
// Apply-to-Gate-01 button
if (lead) {
const targetIdx = GATES.findIndex(g => g.id === 'avatar');
const hasAvatarText = (state.answers.avatar_who || '').trim().length > 0 || (state.answers.avatar_pain || '').trim().length > 0;
html += `
<div class="callout" style="border-left-color: var(--green); margin-top: 22px;">
<strong>Lead pain selected.</strong> Click below to seed Gate 01 (avatar + pain) and Gate 03 (frequency) from this card. ${hasAvatarText ? 'This will OVERWRITE any text already in those fields.' : 'The fields are empty, safe to apply.'}
<div style="margin-top: 12px;">
<button class="btn primary" id="pain-apply-btn">Apply lead pain to downstream gates →</button>
</div>
</div>
`;
}
// Verdict
if (verdictData) {
html += renderVerdict(verdictData);
}
// Action row
html += `
<div class="action-row">
<div>
<button class="btn" data-nav="${idx - 1}">← 00 Start</button>
</div>
<div style="display:flex; gap:8px;">
<button class="btn primary" id="btn-evaluate" data-gate="${gate.id}">Evaluate Gate</button>
<button class="btn" data-nav="${idx + 1}">Next →</button>
</div>
</div>
`;
return html;
}
function renderPainCard(card, index, isLead) {
const quotes = card.quotes && card.quotes.length > 0 ? card.quotes : [''];
let quotesHtml = '';
quotes.forEach((q, qi) => {
quotesHtml += `
<div class="quote-row">
<textarea data-card-quote="${card.id}" data-quote-idx="${qi}" placeholder="Verbatim customer quote — paste exactly as they wrote it">${escapeHtml(q || '')}</textarea>
<button type="button" class="x-btn" data-card-remove-quote="${card.id}" data-quote-idx="${qi}" title="Remove this quote">×</button>
</div>
`;
});
return `
<div class="pain-card ${isLead ? 'is-lead' : ''}" data-card-id="${card.id}">
<div class="card-head">
<div>
<span class="card-num">PAIN CARD ${String(index + 1).padStart(2, '0')}</span>
${isLead ? '<span class="lead-badge">Lead</span>' : ''}
${card.clusterId ? '<span class="cluster-pill">Clustered</span>' : ''}
</div>
<div class="card-actions">
<button type="button" class="btn-mini danger" data-card-remove="${card.id}" title="Remove this pain card">Remove</button>
</div>
</div>
<div class="card-grid">
<div>
<label>Pain title</label>
<input type="text" data-card-field="title" data-card-id="${card.id}" value="${escapeHtml(card.title || '')}" placeholder="e.g., Solo CPAs can't move from hourly to retainer pricing" />
</div>
<div>
<label>Score (0–100)</label>
<input type="number" min="0" max="100" data-card-field="score" data-card-id="${card.id}" value="${card.score || ''}" placeholder="e.g., 87" />
</div>
<div>
<label>Frequency</label>
<select data-card-field="frequency" data-card-id="${card.id}">
<option value="" ${!card.frequency ? 'selected' : ''}>—</option>
<option value="daily" ${card.frequency === 'daily' ? 'selected' : ''}>Daily / weekly</option>
<option value="monthly" ${card.frequency === 'monthly' ? 'selected' : ''}>Monthly</option>
<option value="quarterly" ${card.frequency === 'quarterly' ? 'selected' : ''}>Quarterly / seasonal</option>
<option value="once" ${card.frequency === 'once' ? 'selected' : ''}>One-time / project</option>
</select>
</div>
</div>
<div class="row-full">
<label>Source community / URL</label>
<input type="text" data-card-field="sourceCommunity" data-card-id="${card.id}" value="${escapeHtml(card.sourceCommunity || '')}" placeholder="e.g., r/Accounting · r/SoloAccounting · PainOnSocial scan ID" />
</div>
<div class="row-full">
<label>Audience profile (who is suffering, in your words)</label>
<textarea data-card-field="audience" data-card-id="${card.id}" placeholder="e.g., Solo CPAs in their first 24 months, billing under $7K/mo, post-Big-4, 32-45...">${escapeHtml(card.audience || '')}</textarea>
</div>
<div class="row-full quotes-block">
<label>Verbatim quotes (paste 1–5 — these become the VOC vault)</label>
${quotesHtml}
<button type="button" class="add-quote-btn" data-card-add-quote="${card.id}">+ Add another quote</button>
</div>
<div class="row-full">
<label>AI solution seeds (1–3 from PainOnSocial or your own — these become Mechanism hints in Gate 04)</label>
<textarea data-card-field="solutions" data-card-id="${card.id}" placeholder="e.g., (1) SaaS retainer-pricing calculator, (2) DWY 90-day retainer sprint, (3) Done-for-you proposal templates">${escapeHtml(card.solutions || '')}</textarea>
</div>
</div>
`;
}
function renderQuestionGate(gate) {
let html = `
<div class="gate-rubric">${gate.rubric}</div>
<h2>${gate.title}</h2>
<div class="principle">
${gate.principle.text}
<span class="source">Source: ${gate.principle.source}</span>
</div>
`;
// Lead pain context banner — shown on gates that depend on the lead pain
const leadPain = getLeadPainCard();
const showLeadBanner = leadPain && ['avatar', 'problem', 'offer', 'copy', 'persuasion'].includes(gate.id);
if (showLeadBanner) {
const score = leadPain.score ? ` · score ${leadPain.score}/100` : '';
const quotes = (leadPain.quotes || []).filter(q => q && q.trim()).length;
const cluster = getClusterCards();
const clusterNote = cluster.length > 1 ? ` · clustered with ${cluster.length - 1} other pain${cluster.length - 1 !== 1 ? 's' : ''}` : '';
html += `
<div class="lead-context-banner">
<span class="label">Lead pain</span><strong>${escapeHtml((leadPain.title || 'Untitled').slice(0, 80))}</strong>${score} · ${quotes} quote${quotes !== 1 ? 's' : ''}${clusterNote}
</div>
`;
}
gate.inputs.forEach(input => {
html += renderInput(input, state.answers[input.id]);
});
// Check verdict status
const verdict = state.verdicts[gate.id];
if (verdict) {
const verdictData = computeVerdict(gate.id);
if (verdictData) {
html += renderVerdict(verdictData);
}
}
// Action row
const idx = GATES.findIndex(g => g.id === gate.id);
const isLast = idx === GATES.length - 1;
const prevGate = idx > 0 ? GATES[idx - 1] : null;
html += `
<div class="action-row">
<div>
${prevGate ? `<button class="btn" data-nav="${idx - 1}">← ${prevGate.num} ${prevGate.name}</button>` : ''}
</div>
<div style="display:flex; gap:8px;">
<button class="btn primary" id="btn-evaluate" data-gate="${gate.id}">Evaluate Gate</button>
${verdict && verdict !== 'no' ? `<button class="btn" data-nav="${idx + 1}">Next →</button>` : ''}
</div>
</div>
`;
return html;
}
// ============================================================
// VERIFY LINK BUILDER — pre-fill external search URLs with the
// operator's actual avatar/pain text. Free, no-login sources only.
// ============================================================
const STOP_WORDS = new Set([
'a','an','the','and','or','but','if','then','of','to','for','in','on','at','by',
'with','without','from','as','is','are','was','were','be','been','being','have',
'has','had','do','does','did','will','would','should','could','can','may','might',
'i','me','my','we','our','you','your','he','she','it','they','them','their',
'who','what','where','when','why','how','this','that','these','those',
'so','also','very','just','really','actually','about','because','want','wants',
'wanting','need','needs','needing','earn','earning','get','getting','make','makes'
]);
function extractKeywords(text, maxWords = 6) {
if (!text) return '';
const cleaned = String(text)
.toLowerCase()
.replace(/[^a-z0-9\s\-]/g, ' ')
.replace(/\s+/g, ' ')
.trim();
const words = cleaned.split(' ').filter(w => w.length >= 3 && !STOP_WORDS.has(w));
// Preserve order, dedupe, cap to maxWords
const seen = new Set();
const kept = [];
for (const w of words) {
if (!seen.has(w)) { seen.add(w); kept.push(w); }
if (kept.length >= maxWords) break;
}
return kept.join(' ');
}
function getNicheKeywords() {
// Pull from avatar_who first (the niche), fall back to avatar_pain
const who = state.answers.avatar_who || '';
const pain = state.answers.avatar_pain || '';
return extractKeywords(who, 6) || extractKeywords(pain, 6);
}
function getPainKeywords() {
// Pain-flavored keywords — include emotional/complaint words
const pain = state.answers.avatar_pain || '';
return extractKeywords(pain, 6);
}
function buildVerifyURL(source) {
const niche = getNicheKeywords();
const pain = getPainKeywords();
const q = (s) => encodeURIComponent(s);
// No keywords? Return the homepage as fallback (caller flags this).
const has = niche.length > 0;
switch (source) {
// === Niche-aware search URLs ===
case 'reddit':
return has ? `https://www.reddit.com/search/?q=${q(niche)}&sort=relevance` : 'https://www.reddit.com/';
case 'reddit_communities':
return has ? `https://www.reddit.com/search/?q=${q(niche)}&type=sr` : 'https://www.reddit.com/subreddits';
case 'reddit_pain':
return has ? `https://www.reddit.com/search/?q=${q(niche + ' ' + (pain || 'problem'))}&sort=top&t=year` : 'https://www.reddit.com/';
case 'reddit_pain_intensity':
return has ? `https://www.reddit.com/search/?q=${q(niche + ' "i hate" OR "i cannot" OR "frustrated"')}&sort=top&t=year` : 'https://www.reddit.com/';
case 'reddit_pricing':
return has ? `https://www.reddit.com/search/?q=${q(niche + ' "how much do you charge" OR pricing OR rates')}&sort=top&t=year` : 'https://www.reddit.com/';
case 'reddit_growth':
return has ? `https://www.reddit.com/search/?q=${q(niche)}&sort=top&t=month` : 'https://www.reddit.com/';
case 'reddit_top':
return has ? `https://www.reddit.com/search/?q=${q(niche)}&sort=top&t=month` : 'https://www.reddit.com/';
case 'google_site_reddit':
return has ? `https://www.google.com/search?q=${q('site:reddit.com ' + niche)}` : 'https://www.google.com/';
case 'google_pricing':
return has ? `https://www.google.com/search?q=${q(niche + ' pricing OR "how much"')}` : 'https://www.google.com/';
case 'google_news':
return has ? `https://www.google.com/search?q=${q(niche)}&tbm=nws&tbs=qdr:y` : 'https://news.google.com/';
case 'facebook_groups':
return has ? `https://www.google.com/search?q=${q('site:facebook.com/groups ' + niche)}` : 'https://www.google.com/';
case 'google_trends':
return has ? `https://trends.google.com/trends/explore?q=${q(niche)}&date=today%205-y` : 'https://trends.google.com/trends/';
case 'youtube':
return has ? `https://www.youtube.com/results?search_query=${q(niche)}` : 'https://www.youtube.com/';
case 'youtube_howto':
return has ? `https://www.youtube.com/results?search_query=${q('how to ' + niche)}` : 'https://www.youtube.com/';
case 'youtube_course':
return has ? `https://www.youtube.com/results?search_query=${q(niche + ' course OR coaching')}` : 'https://www.youtube.com/';
case 'youtube_channels':
return has ? `https://www.youtube.com/results?search_query=${q(niche)}&sp=EgIQAg%253D%253D` : 'https://www.youtube.com/';
case 'twitter':
return has ? `https://twitter.com/search?q=${q(niche)}&src=typed_query&f=live` : 'https://twitter.com/explore';
case 'twitter_complaint':
return has ? `https://twitter.com/search?q=${q(niche + ' ("i hate" OR "i cannot" OR "frustrated")')}&src=typed_query&f=live` : 'https://twitter.com/explore';
case 'tiktok':
return has ? `https://www.tiktok.com/search?q=${q(niche)}` : 'https://www.tiktok.com/';
case 'quora':
return has ? `https://www.quora.com/search?q=${q(niche)}` : 'https://www.quora.com/';
case 'indeed':
return has ? `https://www.indeed.com/jobs?q=${q(niche)}` : 'https://www.indeed.com/';
case 'flippa':
return has ? `https://flippa.com/search?search%5Bquery%5D=${q(niche)}` : 'https://flippa.com/';
case 'indiehackers':
return has ? `https://www.indiehackers.com/search?q=${q(niche)}` : 'https://www.indiehackers.com/';
default:
return 'https://www.google.com/';
}
}
function hasVerifyContext() {
return getNicheKeywords().length > 0;
}
// ============================================================
// AI SHARPEN — call the Anthropic API directly from the browser.
// Stores API key in localStorage. Single-user / personal use only.
// ============================================================
// Model alias. 'claude-sonnet-4-6' is Anthropic's current canonical alias for Sonnet 4.6
// (released Feb 2026). Fast + cheap, well-suited to a 700-token JSON critique.
// To upgrade to the strongest available model, swap to 'claude-opus-4-7' (released Apr 2026).
// Pinned snapshot alternatives: 'claude-sonnet-4-5-20250929' (older, more deterministic).
const ANTHROPIC_MODEL = 'claude-sonnet-4-6';
const ANTHROPIC_API_KEY_STORAGE = 'mvo-anthropic-key';
const SHARPEN_SYSTEM_PROMPT = `You are an operating coach reviewing a founder's answer in an early-stage market validation tool.
Your job: critique their answer for specificity. You are direct, honest, and useful. You do not flatter. If the answer is vague, you say so plainly. If it is sharp, you confirm what is working and push the operator one level deeper.
You always return your response as a single valid JSON object with exactly these four keys:
{
"score": <integer 1-10, where 10 = a precise, falsifiable answer with named details, 1 = pure aspiration with no specifics>,
"critique": "<2-3 sentences. What is the answer's actual specificity level? What is missing that would make this useful? Be direct, not gentle.>",
"weakest": "<1 sentence naming the single weakest element of the answer.>",
"rewrite": "<A 2-4 sentence rewrite of the operator's answer that is sharper, more specific, and uses any concrete details the operator did supply. If they gave you nothing concrete, write a rewrite that demonstrates what specificity looks like for this kind of answer using a plausible filled-in example.>"
}
CRITICAL RULES:
- Return ONLY the JSON object. No prose before or after. No markdown code fences. No explanation.
- Use double quotes for all strings.
- Do not invent facts the operator did not give. The "rewrite" should illustrate what specificity looks like, not fabricate a customer.
- If the operator's answer contains a real specific detail, preserve it in the rewrite.
You are evaluating two kinds of answers:
- inputType "avatar_who": who exactly is the customer. Specificity = role, industry, size, age, location, income tier, named characteristics.
- inputType "avatar_pain": what specific pain the customer feels. Specificity = quoted language, named time/place/trigger, evidence the operator has heard this from real people.`;
function getApiKey() {
try { return localStorage.getItem(ANTHROPIC_API_KEY_STORAGE) || ''; }
catch (e) { return ''; }
}
function setApiKey(key) {
try { localStorage.setItem(ANTHROPIC_API_KEY_STORAGE, key); }
catch (e) {}
}
function clearApiKey() {
try { localStorage.removeItem(ANTHROPIC_API_KEY_STORAGE); }
catch (e) {}
}
function modelDisplayName() {
// Map current Anthropic model aliases to human-readable names for UI.
const map = {
'claude-opus-4-7': 'Claude Opus 4.7',
'claude-opus-4-6': 'Claude Opus 4.6',
'claude-sonnet-4-6': 'Claude Sonnet 4.6',
'claude-sonnet-4-5': 'Claude Sonnet 4.5',
'claude-haiku-4-5': 'Claude Haiku 4.5'
};
return map[ANTHROPIC_MODEL] || ANTHROPIC_MODEL;
}
async function runAiSharpen(inputId) {
const panel = document.querySelector(`[data-help-panel="ai-${inputId}"]`);
if (!panel) return;
const emptyEl = panel.querySelector('[data-ai-empty]');
const loadingEl = panel.querySelector('[data-ai-loading]');
const resultEl = panel.querySelector('[data-ai-result]');
const errorEl = panel.querySelector('[data-ai-error]');
// Check API key first
const apiKey = getApiKey();
if (!apiKey || !apiKey.startsWith('sk-ant-')) {
if (emptyEl) emptyEl.style.display = 'none';
errorEl.style.display = 'block';
errorEl.innerHTML = `<p><strong>API key needed.</strong> Click the <em>Settings</em> button in the top right to paste your Anthropic key. Get one at <a href="https://console.anthropic.com" target="_blank" rel="noopener">console.anthropic.com</a> → API Keys.</p>`;
return;
}
// Read the operator's current answer
const answer = (state.answers[inputId] || '').trim();
if (answer.length < 10) {
if (emptyEl) emptyEl.style.display = 'none';
errorEl.style.display = 'block';
errorEl.innerHTML = '<p>Type at least a few sentences first. Claude needs something to critique.</p>';
return;
}
const inputType = inputId; // 'avatar_who' or 'avatar_pain'
// Show loading state
if (emptyEl) emptyEl.style.display = 'none';
if (resultEl) { resultEl.style.display = 'none'; resultEl.innerHTML = ''; }
if (errorEl) { errorEl.style.display = 'none'; errorEl.innerHTML = ''; }
loadingEl.style.display = 'block';
try {
const userMessage = `inputType: ${inputType}
The operator's current answer:
"""
${answer}
"""
Critique this answer per your instructions. Return only the JSON object.`;
const response = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
'anthropic-version': '2023-06-01',
'anthropic-dangerous-direct-browser-access': 'true'
},
body: JSON.stringify({
model: ANTHROPIC_MODEL,
max_tokens: 700,
system: SHARPEN_SYSTEM_PROMPT,
messages: [{ role: 'user', content: userMessage }]
})
});
if (!response.ok) {
const errText = await response.text();
let errMsg;
if (response.status === 401) {
errMsg = 'Invalid API key. Click Settings (top right) and re-enter your key.';
} else if (response.status === 429) {
errMsg = 'Rate limited. Wait 30 seconds and try again.';
} else if (response.status === 400) {
errMsg = 'Anthropic rejected the request. Possibly out of credits or model name changed.';
} else {
errMsg = `Anthropic API returned ${response.status}: ${errText.slice(0, 200)}`;
}
throw new Error(errMsg);
}
const apiData = await response.json();
const rawText = (apiData.content && apiData.content[0] && apiData.content[0].text) || '';
// Parse Claude's JSON. Strip code fences if present.
let parsed;
try {
let cleanText = rawText.trim();
cleanText = cleanText.replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/, '');
parsed = JSON.parse(cleanText);
} catch (e) {
throw new Error('Claude returned non-JSON. Try again — usually transient.');
}
if (typeof parsed.score === 'undefined' || !parsed.critique) {
throw new Error('Response missing expected fields. Try again.');
}
parsed.score = Math.max(1, Math.min(10, parseInt(parsed.score, 10) || 5));
loadingEl.style.display = 'none';
resultEl.innerHTML = renderAiResult(parsed, inputId);
resultEl.style.display = 'block';
// Wire the "use rewrite" button
const useBtn = resultEl.querySelector('[data-ai-use]');
if (useBtn) {
useBtn.addEventListener('click', () => {
const newText = useBtn.getAttribute('data-ai-rewrite');
const textarea = document.querySelector(`textarea[data-input="${inputId}"]`);
if (textarea && newText) {
textarea.value = newText;
state.answers[inputId] = newText;
saveState();
useBtn.textContent = '✓ Inserted into your answer above';
useBtn.disabled = true;
}
});
}
} catch (err) {
loadingEl.style.display = 'none';
errorEl.style.display = 'block';
errorEl.innerHTML = `<p><strong>Couldn't reach Claude.</strong> ${escapeHtml(err.message || 'Unknown error.')}</p>`;
}
}
function renderAiResult(data, inputId) {
// data = { score: 1-10, critique: "...", weakest: "...", rewrite: "..." }
const scoreClass = data.score >= 8 ? 'good' : data.score >= 5 ? 'mid' : 'weak';
return `
<div class="ai-score-row">
<div class="ai-score ai-score-${scoreClass}">
<div class="ai-score-num">${data.score || '?'}</div>
<div class="ai-score-label">/ 10</div>
</div>
<div class="ai-score-text">
<h6>Specificity score</h6>
<p>${escapeHtml(data.critique || '')}</p>
</div>
</div>
${data.weakest ? `
<div class="ai-section">
<h6>The single weakest element</h6>
<p>${escapeHtml(data.weakest)}</p>
</div>
` : ''}
${data.rewrite ? `
<div class="ai-section ai-rewrite">
<h6>A sharper rewrite</h6>
<p class="ai-rewrite-text">${escapeHtml(data.rewrite)}</p>
<button type="button" class="ai-use-btn" data-ai-use="${inputId}" data-ai-rewrite="${escapeHtml(data.rewrite)}">Use this rewrite</button>
</div>
` : ''}
<p class="ai-attribution">✦ Critique by ${modelDisplayName()}. This is a coaching tool, not a verdict — your judgment about your market is still the input that matters.</p>
`;
}
function updateVerifyPanelState(panel) {
// Toggle the empty-state message vs the link grid based on whether
// the operator has typed enough to drive a meaningful search.
if (!panel) return;
const empty = panel.querySelector('[data-verify-empty]');
const intro = panel.querySelector('[data-verify-intro]');
const grid = panel.querySelector('.verify-grid');
const has = hasVerifyContext();
if (empty) empty.style.display = has ? 'none' : 'block';
if (intro) intro.style.display = has ? 'block' : 'none';
if (grid) grid.style.opacity = has ? '1' : '0.4';
}
function renderHelpRail(input) {
// Build a per-input help block: examples toggle, sharpen toggle, verify toggle,
// AI-sharpen toggle, each with a hidden panel revealed on click.
// Returns empty string if input has no help data.
const hasExamples = !!input.examples;
const hasSharpen = !!input.sharpen;
const hasVerify = !!input.verify;
const hasAi = !!input.aiSharpen;
if (!hasExamples && !hasSharpen && !hasVerify && !hasAi) return '';
const inputId = input.id;
let html = '<div class="help-rail">';
if (hasExamples) html += `<button type="button" class="help-toggle" data-help-toggle="examples" data-help-input="${inputId}">See examples</button>`;
if (hasSharpen) html += `<button type="button" class="help-toggle" data-help-toggle="sharpen" data-help-input="${inputId}">Sharpen this</button>`;
if (hasVerify) html += `<button type="button" class="help-toggle verify" data-help-toggle="verify" data-help-input="${inputId}">Verify externally</button>`;
if (hasAi) html += `<button type="button" class="help-toggle ai" data-help-toggle="ai" data-help-input="${inputId}">Sharpen with AI ✦</button>`;
html += '</div>';
// Examples panel
if (hasExamples) {
html += `
<div class="help-panel examples-panel" data-help-panel="examples-${inputId}">
<div class="col-row">
<div class="good-col">
<h6>Good — specific, sourced, falsifiable</h6>
<ul>${input.examples.good.map(e => `<li>${escapeHtml(e)}</li>`).join('')}</ul>
</div>
<div class="bad-col">
<h6>Vague — sounds confident, says nothing</h6>
<ul>${input.examples.bad.map(e => `<li>${escapeHtml(e)}</li>`).join('')}</ul>
</div>
</div>
</div>
`;
}
// Sharpen panel
if (hasSharpen) {
html += `
<div class="help-panel sharpen-panel" data-help-panel="sharpen-${inputId}">
<ol>${input.sharpen.map(q => `<li>${escapeHtml(q)}</li>`).join('')}</ol>
<div class="closer">If you cannot answer all of the above, your answer above is a hypothesis — not a finding. Either revise it now or mark this gate "rework" and do the homework first.</div>
</div>
`;
}
// Verify panel
if (hasVerify) {
html += `
<div class="help-panel verify-panel" data-help-panel="verify-${inputId}">
<p class="verify-intro" data-verify-intro>Open these in new tabs and check your claim against external evidence. Independent verification is the cure for confidence-without-data.</p>
<div class="verify-grid">
${input.verify.map(v => `<a class="verify-link" href="#" data-verify-source="${escapeHtml(v.source)}" target="_blank" rel="noopener noreferrer">${escapeHtml(v.label)}</a>`).join('')}
</div>
<p class="verify-empty" data-verify-empty style="display:none;">Type your avatar (and pain) above first — these searches use your own keywords. Then click here again.</p>
</div>
`;
}
// AI Sharpen panel — content populated on click via API call
if (hasAi) {
html += `
<div class="help-panel ai-panel" data-help-panel="ai-${inputId}">
<div class="ai-empty" data-ai-empty>
<p class="ai-intro">Send your current answer to Claude for a structured critique: specificity score, the single weakest element, and a sharper rewrite. Takes 3–8 seconds.</p>
<button type="button" class="ai-go-btn" data-ai-go="${inputId}">✦ Critique my answer with Claude</button>
</div>
<div class="ai-loading" data-ai-loading style="display:none;">
<div class="ai-spinner"></div>
<p>Claude is reading your answer...</p>
</div>
<div class="ai-result" data-ai-result style="display:none;"></div>
<div class="ai-error" data-ai-error style="display:none;"></div>
</div>
`;
}
return html;
}
function renderInput(input, savedValue) {
const v = savedValue !== undefined ? savedValue : '';
const helpRail = renderHelpRail(input);
const hasVOC = hasVOCQuotes();
// VOC pull button (only for textareas that opt in via vocPull: true)
const vocBtn = input.vocPull
? `<button type="button" class="voc-pull-btn" data-voc-pull="${input.id}" ${hasVOC ? '' : 'disabled'}>💬 Pull from VOC vault${hasVOC ? ` (${state.voCVault.length})` : ' — empty'}</button> `
: '';
if (input.type === 'textarea') {
return `
<div class="input-group">
<label for="${input.id}">${input.label}</label>
<div class="help">${input.help}</div>
${vocBtn}${helpRail}
<textarea id="${input.id}" data-input="${input.id}" placeholder="${input.placeholder || ''}">${escapeHtml(v)}</textarea>
</div>
`;
}
if (input.type === 'text' || input.type === 'number') {
return `
<div class="input-group">
<label for="${input.id}">${input.label}</label>
<div class="help">${input.help}</div>
${helpRail}
<input type="${input.type}" id="${input.id}" data-input="${input.id}" value="${escapeHtml(v)}" placeholder="${input.placeholder || ''}" />
</div>
`;
}
if (input.type === 'scale') {
let html = `
<div class="input-group">
<label>${input.label}</label>
<div class="help">${input.help}</div>
${helpRail}
<div class="scale" data-scale="${input.id}">
`;
for (let i = 1; i <= 10; i++) {
html += `<button type="button" class="scale-btn ${parseInt(v) === i ? 'selected' : ''}" data-value="${i}">${i}</button>`;
}
html += `
</div>
<div class="scale-labels">
<span>1 — Low</span>
<span>10 — High</span>
</div>
</div>
`;
return html;
}
if (input.type === 'choice') {
const cols = input.cols || 1;
let html = `
<div class="input-group">
<label>${input.label}</label>
<div class="help">${input.help}</div>
${helpRail}
<div class="choice-group cols-${cols}" data-choice="${input.id}">
`;
input.options.forEach(opt => {
html += `
<button type="button" class="choice-btn ${v === opt.value ? 'selected' : ''}" data-value="${opt.value}">
<span class="label">${opt.label}</span>
<span class="sub">${opt.sub}</span>
</button>
`;
});
html += `</div></div>`;
return html;
}
return '';
}
function renderVerdict(data) {
const labels = { go: 'GO', no: 'NO', rework: 'REWORK' };
let html = `
<div class="verdict ${data.verdict}">
<div class="verdict-header">
<span class="label">Verdict</span>
<span class="name">${labels[data.verdict]} · ${data.name}</span>
</div>
<div class="verdict-body">
`;
if (data.score) {
html += `
<div class="score-display">
<div>
<div class="label">${data.score.label}</div>
<div class="breakdown">Captain's Logic weighting</div>
</div>
<div class="total">${data.score.total}<span class="max"> / ${data.score.max}</span></div>
</div>
`;
}
html += `<ul>`;
data.reasons.forEach(r => { html += `<li>${r}</li>`; });
html += `</ul></div></div>`;
return html;
}
function renderSummary() {
const date = new Date().toLocaleDateString('en-US', {
year: 'numeric', month: 'long', day: 'numeric'
});
let html = `
<div class="gate-rubric">Decision Document</div>
<h2>Your <em>One-Page Brief</em></h2>
<p style="font-family: var(--serif); font-size: 16px; color: var(--muted); margin-bottom: 20px; max-width: 720px; line-height: 1.5;">
Below is the printable, single-page summary of your decisions across all 16 gates. Tape it to the wall. Send it to your accountability partner. Refer back when the next launch temptation hits.
</p>
<div class="brief" id="brief">
<h3>The MVO <em>Brief</em></h3>
<div class="brief-meta">Generated ${date} · RISER MVO Engine · Captain's Logic</div>
`;
// Compute gate verdicts on the fly
const verdictBadges = [];
GATES.forEach(gate => {
if (gate.isIntro || gate.isSummary) return;
const v = state.verdicts[gate.id];
if (v) {
const labels = { go: 'GO', no: 'NO', rework: 'REWORK' };
verdictBadges.push(`<span class="pill" style="color: ${v === 'go' ? 'var(--green)' : v === 'no' ? 'var(--red)' : 'var(--gold)'};">${gate.num} ${labels[v]}</span>`);
}
});
if (verdictBadges.length > 0) {
html += `
<div class="brief-section">
<h4>Gate Verdicts</h4>
<p>${verdictBadges.join(' ')}</p>
</div>
`;
}
// Pain Discovery (only if any cards exist)
const cards = state.painCards || [];
if (cards.length > 0) {
const lead = getLeadPainCard();
const totalQuotes = (state.voCVault || []).length;
let painHtml = `
<div class="brief-section">
<h4>Pain Discovery (VOC Source)</h4>
<p><strong>Cards imported:</strong> ${cards.length} · <strong>Quotes in vault:</strong> ${totalQuotes}</p>
`;
if (lead) {
painHtml += `<p><strong>Lead pain:</strong> ${escapeHtml(lead.title || 'Untitled')}${lead.score ? ' · score ' + lead.score + '/100' : ''}</p>`;
if (lead.sourceCommunity) painHtml += `<p><strong>Source:</strong> ${escapeHtml(lead.sourceCommunity)}</p>`;
if (lead.audience) painHtml += `<p><strong>Audience:</strong> ${escapeHtml(lead.audience)}</p>`;
const cluster = getClusterCards();
if (cluster.length > 1) {
painHtml += `<p><strong>Cluster:</strong> ${cluster.length} pain cards grouped — ${cluster.map(c => escapeHtml((c.title || 'Untitled').slice(0, 50))).join(' · ')}</p>`;
}
// Top 3 quotes
const topQuotes = (state.voCVault || []).slice(0, 3);
if (topQuotes.length > 0) {
painHtml += `<p style="margin-top:8px;"><strong>Top customer quotes:</strong></p>`;
topQuotes.forEach(q => {
painHtml += `<p style="font-style: italic; padding-left: 12px; border-left: 2px solid var(--gold); margin-top: 6px;">"${escapeHtml(q.text)}" <span style="font-style: normal; font-size: 11px; color: var(--muted); display: block;">— ${escapeHtml(q.cardTitle)}</span></p>`;
});
}
}
painHtml += `</div>`;
html += painHtml;
}
// Avatar
html += briefSection('The Avatar', [
['Who', state.answers.avatar_who],
['Pain (their words)', state.answers.avatar_pain]
]);
// Idea
html += briefSection('The Idea', [
['One-sentence offer', state.answers.idea_one_sentence],
['Competitive reality', readableChoice('idea_competition')],
['$100 today test', readableChoice('idea_money_now')]
]);
// Problem
html += briefSection('The Problem', [
['Problem statement', state.answers.problem_specific],
['Frequency', readableChoice('problem_frequency')],
['Cost of not solving', readableChoice('problem_cost')],
['Existing solutions', state.answers.problem_existing_solutions]
]);
// Offer
html += briefSection('The Offer (Value Equation)', [
['Dream Outcome', state.answers.offer_dream],
['Proof / Likelihood', state.answers.offer_likelihood],
['Time to first result', readableChoice('offer_time_delay')],
['Effort tier', readableChoice('offer_effort')],
['Named Mechanism', state.answers.offer_mechanism]
]);
// Stack
html += briefSection('The Grand Slam Stack', [
['Offer name', state.answers.stack_offer_name],
['Bonuses', state.answers.stack_bonuses],
['Guarantee type', readableChoice('stack_guarantee_type')],
['Guarantee wording', state.answers.stack_guarantee_text],
['Scarcity mechanism', readableChoice('stack_scarcity')],
['Stack value (anchor)', state.answers.stack_total_value ? '$' + state.answers.stack_total_value : ''],
['Actual price', state.answers.stack_actual_price ? '$' + state.answers.stack_actual_price : '']
]);
// Distribution
html += briefSection('Distribution (Core Four)', [
['Primary channel', readableChoice('dist_primary')],
['Volume math', state.answers.dist_volume],
['Unit economics readiness', readableChoice('dist_unit_econ')]
]);
// Dream 100
html += briefSection('Dream 100', [
['Named contacts', state.answers.dream100_list],
['Strategy', readableChoice('dream100_strategy')],
['First-touch script', state.answers.dream100_first_outreach],
['Weekly volume', readableChoice('dream100_volume')]
]);
// Copy
html += briefSection('The Copy', [
['Hook', state.answers.copy_hook],
['Headline', state.answers.copy_headline],
['Body', state.answers.copy_body]
]);
// Persuasion Architecture
html += briefSection('Persuasion Architecture', [
['Big Domino (one belief)', state.answers.persuasion_big_domino],
['False beliefs to break', state.answers.persuasion_false_beliefs],
['Reciprocity gift', state.answers.persuasion_lead_magnet],
['Reciprocity strength', readableChoice('persuasion_reciprocity')],
['Social proof', readableChoice('persuasion_social_proof')],
['Authority', readableChoice('persuasion_authority')],
['Unity language', readableChoice('persuasion_unity')],
['Consistency mechanism', readableChoice('persuasion_consistency')]
]);
// Deploy
html += briefSection('The Launch', [
['Date', state.answers.deploy_date],
['Cohort size', readableChoice('deploy_size')],
['Price', state.answers.deploy_price ? '$' + state.answers.deploy_price : ''],
['Kill rule', readableChoice('deploy_kill_rule')]
]);
// Iterate / Pivot / Scale / Repeat (only if filled)
const hasLater = state.answers.iter_signal || state.answers.scale_signal || state.answers.repeat_next_problem;
if (hasLater) {
html += briefSection('Iterate · Pivot · Scale', [
['Iteration pattern', state.answers.iter_signal],
['Iteration lever', readableChoice('iter_lever')],
['Awareness stage', readableChoice('iter_awareness')],
['Market sophistication', readableChoice('iter_sophistication')],
['Refund interview discipline', readableChoice('iter_refund_interviews')],
['Scale lever', readableChoice('scale_lever')],
['Current bottleneck', state.answers.scale_constraint]
]);
html += briefSection('Compound · Value Ladder · Continuity', [
['Next problem to solve', state.answers.repeat_next_problem],
['Compound move', readableChoice('repeat_decision')],
['Rung 1 — Bait', state.answers.repeat_ladder_bait],
['Rung 2 — Tripwire', state.answers.repeat_ladder_tripwire],
['Rung 3 — Core', state.answers.repeat_ladder_core],
['Rung 4 — Continuity', state.answers.repeat_ladder_continuity],
['Rung 5 — High-Ticket', state.answers.repeat_ladder_high],
['Continuity health', readableChoice('repeat_continuity_status')],
['Affiliate / partner motion', readableChoice('repeat_dream100_affiliate')]
]);
}
html += `
<div class="brief-section" style="border-top: 2px solid var(--ink); padding-top: 14px; margin-top: 18px; border-bottom: none;">
<h4>The Captain's One-Liner</h4>
<p style="font-style: italic; font-size: 17px;">"You do not have a thinking problem. You have a doing problem. The next document is not the answer — the next paying customer is."</p>
</div>
</div>
<div class="action-row">
<button class="btn" data-nav="${GATES.length - 2}">← Back to Gate 11 (Repeat)</button>
<div style="display:flex; gap:8px;">
<button class="btn" id="btn-print-brief">Print Brief</button>
<button class="btn primary" id="btn-export-brief">Export JSON</button>
</div>
</div>
`;
return html;
}
function briefSection(title, rows) {
let html = `<div class="brief-section"><h4>${title}</h4>`;
let hasContent = false;
rows.forEach(([label, value]) => {
if (value && value.toString().trim()) {
html += `<p><strong>${label}:</strong> ${escapeHtml(value)}</p>`;
hasContent = true;
}
});
if (!hasContent) {
html += `<p class="empty">— Not yet completed —</p>`;
}
html += `</div>`;
return html;
}
function readableChoice(inputId) {
const v = state.answers[inputId];
if (!v) return '';
// Find the gate that has this input
for (const gate of GATES) {
if (!gate.inputs) continue;
const inp = gate.inputs.find(i => i.id === inputId);
if (inp && inp.options) {
const opt = inp.options.find(o => o.value === v);
if (opt) return opt.label;
}
}
return v;
}
function escapeHtml(str) {
return String(str || '')
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
// ============================================================
// EVENT HANDLERS
// ============================================================
function attachGateHandlers(gate) {
// ===== PAIN DISCOVERY HANDLERS =====
// Skip button — navigates to next gate
const painSkip = document.getElementById('pain-skip-btn');
if (painSkip) {
painSkip.addEventListener('click', () => {
const idx = GATES.findIndex(g => g.id === 'paindiscovery');
navigateToGate(idx + 1);
});
}
// Add a new pain card
const painAdd = document.getElementById('pain-add-btn');
if (painAdd) {
painAdd.addEventListener('click', () => {
if (!state.painCards) state.painCards = [];
if (state.painCards.length >= 5) return;
const newCard = {
id: newPainCardId(),
title: '',
score: '',
frequency: '',
sourceCommunity: '',
audience: '',
quotes: [''],
solutions: '',
clusterId: null
};
state.painCards.push(newCard);
// Auto-set as lead if it's the first
if (state.painCards.length === 1) state.leadPainId = newCard.id;
rebuildVOCVault();
saveState();
renderGate(state.currentGate);
});
}
// Remove a pain card
document.querySelectorAll('[data-card-remove]').forEach(btn => {
btn.addEventListener('click', () => {
const id = btn.getAttribute('data-card-remove');
if (!confirm('Remove this pain card? Its quotes will leave the VOC vault.')) return;
state.painCards = (state.painCards || []).filter(c => c.id !== id);
// If we removed the lead, pick a new one
if (state.leadPainId === id) {
state.leadPainId = state.painCards.length > 0 ? state.painCards[0].id : null;
}
rebuildVOCVault();
saveState();
renderGate(state.currentGate);
});
});
// Edit pain card field (title, score, frequency, sourceCommunity, audience, solutions)
document.querySelectorAll('[data-card-field]').forEach(el => {
el.addEventListener('input', () => {
const field = el.getAttribute('data-card-field');
const id = el.getAttribute('data-card-id');
const card = (state.painCards || []).find(c => c.id === id);
if (!card) return;
let value = el.value;
if (field === 'score') {
value = parseInt(value) || '';
if (value > 100) value = 100;
if (value < 0) value = 0;
}
card[field] = value;
saveState();
});
// For selects, also listen to 'change'
if (el.tagName === 'SELECT') {
el.addEventListener('change', () => {
const field = el.getAttribute('data-card-field');
const id = el.getAttribute('data-card-id');
const card = (state.painCards || []).find(c => c.id === id);
if (!card) return;
card[field] = el.value;
saveState();
});
}
});
// Edit a quote inside a pain card
document.querySelectorAll('[data-card-quote]').forEach(el => {
el.addEventListener('input', () => {
const id = el.getAttribute('data-card-quote');
const qi = parseInt(el.getAttribute('data-quote-idx'));
const card = (state.painCards || []).find(c => c.id === id);
if (!card) return;
if (!card.quotes) card.quotes = [];
while (card.quotes.length <= qi) card.quotes.push('');
card.quotes[qi] = el.value;
rebuildVOCVault();
saveState();
});
});
// Add a quote slot to a pain card
document.querySelectorAll('[data-card-add-quote]').forEach(btn => {
btn.addEventListener('click', () => {
const id = btn.getAttribute('data-card-add-quote');
const card = (state.painCards || []).find(c => c.id === id);
if (!card) return;
if (!card.quotes) card.quotes = [];
if (card.quotes.length >= 5) {
alert('Maximum 5 quotes per card.');
return;
}
card.quotes.push('');
saveState();
renderGate(state.currentGate);
});
});
// Remove a quote
document.querySelectorAll('[data-card-remove-quote]').forEach(btn => {
btn.addEventListener('click', () => {
const id = btn.getAttribute('data-card-remove-quote');
const qi = parseInt(btn.getAttribute('data-quote-idx'));
const card = (state.painCards || []).find(c => c.id === id);
if (!card || !card.quotes) return;
card.quotes.splice(qi, 1);
if (card.quotes.length === 0) card.quotes = [''];
rebuildVOCVault();
saveState();
renderGate(state.currentGate);
});
});
// Pick lead pain card
document.querySelectorAll('[data-pick-lead]').forEach(btn => {
btn.addEventListener('click', () => {
const id = btn.getAttribute('data-pick-lead');
state.leadPainId = id;
saveState();
renderGate(state.currentGate);
});
});
// Toggle a card into/out of the lead's cluster
document.querySelectorAll('[data-cluster-toggle]').forEach(btn => {
btn.addEventListener('click', () => {
const id = btn.getAttribute('data-cluster-toggle');
const card = (state.painCards || []).find(c => c.id === id);
const lead = getLeadPainCard();
if (!card || !lead) return;
// Ensure lead has a clusterId
if (!lead.clusterId) lead.clusterId = 'cluster_' + lead.id;
if (card.clusterId === lead.clusterId) {
card.clusterId = null;
} else {
card.clusterId = lead.clusterId;
}
saveState();
renderGate(state.currentGate);
});
});
// Apply lead pain card to downstream gates
const painApply = document.getElementById('pain-apply-btn');
if (painApply) {
painApply.addEventListener('click', () => {
const lead = getLeadPainCard();
if (!lead) return;
// Build avatar_who from audience + sourceCommunity
const who = (lead.audience || '').trim();
// Build avatar_pain from title + top quote
const topQuote = (lead.quotes || []).find(q => q && q.trim().length >= 10);
const painText = topQuote
? `${lead.title}\n\nIn their words: "${topQuote.trim()}"`
: (lead.title || '');
if (who) state.answers.avatar_who = who;
if (painText) state.answers.avatar_pain = painText;
// Apply intensity score onto the avatar_pain_intensity scale (1-10)
if (lead.score) {
const scaleVal = Math.max(1, Math.min(10, Math.round(lead.score / 10)));
state.answers.avatar_pain_intensity = String(scaleVal);
}
// Apply frequency to Gate 03 problem_frequency
const mappedFreq = paintFrequencyToWidget(lead.frequency);
if (mappedFreq) state.answers.problem_frequency = mappedFreq;
// Apply title to problem_specific if empty
if (lead.title && !(state.answers.problem_specific || '').trim()) {
state.answers.problem_specific = lead.title;
}
// Apply solutions to offer_mechanism as a hint if empty
if (lead.solutions && !(state.answers.offer_mechanism || '').trim()) {
state.answers.offer_mechanism = `[Solution seeds from pain research — name your mechanism here]\n\n${lead.solutions}`;
}
saveState();
alert('Lead pain applied to Gate 01, Gate 03, and Gate 04 (mechanism hint). Open those gates to refine.');
// Navigate to Gate 01 (avatar) automatically
const avatarIdx = GATES.findIndex(g => g.id === 'avatar');
navigateToGate(avatarIdx);
});
}
// ===== END PAIN DISCOVERY HANDLERS =====
// VOC vault pull buttons — open the picker popover
document.querySelectorAll('[data-voc-pull]').forEach(btn => {
btn.addEventListener('click', () => {
if (btn.disabled) return;
const inputId = btn.getAttribute('data-voc-pull');
openVOCPopover(inputId);
});
});
// Step One Help System — toggle examples / sharpen / verify / ai panels
document.querySelectorAll('[data-help-toggle]').forEach(btn => {
btn.addEventListener('click', () => {
const kind = btn.getAttribute('data-help-toggle');
const inputId = btn.getAttribute('data-help-input');
const panelKey = `${kind}-${inputId}`;
const panel = document.querySelector(`[data-help-panel="${panelKey}"]`);
if (!panel) return;
const wasVisible = panel.classList.contains('visible');
// Close other open panels for this same input
document.querySelectorAll(`[data-help-input="${inputId}"]`).forEach(b => b.classList.remove('active'));
['examples', 'sharpen', 'verify', 'ai'].forEach(k => {
const p = document.querySelector(`[data-help-panel="${k}-${inputId}"]`);
if (p) p.classList.remove('visible');
});
// If this one wasn't visible, open it
if (!wasVisible) {
panel.classList.add('visible');
btn.classList.add('active');
// For verify panels: refresh visibility of empty state based on current input
if (kind === 'verify') {
updateVerifyPanelState(panel);
}
}
});
});
// Verify-link click handler — build URL fresh from current state
document.querySelectorAll('[data-verify-source]').forEach(link => {
link.addEventListener('click', (ev) => {
ev.preventDefault();
const source = link.getAttribute('data-verify-source');
const url = buildVerifyURL(source);
// If no keywords yet, do not open — just show the empty state
if (!hasVerifyContext()) {
const panel = link.closest('.verify-panel');
if (panel) updateVerifyPanelState(panel);
return;
}
window.open(url, '_blank', 'noopener,noreferrer');
});
});
// AI Sharpen button — call the Netlify Function with current answer
document.querySelectorAll('[data-ai-go]').forEach(btn => {
btn.addEventListener('click', () => {
const inputId = btn.getAttribute('data-ai-go');
runAiSharpen(inputId);
});
});
// Navigation buttons
document.querySelectorAll('[data-nav]').forEach(el => {
el.addEventListener('click', () => {
const target = parseInt(el.getAttribute('data-nav'));
if (target >= 0 && target < GATES.length) navigateToGate(target);
});
});
// Start button on intro
const startBtn = document.getElementById('btn-start');
if (startBtn) startBtn.addEventListener('click', () => navigateToGate(1));
const resumeBtn = document.getElementById('btn-resume');
if (resumeBtn) resumeBtn.addEventListener('click', () => {
// Find first incomplete gate
let target = 1;
for (let i = 1; i < GATES.length - 1; i++) {
if (!state.verdicts[GATES[i].id] || state.verdicts[GATES[i].id] !== 'go') {
target = i;
break;
}
target = i + 1;
}
navigateToGate(target);
});
// Print/Export
const printBriefBtn = document.getElementById('btn-print-brief');
if (printBriefBtn) printBriefBtn.addEventListener('click', () => window.print());
const exportBtn = document.getElementById('btn-export-brief');
if (exportBtn) exportBtn.addEventListener('click', exportJSON);
// Text/textarea inputs
document.querySelectorAll('[data-input]').forEach(el => {
el.addEventListener('input', (e) => {
const id = el.getAttribute('data-input');
state.answers[id] = e.target.value;
saveState();
});
});
// Scale buttons
document.querySelectorAll('[data-scale]').forEach(scaleEl => {
const id = scaleEl.getAttribute('data-scale');
scaleEl.querySelectorAll('.scale-btn').forEach(btn => {
btn.addEventListener('click', () => {
scaleEl.querySelectorAll('.scale-btn').forEach(b => b.classList.remove('selected'));
btn.classList.add('selected');
state.answers[id] = btn.getAttribute('data-value');
saveState();
});
});
});
// Choice buttons
document.querySelectorAll('[data-choice]').forEach(choiceEl => {
const id = choiceEl.getAttribute('data-choice');
choiceEl.querySelectorAll('.choice-btn').forEach(btn => {
btn.addEventListener('click', () => {
choiceEl.querySelectorAll('.choice-btn').forEach(b => b.classList.remove('selected'));
btn.classList.add('selected');
state.answers[id] = btn.getAttribute('data-value');
saveState();
});
});
});
// Evaluate button
const evaluateBtn = document.getElementById('btn-evaluate');
if (evaluateBtn) {
evaluateBtn.addEventListener('click', () => {
const gateId = evaluateBtn.getAttribute('data-gate');
const verdict = computeVerdict(gateId);
if (verdict) {
state.verdicts[gateId] = verdict.verdict;
saveState();
// Re-render to show verdict
const idx = GATES.findIndex(g => g.id === gateId);
renderGate(idx);
}
});
}
}
function navigateToGate(idx) {
if (idx < 0 || idx >= GATES.length) return;
renderGate(idx);
}
// ============================================================
// EXPORT / RESET
// ============================================================
function exportJSON() {
const data = {
generatedAt: new Date().toISOString(),
state: state,
gates: GATES.filter(g => !g.isIntro && !g.isSummary).map(g => ({
id: g.id,
num: g.num,
name: g.name,
verdict: state.verdicts[g.id] || null
}))
};
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `mvo-brief-${new Date().toISOString().split('T')[0]}.json`;
a.click();
URL.revokeObjectURL(url);
}
// ============================================================
// INIT
// ============================================================
document.getElementById('btn-print').addEventListener('click', () => {
// Navigate to summary gate before printing so the brief is what prints
navigateToGate(GATES.length - 1);
setTimeout(() => window.print(), 300);
});
document.getElementById('btn-export').addEventListener('click', exportJSON);
document.getElementById('btn-reset').addEventListener('click', resetState);
// ============================================================
// SETTINGS MODAL — API key management
// ============================================================
(function wireSettings() {
const modal = document.getElementById('settings-modal');
const openBtn = document.getElementById('btn-settings');
const input = document.getElementById('settings-key-input');
const status = document.getElementById('settings-status');
const saveBtn = document.getElementById('settings-save');
const clearBtn = document.getElementById('settings-clear');
function openModal() {
const existing = getApiKey();
input.value = existing;
if (existing && existing.startsWith('sk-ant-')) {
status.textContent = `Key currently set (ends in ...${existing.slice(-6)})`;
status.className = 'settings-status ok';
} else if (existing) {
status.textContent = 'Saved key does not look valid (must start with sk-ant-)';
status.className = 'settings-status err';
} else {
status.textContent = 'No key saved yet';
status.className = 'settings-status';
}
modal.style.display = 'flex';
setTimeout(() => input.focus(), 50);
}
function closeModal() {
modal.style.display = 'none';
}
openBtn.addEventListener('click', openModal);
document.querySelectorAll('[data-settings-close]').forEach(el => {
el.addEventListener('click', closeModal);
});
saveBtn.addEventListener('click', () => {
const key = (input.value || '').trim();
if (!key) {
status.textContent = 'Please paste a key first';
status.className = 'settings-status err';
return;
}
if (!key.startsWith('sk-ant-')) {
status.textContent = 'Key must start with sk-ant-';
status.className = 'settings-status err';
return;
}
setApiKey(key);
status.textContent = 'Saved.';
status.className = 'settings-status ok';
setTimeout(closeModal, 600);
});
clearBtn.addEventListener('click', () => {
if (!confirm('Remove the saved API key from this browser?')) return;
clearApiKey();
input.value = '';
status.textContent = 'Key cleared';
status.className = 'settings-status';
});
// Close modal on Escape key
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modal.style.display === 'flex') closeModal();
});
})();
(async function init() {
await loadState();
renderProgressRail();
renderGate(state.currentGate || 0);
})();
</script>
</body>
</html>
Complete Word text: RISER-MVO-Widget-Explainer-Script.docx.text.txt
word/document.xml
THE RISER MVO WIDGET
Talking-Head Explainer Script
From Pain Discovery to Compound Moat — All 16 Gates
Built on Hormozi · Brunson · Kennedy · Cialdini
Estimated runtime: 28–35 minutes
Recordable in 8 sections
Version 3 · April 2026
How to Use This Script
This script is built for a talking-head explainer video. Read it aloud as written. The rhythm is intentional — short sentences, hard breaks, direct address.
Three things to know before you record.
1. Camera directions in red italic, indented.
[B-ROLL: show the widget on screen] · [PAUSE: 2 seconds] · [GESTURE: point to gate rail]
These are cues for editing or for live recording. Skip them when reading aloud.
2. Doctrine pull-quotes appear in red bordered blocks.
"Doctrine quote example — read this slower, with weight."
Slow your delivery for these. They are the lines viewers will clip and share.
3. Section runtimes appear at the top of each section.
If you want to record in chunks, every section ends with a clean break and a clean re-entry. The 8 sections of this video are all under 5 minutes individually.
Recording-friendly section map
Section 1 — Cold Open & Why the Widget Exists (3 min)
Section 2 — The 16-Gate Architecture (3 min)
Section 3 — Gate 00½ Pain Discovery (4 min)
Section 4 — Gates 01–04½: Market & Offer (5 min)
Section 5 — Gates 05–06½: Distribution, Copy, Persuasion (4 min)
Section 6 — Gates 07–08: Deploy & Iterate (3 min)
Section 7 — Gates 09–11: Pivot, Scale, Compound (4 min)
Section 8 — Brief, Close, & Call to Action (2 min)
Section 1 — Cold Open & Why the Widget Exists
Approx. 3 minutes
[OPEN: tight on camera, no graphics yet. Lean in slightly.]
Most ideas die for one reason.
Not because the operator was lazy.
Not because the market was wrong.
Because somebody spent ninety days building a thing that should have been killed in week one.
[PAUSE: 1 second. Hold camera.]
Or — the inverse. They had a real idea. A starving crowd was sitting right there. And they spent six months polishing copy when they should have shipped a janky version on a Tuesday and started learning.
Both failures look the same from the outside. Both feel productive while they happen. Both end the same way — with a founder asking why they have nothing to show for a year of their life.
"The widget I'm about to show you was built to do one thing. Save you ninety days on a bad idea — or compress ninety days on a good one."
[GRAPHIC IN: widget header — the words 'Idea or No Idea' on screen]
This is the RISER MVO Decision Engine. M-V-O stands for Minimum Viable Offer. The whole thing is a single HTML file. No backend. Nothing to install. You open it, you walk it, your answers save in your browser, and at the end you have a one-page brief that tells you exactly what to ship and exactly when to kill.
It's built on four operators.
Alex Hormozi — for offer construction, market scoring, and unit economics.
Russell Brunson — for the value ladder, the Dream 100, and the persuasion frameworks from Expert Secrets.
Dan Kennedy — for direct response, risk reversal, and the discipline around guarantees.
Robert Cialdini — for the seven principles of influence that decide whether your page converts or doesn't.
Sixteen gates. From "what does the market actually hurt over" all the way to "how do I compound this into a moat."
At every gate, you get one of three verdicts. GO — you can proceed, here's the next action. NO — you can't proceed, here's exactly why. REWORK — you're close, here's what to sharpen first.
[GRAPHIC IN: GO / NO / REWORK badges — green, deep red, gold]
This video walks every gate. End to end. No omissions. By the end you'll know what each gate checks for, what triggers a NO, and how the whole thing fits together.
Let's start with the architecture.
Section 2 — The 16-Gate Architecture
Approx. 3 minutes
[GRAPHIC: top-down view of the progress rail showing all 17 cells. Highlight the four phases as colored bands.]
The widget has a top rail. Each cell is a gate. You can click any gate at any time — there's no forced linear path. But the gates are organized into four phases, and each phase has a job.
Phase One — Detection
Gates zero-half through three. This is where you answer: is there actually a starving crowd here, and is the problem worth solving?
Gate 00½ — Pain Discovery. Import the voice of the customer.
Gate 01 — Hungry Avatar. Score the market on four dimensions.
Gate 02 — Idea or No Idea. Filter for competitive reality and proximity to demand.
Gate 03 — Profitable Problem. Confirm pain, frequency, and cost of inaction.
Phase Two — Construction
Gates four through six-and-a-half. This is where you build the offer, the stack, the channel, and the persuasion architecture.
Gate 04 — Grand Slam Offer. Score the Value Equation.
Gate 04½ — Offer Stack. Build bonuses, guarantee, scarcity, naming.
Gate 05 — Core Four Distribution. Pick one channel.
Gate 05½ — Dream 100. Name the hundred people who own your audience.
Gate 06 — Hook, Headline, Body. Write the copy.
Gate 06½ — Persuasion Architecture. The Big Domino, false beliefs, and the Cialdini audit.
Phase Three — Deployment
Gates seven and eight. This is where you ship and learn.
Gate 07 — Deploy. Lock the date, the cohort size, the price, and the kill rule.
Gate 08 — Iterate. Use real customer data to adjust one lever at a time.
Phase Four — Compound
Gates nine through eleven. This is where you decide what to scale, when to pivot, and how to turn one offer into a moat.
Gate 09 — Pivot or Hold. Diagnose hook, audience, or offer failure.
Gate 10 — Scale. Pick price, retention, or volume as your scale lever.
Gate 11 — Repeat. Build the value ladder, continuity, and affiliate motion.
Plus an intro and a one-page brief at the end.
"Most operators try to do all sixteen of these in their head, in parallel, simultaneously. That's why most ideas die. The widget does them sequentially. Each gate either passes you or stops you. There's no hand-waving past a fundamental flaw."
[B-ROLL: zoom in on the rail, click through each color-coded cell briefly to show the GO / NO / REWORK feedback]
Now let's walk every gate. Starting where the widget actually starts — Pain Discovery.
Section 3 — Gate 00½: Pain Discovery
Approx. 4 minutes
[GRAPHIC: Gate 00½ on screen — show the 'PainOnSocial / VOC import' rubric]
Before we get to the avatar gate, there's a step most operators skip. It's optional. But if you skip it, every downstream gate runs on hypothesis instead of evidence.
"Operators who guess at pain build for themselves. Operators who import pain build for the market."
Gate 00½ is called Pain Discovery. This is where you import voice-of-customer research before you start building the offer.
If you've run a PainOnSocial scan — that's the Reddit-mining tool that scores customer complaints — paste the cards here. If you've done customer interviews, support-ticket analysis, or sales-call transcripts, paste those too. Up to five pain cards.
[B-ROLL: show the widget — a pain card being added, fields filling in]
Each card captures seven things.
The pain title — one sentence in plain language.
A score from zero to one hundred — based on how intense and how frequent the pain is.
Frequency — daily, weekly, monthly, quarterly, or one-time.
The source community or URL — the subreddit, the Skool group, the LinkedIn search.
An audience profile — who is suffering, in your words.
Up to five verbatim customer quotes. Word for word, the way they wrote it.
One to three AI solution seeds — concept-stage solutions, with a suggested monetization model.
Once you have two or more cards, the widget asks you to pick one as the lead pain. The lead seeds Gate 01 and Gate 03 downstream. The other cards become supporting evidence.
If multiple pains orbit the same root frustration, you can group them into a cluster. The cluster becomes your offer surface — meaning the offer doesn't have to solve a single point pain, it can solve a cluster of related pains. That's how bigger offers get built.
[GRAPHIC: highlight the 'Lead pain' selector and the 'Cluster' grouping]
Then there's the Voice-of-Customer Vault.
Every quote you paste into any pain card automatically aggregates into a vault accessible from seven downstream textareas. The avatar pain field. The problem statement. The dream outcome. The hook. The headline. The body. The reciprocity gift.
Each of those fields gets a small button — "Pull from VOC vault." Click it, modal opens with all your quotes, click any quote, it inserts straight into your answer with attribution.
"This is the single highest-leverage feature in the whole widget. Copy that uses real customer language outperforms invented copy by thirty to fifty percent. The vault makes that automatic."
Click "Apply lead pain to downstream gates." The widget pre-fills your avatar fields, sets the pain intensity score on a one-to-ten scale based on the PainOnSocial score, maps the frequency, and seeds the offer mechanism field with your solution seeds.
If you don't have research yet — there's a skip button right at the top. Click skip, and you proceed straight to Gate 01. The widget still works. It just runs on weaker fuel. You can come back to Pain Discovery any time once you have data.
[GRAPHIC: show the 'Skip · I have no research yet' button]
Verdict logic on this gate. GO requires a lead card with score seventy or higher, at least three substantive quotes total, audience profile filled, and a card title. If you have a lead card scoring eighty-five or higher with five-plus quotes, the widget rewards that on Gate 01 — the market score gets a four-point evidence boost.
Bottom line: this gate is optional, but it's the multiplier. Skip it and the widget is sharp. Use it and the widget is sharp and grounded in evidence.
Section 4 — Gates 01 through 04½: Market & Offer
Approx. 5 minutes
Gate 01 — Hungry Avatar
"The most important thing you sell is not your product. It's the market you sell it into. A starving crowd is the difference between selling steak and selling sand."
Gate 01 asks two text questions and four scale questions.
First the text. Who exactly is the avatar? Specific. Not "small business owners" — "solo CPAs in their first twenty-four months of practice, billing under seven thousand a month, ages thirty-two to forty-five, post-Big-Four."
And what is the specific pain — in their words, not yours? Quote them. If you cannot quote them, you have not talked to them yet.
If you used Pain Discovery, those fields are already populated from your lead card. You just review and refine.
Then four scales, one to ten. Purchasing power — can they actually pay? Market trajectory — growing, flat, or shrinking? Easy to reach — can you find them? And pain intensity — is this a top-three problem for them right now?
Each scale also has three help panels you can click open. Examples — good versus vague, with side-by-side comparisons. Sharpen this — three pointed questions that test whether your answer is real or hypothesis. And Verify externally — deep-links to Reddit, Google, YouTube, Quora, and others, pre-filled with keywords from your avatar text.
And — only on this gate — there's a Sharpen with AI button. Click it, it sends your answer to Claude Sonnet 4.6 for a structured critique. Specificity score, weakest element, and a sharper rewrite you can insert with one click.
[B-ROLL: click 'Sharpen with AI' on screen, show the score and rewrite appearing]
The verdict adds your four scale scores out of forty. Above thirty-two — GO, hungry crowd confirmed. Twenty-four to thirty-one — REWORK, workable but at least one dimension is weak, and the verdict tells you exactly which one. Below twenty-four — NO, wrong market. The widget will not let you proceed forward on a fundamentally wrong avatar choice.
Gate 02 — Idea or No Idea
"If no one is doing it, that's usually a sign no one wants it. Competition validates demand. Absence of competition is rarely a moat — it's usually a graveyard."
Gate 02 is the filter.
It asks three questions. State the offer in one sentence using the format: "I help [avatar] get [outcome] in [timeframe] without [common objection]." If you can't fit it in one sentence, the offer is unclear.
What's the competitive reality? Crowded with successful operators — best signal. Some competitors, mostly mediocre — strong signal. Almost no competition — caution. Or "I will be first" — almost always wrong.
And the hundred-dollar today test. Would ten of these people pay you a hundred dollars right now for a janky version one? Can you name the ten people specifically? If yes — GO signal. If you'd have to find them — REWORK. If no — NO.
This gate kills more ideas than any other. It catches operators who fell in love with their own concept but have zero proximity to actual buyers.
Gate 03 — Profitable Problem
"Every problem is not a profitable problem. The best businesses solve problems the customer pays you to keep solving."
Gate 03 confirms the problem itself. State it precisely. How often does it recur? Daily, monthly, quarterly, or once?
Recurring pain equals recurring revenue. Daily or weekly is best — that supports a continuity offer. Once-in-a-lifetime project pain is the weakest, because every customer is a re-acquisition.
What's the cost of NOT solving it? High — losing money, customers, status. Moderate — friction and frustration. Low — minor inconvenience.
"Price is set by the cost of the problem, not the cost of the solution."
Low cost of inaction means hard to monetize. The verdict will mark that as a NO and tell you to either reframe to a higher-cost angle or pick a different problem.
And finally — what do they currently do to solve it? Or fail to? Because the status quo IS the competition.
Gate 04 — Grand Slam Offer
"Value equals dream outcome times perceived likelihood, divided by time delay times effort and sacrifice. The numerator is what they want. The denominator is what they pay in pain. Move both."
Gate 04 is Hormozi's Value Equation. Seven inputs.
Dream outcome — what's the explicit, measurable transformation? And rate how compelling it is, one to ten.
Perceived likelihood — what's your proof this works? Case studies, testimonials, your own results. Then rate how believable it is through skeptical buyer eyes.
Time delay — how fast does the customer feel results? Within twenty-four hours, within a week, within thirty days, or longer?
Effort and sacrifice — done-for-you, done-with-you, DIY with templates, or self-paced with no human contact?
And the seventh field — added in version two — Named Mechanism.
"A named mechanism is the difference between a ninety-seven dollar product and a four-thousand-nine-hundred-ninety-seven dollar program containing the same content."
Give your method a name. The Retainer Method. The Pulse Protocol. The Four-Lane Framework. Then in one sentence explain why it works when generic approaches fail. This is required. Without a named mechanism, the verdict will block GO.
The widget computes a Value Score out of one hundred using Hormozi's actual formula. Above thirty-five — GO, Grand Slam Offer. Twenty to thirty-four — REWORK, sharpenable, with the verdict naming your weakest lever. Below twenty — NO, the offer will not convert at scale even with great copy.
Gate 04½ — Offer Stack
"The naked core offer is never the offer. The offer is the core PLUS the stack: bonuses that solve the next three problems, a guarantee that flips the risk to you, scarcity that creates a real reason to act now, and a name that makes it sound like a thing."
Gate 04½ is where you actually build the stack. Not score it — build it.
Seven fields. The offer name — "The Ninety-Day Retainer Sprint" beats "my coaching program" by thirty percent on conversion.
Three to five bonuses, each named, each with an outcome, each with a price-anchor. Bonus one: The First-Client Script Library — seven sales scripts that closed real deals — four-hundred-ninety-seven dollar value.
The guarantee type. Hormozi's ladder runs from implied at the bottom to anti-guarantee at the top. The widget pushes you toward conditional — "do X, Y, Z and if no result, double your money back" — because that forces customer accountability and produces dramatic risk reversal.
Then the actual guarantee wording — exact words you'll use on the page.
Scarcity mechanism. Cohort cap. Founding-member price ladder. Bonus expiration. Launch window. Or — and this is a hard NO from the verdict — fake countdown timers and inflated urgency. Cialdini is explicit on this. Scarcity works only when it is structurally true. Fake scarcity gets discovered, and one discovery burns the audience permanently.
And finally the stack value versus the actual price. Cialdini's contrast principle. A four-hundred-ninety-seven dollar price next to no anchor looks expensive. A four-hundred-ninety-seven dollar price next to a five-thousand-nine-hundred-ninety-one dollar stack value looks like a steal.
The verdict checks the ratio. Below three-to-one means the contrast doesn't register — REWORK. Five-to-ten-to-one is the conversion sweet spot.
That's the construction phase. Avatar, Idea, Problem, Offer, Stack. Five gates, all about answering: is there a real market and have you packaged a real solution. Now we move to distribution.
Section 5 — Gates 05 through 06½: Distribution, Copy & Persuasion
Approx. 4 minutes
Gate 05 — Core Four Distribution
"There are four ways to get a stranger to know about you. Warm outreach, cold outreach, warm content, paid ads. That's it. The mistake is picking three at the start. Pick ONE."
Gate 05 forces a single channel choice. Just one.
Warm outreach — best for your first ten customers. Free. Low volume. Cold outreach — best when the avatar is identifiable and reachable. Cheap, skill-intensive. Warm content — compounds over time, slow start. Paid ads — fastest scaling, but requires unit economics first.
Then the volume math. If you need ten customers in ninety days at one percent conversion, you need a thousand conversations. That's twelve a day. Do the math now, before launch.
And — do you know your unit economics? CAC, LTV, payback period. If you pick paid ads without knowing those, the verdict gives you a hard NO. "Paid ads without unit economics equals fire."
Gate 05½ — Dream 100
"You don't need to find a million strangers. You need to find the hundred people who already gathered them."
Gate 05½ is from Brunson's Traffic Secrets. The Dream 100.
List twenty-five specific people, podcasts, newsletters, or groups your avatar already follows. Real handles. Real URLs. Not "fitness influencers" — but "@HybridAthlete on Twitter, two-point-one million followers."
Then pick a strategy. Work your way in by providing value first. Buy your way in via sponsorship and ads. Or partner via joint ventures. Working two strategies on the same person at the same time burns the bridge — pick one.
Write the first-touch script. No pitch. No ask. Gift first. Quote them, share a result, send a resource. Cialdini's reciprocity rule — the gift comes first or the ask is dead.
And declare your weekly outreach volume. Below five contacts a week, the Dream 100 doesn't reach the relationship density needed to produce invitations. The verdict pushes you toward ten to twenty a week.
Gate 06 — Hook, Headline, Body
"You have three seconds. The hook stops the scroll. The headline promises the dream. The body proves you can deliver."
Gate 06 is the copy gate. Four fields.
The hook — first three seconds, what stops the scroll. Callout question. Pattern interrupt. Specific stat.
The headline — the promise. Format: outcome in timeframe without objection.
The body — five-line skeleton. Problem, what's working now, named mechanism, proof, specific CTA.
And the CTA specificity. "Get the five-page Retainer Pricing Calculator" beats "learn more" by fifty percent on conversion.
All four of those textareas have the VOC vault button. Pull from your customer quotes. Use their language. Not yours.
Gate 06½ — Persuasion Architecture
"Copy is downstream of persuasion. Most operators write copy and hope persuasion happens. The reverse is correct."
Gate 06½ is the largest single gate. Eight inputs. This is where most operators discover their copy was beautiful and their persuasion was empty.
First — the Big Domino. Brunson's question. If you can make your prospect believe ONE thing is true, all other objections become irrelevant. State that one belief.
Then the False Belief Audit. Three false beliefs blocking the sale. One about the vehicle — "retainer pricing only works for big firms." One about themselves — "I'm too new to charge that much." And one about external factors — "my market is too price-sensitive."
Then the reciprocity gift. The actual lead magnet. Specific, useful, immediate. Not "a free guide" — "The Retainer Pricing Calculator. Three-tier model with anchor logic, plus five sample proposals that closed real two-thousand to five-thousand a month deals. PDF plus Notion template. Seven minutes to use."
Then the Cialdini five-lever audit. Reciprocity strength. Social proof density. Authority. Unity language — does your copy use "we" and "our kind"? Consistency mechanism — what micro-yes do you secure before the macro-yes?
The verdict computes a Cialdini Score out of ten. Below six — REWORK with the weakest two levers named. Strong launches activate five or more visibly on the offer page.
Bottom line: copy without persuasion architecture is decoration. The architecture decides the conversion rate.
Section 6 — Gates 07 & 08: Deploy & Iterate
Approx. 3 minutes
Gate 07 — Deploy
"Done beats perfect every single time. The launch you do not run cannot teach you anything. The launch that embarrasses you in twelve months is the right launch."
Gate 07 is the ship gate. Five locks.
The beta launch date — specific calendar date, thirty days out or less. Pick a Friday. Tell another operator. Make it expensive to slip.
The beta cohort size. Five to ten founding members is best for first launch. Ten over-served founding members produce ten times the testimonial density of fifty mediocre members.
The beta price. The widget warns you about the Muddled Middle — five hundred to nine hundred dollars. Too expensive for impulse, too cheap for premium. Drop to four-ninety-seven or raise to nine-ninety-seven and above.
The kill rule. What happens if you don't hit the number? Less than five paid in fourteen days equals pivot offer angle. That's the operating default. The widget will REWORK you if you say "I'll keep going regardless." That's not strategy — that's sunk-cost grinding.
And the four minimum tools. A way to capture leads. A way to take payment. A way to deliver. A way to measure. Anything less than three of those, the verdict gives a hard NO.
Gate 08 — Iterate
"Volume forgives mistakes. The operator who has a hundred sales conversations learns more than the operator who has five perfect ones."
Gate 08 is iteration. Six fields.
How many at-bats? Iterating on fewer than ten conversations is iterating on noise. Twenty to thirty is the minimum threshold for signal.
What's the dominant pattern from real customer data? Not what you think — what they're actually telling you.
Which Value Equation lever do you adjust? One per cycle. Multiple changes at once equals rebuild, not iterate.
Then two diagnostics from Eugene Schwartz. Awareness stage — where is the market relative to the solution? Unaware, problem-aware, solution-aware, product-aware, or most-aware? Each stage demands different copy. A Stage 1 audience needs the problem named. A Stage 5 audience needs a new mechanism.
Market sophistication — how worn-out are the claims in this niche? Stage 1, you can make direct claims. Stage 4, mechanisms are saturated and you need a brand-new one. Stage 5, every mechanism has been heard and you have to lead with identity and story.
Most copy fails because it's written for the wrong stage. The widget catches that and tells you to combine your lever change with a mechanism rename if your market sophistication is at three or higher.
And finally — refund interview discipline.
"The refund call is the single most valuable sales call you will ever take."
Five questions. What did you hope this would do for you? What part caused you to step back? Was the issue hook, audience, offer, onboarding, or delivery? What would have changed your mind? And — would you refer someone else?
If you process refunds silently, the widget marks you REWORK. Refunds are the highest-signal data in the business. Do not throw them away.
Section 7 — Gates 09 through 11: Pivot, Scale, Compound
Approx. 4 minutes
Gate 09 — Pivot or Hold
"Three things can be wrong: the offer, the audience, or the hook. They look identical from the outside. The diagnostic is in the data."
Gate 09 is the pivot diagnostic. Three funnel checks.
Click-through rate on your hooks. Below baseline — that's a hook problem. Rewrite ten new hooks. Test each at minimum a hundred impressions.
Opt-in rate of clickers. Below baseline — that's an audience problem. The wrong people are clicking. Tighten your messaging to repel non-buyers.
Refund and retention rate. Refunds above ten percent or negative NPS — that's an offer problem. Do NOT scale a leaky bucket. Volume just produces refunds and reputation damage.
This gate prevents the most common founder failure — "more leads will fix it." If your offer's broken, more leads compound the breakage.
Gate 10 — Scale
"You scale what works. You don't scale what might work. Scaling before the signal is gambling. Scaling after is math."
Gate 10. Three checks.
Do you have the scale signal? Ten-plus customers from one channel, known unit economics, six-plus months of retention data. Anything less and you're gambling, not scaling.
Which scale lever? Three options — and most operators get this wrong.
Raise price first. Highest leverage. A ten percent price increase produces roughly fifty percent profit increase.
Increase retention. Second-highest. Reducing churn by twenty percent doubles LTV.
Increase volume. Third lever. Most expensive. Use only when price and retention are maxed.
Most operators reach for volume first. The widget will REWORK that and tell you to test a price increase first.
And — name the bottleneck. Theory of Constraints — there's one bottleneck at a time. Lead gen, sales, delivery, retention. Name it. Fix it. Move to the next.
Gate 11 — Repeat & Compound
"One offer to one audience is a business. Two offers to the same audience is a customer base. Three offers to the same audience is a moat."
Gate 11 is the largest gate at the back. Ten fields.
First — what's the next problem your existing customers will pay you to solve? Ask twenty customers "what's the next thing you would buy from me?" Build that.
Then the compound move. New offer, same audience, same channel — best play. Same offer, adjacent audience — second-best. Same offer, same audience, new channel — third option. New business entirely — almost always wrong.
Have you maxed out the current offer? If you say "I'm bored," the verdict gives you a hard NO. Boredom is not strategy. Boredom signals you've automated the wrong things or stopped talking to customers.
Then the Value Ladder. Five named rungs.
Rung one — the Bait. Free lead magnet. Named, valuable, immediate.
Rung two — the Tripwire. Seven to ninety-seven dollar entry offer. Converts a lead into a buyer.
Rung three — the Core Offer. Two-ninety-seven to one-thousand-nine-hundred-ninety-seven dollar Grand Slam.
Rung four — Continuity. Recurring monthly offer. Skool community, software subscription, monthly coaching.
Rung five — High-Ticket. Five-thousand to fifty-thousand DFY tier. Eighty percent of operator profit lives here.
If you have fewer than three rungs, the widget marks you REWORK. "A single offer is a product. A ladder is a business."
Continuity health. What percentage of customers are on a recurring offer? Below twenty percent means you haven't built continuity yet. Above sixty percent means you have a real moat.
And affiliate motion. Have you turned customers into affiliates? Ten customer-affiliates each bringing five clients equals fifty new customers at zero acquisition cost.
This is where the widget moves you from operator to compound machine.
Section 8 — The Brief, the Close, & Call to Action
Approx. 2 minutes
[GRAPHIC: show the printable brief, pages flipping or scrolling]
After all sixteen gates, you land on the Brief.
One page. Print it, tape it to your wall, send it to your accountability partner. Every decision you made, every verdict you earned, every piece of customer evidence you imported — all in one document.
It includes the Pain Discovery section if you used it. Top three customer quotes. Avatar. Idea. Problem. Offer with the Value Equation. The Grand Slam Stack. Distribution, Dream 100, Copy. The Persuasion Architecture audit. The Launch plan. And — if you got that far — the iterate, scale, and compound sections including your full value ladder.
And every gate has a verdict pill at the top — green for GO, deep red for NO, gold for REWORK. So you can see at a glance where the holes still are.
You can export the whole thing as JSON. You can print it. You can share it.
"You don't have a thinking problem. You have a doing problem. The next document is not the answer. The next paying customer is."
[CAMERA: lean in, direct address. Hold final beats.]
Here's the truth about the widget.
It will not tell you what to build. It will tell you whether what you're already thinking about is going to survive contact with the market — and if not, exactly which gate is going to kill it.
Sixteen gates. Roughly seventy-three input fields. Three verdicts. Built on Hormozi for offer construction. Brunson for the value ladder and Dream 100. Kennedy for direct response and risk reversal. Cialdini for the seven principles of influence. Schwartz for awareness and sophistication staging. And the operator's discipline that ties it all together — RISER Captain's Logic.
If you walk all sixteen gates and end up at GO, you have something most operators never have. A decision document built on evidence, not enthusiasm.
And if you end up at NO before Gate Seven — that's the win, too. Because that's the ninety days you didn't waste.
[PAUSE: 2 seconds. Then close.]
Open the widget. Pick an idea. Walk the gates. See where you land.
That's the work.
[END]
Appendix — Quick Reference
All 16 Gates at a Glance
Gate
Name
What it Does
00
Start
Intro
00½
Pain Discovery
Import VOC research (PainOnSocial, interviews)
01
Hungry Avatar
Score the market on 4 dimensions
02
Idea / No Idea
Filter for competitive reality + proximity to demand
03
Profitable Problem
Confirm pain + frequency + cost of inaction
04
Grand Slam Offer
Score the Value Equation + named mechanism
04½
Offer Stack
Build bonuses, guarantee, scarcity, naming
05
Core Four
Pick one distribution channel
05½
Dream 100
Name 25 people who own your audience
06
Hook / Body
Write hook, headline, body, CTA
06½
Persuasion
Big Domino + false beliefs + Cialdini audit
07
Deploy
Lock date, cohort, price, kill rule, tools
08
Iterate
Awareness stage + lever + refund interviews
09
Pivot or Hold
Diagnose hook, audience, or offer failure
10
Scale
Pick price, retention, or volume as lever
11
Repeat
Build value ladder + continuity + affiliate motion
12
Brief
One-page printable summary
The Three Verdicts
GO — proceed; here's the next concrete action.
NO — do not proceed; here's the specific reason your idea fails this gate.
REWORK — close, but here's what to sharpen first.
Source Lineage
Alex Hormozi — $100M Offers, $100M Leads, Acquisition.com operating system
Russell Brunson — DotCom Secrets, Expert Secrets, Traffic Secrets
Dan Kennedy — No B.S. Direct Marketing, risk reversal, herd-building
Robert Cialdini — Influence (the 7 principles), Pre-Suasion
Eugene Schwartz — Breakthrough Advertising — awareness + sophistication staging
RISER Captain's Logic — the operating discipline that synthesizes all of the above into one decision engine.
Original asset: RISER-Operators-Flow.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RISER Operator's Flow · Operating Doctrine</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter+Tight:[email protected]&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a; --paper: #f7f4ee; --paper-warm: #f0eadf; --paper-deep: #e9e2d2;
--rule: #1a1a1a; --red: #c9302a; --red-deep: #8b1f1c; --red-tint: #fbe8e6;
--gold: #b8893a; --gold-tint: #f5ead0; --teal: #2c5f5a;
--muted: #5a564f;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: var(--sans);
background: var(--paper);
color: var(--ink);
line-height: 1.6;
font-size: 15px;
max-width: 880px;
margin: 0 auto;
padding: 48px 36px 80px;
}
h1 {
font-family: var(--serif);
font-weight: 600;
font-size: clamp(36px, 5vw, 52px);
line-height: 1.05;
letter-spacing: -0.025em;
margin-bottom: 14px;
border-bottom: 3px double var(--rule);
padding-bottom: 18px;
}
h2 {
font-family: var(--serif);
font-weight: 600;
font-size: 30px;
letter-spacing: -0.02em;
margin-top: 50px;
margin-bottom: 14px;
padding-top: 16px;
border-top: 2px solid var(--rule);
padding-bottom: 4px;
line-height: 1.15;
}
h2:first-of-type { border-top: none; padding-top: 0; margin-top: 32px; }
h3 {
font-family: var(--mono);
font-size: 13px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--red-deep);
margin-top: 28px;
margin-bottom: 10px;
padding-bottom: 4px;
border-bottom: 1px solid var(--rule);
}
p {
font-family: var(--serif);
font-size: 16px;
line-height: 1.6;
margin-bottom: 14px;
color: var(--ink);
}
strong { font-weight: 600; color: var(--ink); }
em { font-style: italic; }
code {
font-family: var(--mono);
font-size: 13px;
background: var(--paper-warm);
padding: 1px 6px;
border-radius: 2px;
color: var(--red-deep);
}
hr {
border: none;
height: 1px;
background: var(--rule);
opacity: 0.35;
margin: 36px 0;
}
ul {
margin: 8px 0 16px 0;
padding-left: 0;
list-style: none;
}
li {
font-family: var(--serif);
font-size: 15.5px;
line-height: 1.55;
margin-bottom: 8px;
padding-left: 22px;
position: relative;
color: var(--ink);
}
li::before {
content: '→';
position: absolute;
left: 0;
top: 1px;
color: var(--gold);
font-weight: 700;
font-family: var(--sans);
}
table {
width: 100%;
border-collapse: collapse;
margin: 16px 0 24px 0;
font-family: var(--sans);
font-size: 14px;
border: 1.5px solid var(--rule);
}
thead {
background: var(--ink);
color: var(--paper);
}
th {
padding: 10px 14px;
text-align: left;
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.1em;
text-transform: uppercase;
font-weight: 600;
}
td {
padding: 9px 14px;
border-top: 1px solid var(--rule);
vertical-align: top;
line-height: 1.5;
}
tr:nth-child(even) td { background: var(--paper-warm); }
/* Tighten the lead-paragraph blocks */
h1 + h2 { margin-top: 12px; border-top: none; }
/* Print styles */
@media print {
body { background: #fff; padding: 0; max-width: 100%; font-size: 10.5pt; }
h1 { font-size: 22pt; page-break-after: avoid; }
h2 { font-size: 16pt; page-break-after: avoid; page-break-before: auto; margin-top: 22pt; }
h3 { font-size: 11pt; page-break-after: avoid; margin-top: 14pt; }
p, li { font-size: 10.5pt; }
hr { page-break-after: always; border: none; height: 0; margin: 0; }
table { page-break-inside: avoid; font-size: 9.5pt; }
td, th { padding: 5px 8px; }
code { background: #f0f0f0; }
@page { margin: 0.6in; size: letter; }
}
</style>
</head>
<body>
<h1>RISER Operator's Flow</h1>
<h2>A structural skeleton for building, marketing, and scaling a high-ticket professional services business — phase by phase, step by step, with the actual work named honestly.</h2>
<hr>
<p><strong>Version 1 · April 2026 · Captain's Logic Operating Doctrine</strong></p>
<p>This document is the spine. It tells you what stages exist, what order they go in, what each one produces, what could go wrong, and where the existing RISER widgets fit. Use it as a checklist on any given Tuesday — "I'm at Phase 2, Step 3, here is the next concrete deliverable" — not as a vision document to read once and forget.</p>
<p>The framework covers five phases, eighteen steps, and one continuous feedback loop. Phases roughly correspond to weeks 1–4 (Phase 1), 5–8 (Phase 2), 9–12 (Phase 3), and 13+ (Phases 4 and 5, which are continuous from launch onward). A solo operator can complete Phase 1 in seven days if they are disciplined; most take longer because Phase 1 is where the real thinking happens and skipping it makes everything downstream harder.</p>
<p>Three honest framings before you start:</p>
<p><strong>This is not a get-rich-quick plan.</strong> It is a working operator's plan. The fastest result you will see from doing this correctly is a real client conversation in week three. The first paying client typically lands in week six to ten. Operators who expect faster usually skipped Phase 1.</p>
<p><strong>Most "AI agents" mentioned in marketing-stack content are aspirational.</strong> The agent layer in 2026 is mostly real for narrow, well-bounded jobs: drafting first replies a human approves, pulling structured data from PDFs, summarizing call transcripts, routing leads to the right sequence. It is mostly hype for unbounded creative or strategic work. Throughout this document, tools are graded <strong>Real</strong>, <strong>Useful With Caveats</strong>, or <strong>Mostly Theater</strong>. Use the Real ones, treat the second category with measurement, skip the third.</p>
<p><strong>The risks that will actually bite an operator are not the ones marketing content discusses.</strong> Reddit API access can change overnight (GummySearch shut down in November 2025 when Reddit denied API access). LinkedIn's automation crackdowns kill outreach tools regularly. Email deliverability collapses under cold-volume sends. State bar associations and professional licensing boards have rules about AI-personalized outreach that can endanger your license if violated. These risks are flagged inside each step where they apply.</p>
<hr>
<h2>Phase 1 — Foundation</h2>
<h3>What this phase produces</h3>
<p>A validated business hypothesis you can defend with evidence, an offer that solves a pain people actually have, and a minimum viable version you can sell next week. Not a finished product. Not a polished brand. A defensible <em>bet</em> with a known kill criterion.</p>
<h3>Why it matters</h3>
<p>Operators who skip this phase end up in Phase 3 (traffic generation) trying to drive volume to a thing nobody clearly wants. They compensate with bigger ad spend, more outreach, more content. None of it works because the offer is wrong. Phase 1 is unglamorous and slow. It is also the highest-leverage week of the entire build.</p>
<hr>
<h3>Step 1.1 — Idea Capture</h3>
<p><strong>Produces:</strong> A one-paragraph statement of the business or service idea, who you think it serves, and what specific problem you think it solves.</p>
<p><strong>Input:</strong> Your existing skills, prior work, professional credentials, and the rough hypothesis you're entering with.</p>
<p><strong>How to do it:</strong> Write the paragraph by hand on paper. Two hundred words. Include the buyer (one sentence), the problem (one sentence), the solution (one sentence), the price tier (one sentence), and what makes you specifically the right person to deliver it (one sentence). The constraint forces clarity.</p>
<p><strong>Done-when criteria:</strong> A literate friend can read the paragraph once and explain back to you what your business does, who it's for, and why someone would pay you. If they can't, rewrite.</p>
<p><strong>Common failure modes:</strong> Writing in jargon. Listing features instead of outcomes. Defining the buyer too broadly ("small business owners" instead of "construction defect attorneys at mid-sized firms in Arizona"). Hiding behind credentials instead of describing what you actually do for clients.</p>
<p><strong>AI/tool layer:</strong> None needed at this step. <strong>Mostly Theater</strong> if you're using AI to "validate" the idea here — the model will tell you almost any idea sounds promising. Save the validation work for Step 1.3.</p>
<p><strong>Iteration trigger:</strong> Phase 5 customer feedback that contradicts your stated buyer or problem. Rewrite this paragraph quarterly.</p>
<hr>
<h3>Step 1.2 — Pain Discovery</h3>
<p><strong>Produces:</strong> A document with three to five real pain points your buyer experiences, written in their own language, with evidence sources. Not pain you assume they have. Pain they say out loud.</p>
<p><strong>Input:</strong> The Step 1.1 paragraph. Your hypothesis about who the buyer is.</p>
<p><strong>How to do it:</strong> Three parallel research tracks, run for one week:</p>
<p>1. <strong>Direct conversations.</strong> Five to ten phone or video calls with people in your target buyer category. Not pitches. Listening tours. Questions: What's the most frustrating part of [problem area]? When did this last cause a real problem? What did you try? What worked? What didn't?</p>
<p>2. <strong>Public language mining.</strong> Read what your buyers post and ask in places they gather: LinkedIn posts and comments, association forums, niche Slack groups, industry-specific subreddits if any exist, Quora answers in their domain. Copy verbatim phrases into a document.</p>
<p>3. <strong>Tool-assisted scanning.</strong> Use the RISER Pain Discovery Tool Catalog — specifically the Reddit pain mining tools, audience intelligence tools (SparkToro), and VOC synthesis tools — to surface language patterns at scale.</p>
<p><strong>Sort what you find into two buckets — burning vs chronic.</strong> This distinction is the most useful prioritization tool in pain discovery. <strong>Burning pain</strong> is active crisis: a lawsuit was filed last week, a deposition is in 14 days, a client just sued, a deadline is tomorrow, a regulator just sent a notice. Burning pain drives buying <em>this week</em>. <strong>Chronic pain</strong> is the dull background ache: communication is messy, vendor management is annoying, paperwork takes too long. Chronic pain is real but rarely triggers a buying decision on its own — it needs a triggering event to become burning.</p>
<p>For high-ticket professional services, your offer must address burning pain. Operators who build offers for chronic pain spend years marketing to people who agree there's a problem but never buy. Tag every pain point in your discovery doc as B (burning) or C (chronic). If your top three pains are all C, your offer or your avatar is wrong.</p>
<p><strong>Done-when criteria:</strong> You have at least 20 verbatim quotes from real buyers describing pain in their own words, organized into 3–5 themes, each tagged burning or chronic. At least two of your top themes are burning. You can show a friend the quotes (with sources) and they can independently identify the themes you found and the burning/chronic tag.</p>
<p><strong>Common failure modes:</strong> Using your own words instead of the buyer's. Treating one Reddit thread as evidence. Skipping the direct conversations because they're hard to schedule (this is the single biggest stall point). Picking only pain points that flatter your existing solution.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Otter.ai or Fathom for transcribing buyer conversations. ChatGPT/Claude for synthesizing themes across transcripts. SparkToro for finding where buyers gather.</li>
<li><strong>Useful With Caveats:</strong> PainOnSocial, PainPointy for surfacing language patterns. They produce useful raw material but the categorization needs human review — the AI is wrong about pain intensity ranking maybe one third of the time.</li>
<li><strong>Mostly Theater:</strong> Any tool claiming to "automatically generate buyer personas" without you talking to a single buyer. The output looks plausible. It will not survive contact with reality.</li>
</ul>
<p><strong>Iteration trigger:</strong> Quarterly. Buyer pain shifts as their context shifts (regulatory changes, economic conditions, technology shifts). The doc you wrote in Q1 needs revision by Q3.</p>
<p><strong>Existing RISER artifact:</strong> The <strong>MVO Decision Engine widget</strong> (Gate 00½ Pain Discovery, Gate 01 Hungry Avatar). The <strong>Pain Discovery Tool Catalog</strong> lists the 41 tools that fit this work and their honest tradeoffs.</p>
<hr>
<h3>Step 1.3 — Offer Hypothesis</h3>
<p><strong>Produces:</strong> A specific named offer — what you sell, what it costs, what the buyer gets, what they walk away from the call with — that maps directly to the pain you found.</p>
<p><strong>Input:</strong> Step 1.2 pain document. Your skills inventory.</p>
<p><strong>How to do it:</strong> Write the offer in one page, using Hormozi's value-equation structure. Name the dream outcome (in the buyer's words). Name the perceived likelihood (your proof — credentials, prior work, sample deliverable). Name the time delay (how long until they get the result). Name the effort/sacrifice (what they have to do versus what you do). The offer wins or loses on whether (Dream × Likelihood) ÷ (Time × Effort) is high.</p>
<p>Decide on a named mechanism. Not "I do forensic engineering" — "The 14-Day VRF Failure Forensic Audit." Specific deliverable, specific timeframe, specific outcome.</p>
<p>Decide on a kill criterion before launch. <em>"If I cannot get one paying engagement at this price within 60 days of starting active outreach, I will reduce price by 25% or restructure the offer."</em> Write the criterion down. Date it. Keep it visible.</p>
<p><strong>Done-when criteria:</strong> You can describe the offer in 30 seconds, name the price, name the deliverable timeline, name your kill criterion, and a literate friend can repeat it back accurately.</p>
<p><strong>Common failure modes:</strong> Pricing too low because you're nervous (this is universal — your first instinct on price is usually 40–60% of what the market pays). Naming the offer in your own jargon instead of the buyer's. Skipping the kill criterion because writing it feels like admitting you might fail. The kill criterion is the <em>whole point</em> — it converts a vague hope into a falsifiable bet.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Claude or ChatGPT to pressure-test offer language by simulating buyer objections. Wynter ($540+/test) for actual ICP message testing if the price tier justifies it.</li>
<li><strong>Mostly Theater:</strong> Any "AI offer generator" that produces a finished offer without you doing the pain research first. The output is generic.</li>
</ul>
<p><strong>Iteration trigger:</strong> First five buyer conversations. If buyers don't immediately understand the offer or push back hard on price, restructure.</p>
<p><strong>Existing RISER artifact:</strong> The <strong>MVO Decision Engine</strong> Gate 04 Solution Sketch, Gate 05 Offer, Gate 06 Pricing. The <strong>Marketing Plan Generator</strong> outputs a complete offer angle in section 08 of every plan it produces.</p>
<hr>
<h3>Step 1.4 — MVP / Service Definition</h3>
<p><strong>Produces:</strong> The actual <em>thing</em> you will deliver. For services this is a scope-of-work template. For software this is a working prototype. For productized services this is a defined deliverable package.</p>
<p><strong>Input:</strong> Step 1.3 offer document.</p>
<p><strong>How to do it:</strong> Write the scope of work in one page. What's included. What's not included. Timeline. Communication cadence. Revisions. Out-of-scope handling. Payment terms. For a service business, this is also where you decide what you will template, what you will custom-build, and what you will refuse to do.</p>
<p>For productized services (most professional services should be productized): name the package, list the exact deliverables, set the price, set the timeline, define what makes a customer eligible to buy.</p>
<p><strong>Done-when criteria:</strong> You have an SOW you could send to a buyer this afternoon. It defines scope so clearly that you know in advance what you're delivering and so does the buyer.</p>
<p><strong>Common failure modes:</strong> Vague scope language ("ongoing strategic guidance") that lets buyers expand the work without paying more. Missing the "out of scope" section. No defined revision limit. Promising deliverables you haven't actually built a process for.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Claude or ChatGPT to draft the SOW from a checklist. PandaDoc or Bonsai for SOW signing infrastructure (free or low cost).</li>
<li><strong>Mostly Theater:</strong> Building a "Product Architect Agent" workflow before you've delivered the service to one human. Map the actual delivery from one real engagement first.</li>
</ul>
<p><strong>Iteration trigger:</strong> After the first three engagements. You will discover scope leaks and SOW gaps you didn't anticipate. Update the template.</p>
<hr>
<h2>Phase 2 — Positioning and Asset Build</h2>
<h3>What this phase produces</h3>
<p>The artifacts a buyer encounters before they buy from you. Brand, message, lead magnet, sales page, proof. Not all of them at once — the minimum credible set.</p>
<h3>Why it matters</h3>
<p>Phase 1 gave you a defensible offer. Phase 2 gives buyers a way to evaluate you without talking to you first. For high-ticket professional services, where buyers research at 11pm before deciding who to contact, the asset layer is what gets you on the consideration list. Skip it and you're invisible.</p>
<h3>Honest framing on this phase</h3>
<p>You don't need a $5,000 logo. You don't need a 12-page brand bible. You don't need a hand-photographed headshot. You need the minimum credible set, deployed within a week, and you need to spend the saved time on Phase 3 outreach. Operators stall here because polishing assets feels productive. It is not. It is procrastination dressed as work.</p>
<hr>
<h3>Step 2.1 — Competitive Intelligence</h3>
<p><strong>Produces:</strong> A one-page comparison matrix of three to five direct competitors — their offer, their pricing, their positioning, their lead magnet, their hook, what's working for them, what's missing.</p>
<p><strong>Input:</strong> Phase 1 work. Knowledge of who else serves your buyer.</p>
<p><strong>How to do it:</strong> List five competitors. Open each one's website, lead magnet (download it), pricing page (if visible), LinkedIn, and any case studies. Fill in the matrix. Note what you can't easily improve on (their credentials, their tenure) and what you can (their positioning, their offer specificity, their pain language match).</p>
<p><strong>Done-when criteria:</strong> You can name in one sentence per competitor what's strong about their positioning and what's weak. You have an explicit "we're different from them because..." for each.</p>
<p><strong>Common failure modes:</strong> Researching too many competitors (five is enough; ten is hiding from the work). Fixating on what they do better instead of what they leave on the table. Copying their offer instead of differentiating from it.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Built With or SimilarWeb for tech-stack and traffic visibility on competitor sites (free or low-tier). Wayback Machine to see how their positioning has evolved.</li>
<li><strong>Useful With Caveats:</strong> Apify, Bright Data for scraping if you need depth. Compliance and TOS questions matter — read them.</li>
<li><strong>Mostly Theater:</strong> "AI-driven competitive intelligence agents" that promise daily monitoring. They produce dashboards. Dashboards are not insight.</li>
</ul>
<p><strong>Iteration trigger:</strong> Quarterly. Competitor offers and positioning shift; your matrix needs refresh.</p>
<hr>
<h3>Step 2.2 — Brand & Asset Minimum Viable Set</h3>
<p><strong>Produces:</strong> A logo (or wordmark), one professional headshot, a one-page bio, a defined color palette, and a one-page service overview document. That's the minimum. Nothing more until you've closed five clients.</p>
<p><strong>Input:</strong> Phase 1 work. Your existing materials.</p>
<p><strong>How to do it:</strong> Use Canva or Figma. Pay $200–$500 for a wordmark on Fiverr or 99designs if you want polish. Get a real headshot — phone-camera selfie quality is fine for LinkedIn but not for an expert witness directory listing. Write the one-page bio in third person, including your specific credentials, three concrete prior accomplishments (sanitized if needed), and a clear statement of who you serve.</p>
<p><strong>Done-when criteria:</strong> You have a presentable LinkedIn profile, a presentable directory listing draft, and a service overview PDF you can email to a prospect.</p>
<p><strong>Common failure modes:</strong> Spending three weeks on a logo. Hiring a brand strategist before you have buyers. Writing the bio in language that sounds like every other consultant's bio.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Canva ($15/mo) for fast asset production. Claude/ChatGPT to draft and polish the bio. Looka for $50 wordmark generation if you can't decide what you want.</li>
<li><strong>Mostly Theater:</strong> AI-generated "brand identity systems." Looks impressive, costs significant time, doesn't move buyers. Save brand investment for after you have customer feedback.</li>
</ul>
<hr>
<h3>Step 2.3 — Lead Magnet (Gift First)</h3>
<p><strong>Produces:</strong> A specific, valuable, narrow asset that solves one micro-problem for your buyer in exchange for their email or a 15-minute call. Not a generic ebook. A diagnostic checklist, a calculator, a contract review template, a five-page "how to evaluate X" guide.</p>
<p><strong>Input:</strong> Phase 1 pain doc. Knowledge of buyer's specific decision moments.</p>
<p><strong>How to do it:</strong> Pick the buyer's most concrete sub-pain. Build the asset that solves it. Constraint: this asset should be useful even if the buyer never works with you. That's what triggers reciprocity (Cialdini). A bait-and-switch lead magnet that turns into a pitch deck does not work and damages trust.</p>
<p><strong>Done-when criteria:</strong> A buyer who downloads this asset finds it genuinely useful and would tell a colleague about it. You've tested this with two real buyers before launch.</p>
<p><strong>Common failure modes:</strong> Generic "10 tips for X" content. Disguised pitch decks. Asset is too long (40 pages = won't be read) or too short (one tip = not worth the email).</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Claude/ChatGPT to draft the asset content. Canva or Figma for layout. ConvertKit, Beehiiv, or Mailchimp for email delivery infrastructure.</li>
<li><strong>Mostly Theater:</strong> "AI lead magnet generators" that produce generic content with no specific buyer in mind.</li>
</ul>
<p><strong>Existing RISER artifact:</strong> The <strong>Marketing Plan Generator</strong> generates a specific lead-magnet recommendation for any profession+avatar combination as section 05 of every plan.</p>
<hr>
<h3>Step 2.4 — Sales Page / Service Page</h3>
<p><strong>Produces:</strong> A single page on your website (or a one-page Notion/Carrd if you're moving fast) that names the buyer, the pain, the offer, the proof, and the next step. Not a homepage. A targeted page for the specific avatar you're going after.</p>
<p><strong>Input:</strong> All prior Phase 1 and 2 work.</p>
<p><strong>How to do it:</strong> Use the long-form direct response structure: hook → problem → why-other-things-fail → mechanism → proof → offer → bonuses (only if real) → guarantee or risk reversal → CTA. Write it once, in their voice. Word count: 800–1,500 for a high-ticket service.</p>
<p><strong>Done-when criteria:</strong> A cold buyer can read the page and either qualify themselves in (book a call) or qualify out (close the tab). It does both jobs without making them work.</p>
<p><strong>Common failure modes:</strong> Writing about yourself instead of the buyer. Burying the offer below the fold. Vague CTAs ("Get in touch"). No social proof. No risk reversal.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Webflow, Carrd, Framer for fast page hosting. Claude/ChatGPT for copy iteration (it's good at this when you give it Phase 1 buyer language).</li>
<li><strong>Useful With Caveats:</strong> Hyros, Triple Whale for tracking — only if your spend justifies it.</li>
<li><strong>Mostly Theater:</strong> "AI website builders" that promise full sites in one click. Outputs are generic. Use a template instead.</li>
</ul>
<hr>
<h2>Phase 3 — Acquisition</h2>
<h3>What this phase produces</h3>
<p>Real buyer conversations. Not awareness. Not "thought leadership." Conversations with named humans who could pay you, where they say yes, no, or "tell me more."</p>
<h3>Why it matters</h3>
<p>Everything in Phases 1 and 2 is unfalsifiable until Phase 3 puts it in front of buyers. Operators who linger in 1 and 2 are usually avoiding the discomfort of 3. The cure is to launch publicly before you feel ready, then let real feedback drive the iterations.</p>
<h3>The order matters</h3>
<p>For high-ticket professional services, run these channels in this order. Don't run them in parallel until each is proven.</p>
<p>1. <strong>Warm outreach</strong> to your existing network (week one)</p>
<p>2. <strong>Dream 100 cold outreach</strong> to named humans in your target market (week two)</p>
<p>3. <strong>Content distribution</strong> on the platforms your buyers actually use (ongoing from week one)</p>
<p>4. <strong>Paid ads</strong> only after channels 1–3 produce signal</p>
<hr>
<h3>Step 3.1 — Warm Network Outreach</h3>
<p><strong>Produces:</strong> 5–15 conversations with people who already know you, plus a list of 20–50 introductions they could make to people you don't know.</p>
<p><strong>Input:</strong> Phase 1 and 2 assets. Your contact list.</p>
<p><strong>How to do it:</strong> Write a 4–6 sentence note. Tell them what you're doing now. Ask if they know anyone in your target buyer category. Offer to do something useful for them in return. Send it to everyone you've worked with in the last decade. Include the lead magnet as a gift.</p>
<p><strong>Done-when criteria:</strong> All notes sent within seven days. Track replies. Track who introduces you. Follow up.</p>
<p><strong>Common failure modes:</strong> Hiding from this step because asking former colleagues feels needy. (It is not. It is normal professional behavior.) Not having anything specific to ask for. Asking for "any help" instead of "an introduction to anyone you know who handles construction defect cases."</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Your existing inbox and LinkedIn. Claude/ChatGPT to personalize each outreach note from a base template. Notion or a simple spreadsheet to track responses.</li>
<li><strong>Mostly Theater:</strong> Automating warm outreach. The whole point is the personal note.</li>
</ul>
<p><strong>Existing RISER artifact:</strong> The <strong>Marketing Plan Generator</strong> outputs a LinkedIn first-touch template, a cold-email template, and a community-reply template in section 09 of every plan it produces. Adapt those for warm context.</p>
<hr>
<h3>Step 3.2 — Dream 100 List Building</h3>
<p><strong>Produces:</strong> A spreadsheet of 100 named humans in your target buyer category — name, title, firm, geography, contact route, and one specific reason this person fits.</p>
<p><strong>Input:</strong> Phase 1 buyer definition.</p>
<p><strong>How to do it:</strong> Use the segment breakdown from the <strong>Client Acquisition Catalog Dream 100 template</strong> (or build your own equivalent). For a forensic engineer that's roughly: 25 construction defect attorneys + 25 insurance defense attorneys + 15 subrogation managers + 15 mechanical contractor GCs + 10 property management firms + 10 technical committee chairs.</p>
<p>For each, find them on LinkedIn (Sales Navigator helps), record their firm, find their email (Apollo, Hunter, or guessable patterns), record one specific thing they do that's relevant. The "one specific thing" prevents your outreach from being generic.</p>
<p><strong>Done-when criteria:</strong> 100 names. Real ones. Verified contact info for at least 70 of them. Notes column filled in for at least 50.</p>
<p><strong>Common failure modes:</strong> Listing firm names instead of human names. Stopping at 30 because the list is "good enough" (it isn't — Dream 100 works because of compounding, not because the first 30 are special). Skipping the "one specific thing" column.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> LinkedIn Sales Navigator ($99/mo). Apollo (free tier or $59/mo). PACER ($0.10/page) for federal court records to identify attorneys handling specific case types. Justia for free legal directory search. A spreadsheet (Google Sheets is fine).</li>
<li><strong>Useful With Caveats:</strong> Clay ($149+/mo) if you want enrichment-and-personalization-at-scale workflow. Steep learning curve. Probably overkill until you have 30+ confirmed buyers in pipeline.</li>
<li><strong>Mostly Theater:</strong> "AI SDR agents" that build the list and personalize the outreach for you autonomously. They produce volume. Volume is not the bottleneck. Specificity is.</li>
</ul>
<p><strong>Existing RISER artifact:</strong> The <strong>Client Acquisition Catalog</strong> has the full tool stack with verified pricing, organized by channel. The Dream 100 template segment-counts are inside the catalog.</p>
<p><strong>Risks worth flagging:</strong> LinkedIn TOS prohibits most automation. Sales Navigator usage is fine. Tools that auto-message people through LinkedIn risk account suspension and have killed many an outreach plan.</p>
<hr>
<h3>Step 3.3 — Dream 100 Outreach Cadence</h3>
<p><strong>Produces:</strong> First-touch messages sent to all 100 people, follow-up sequence executed, conversations started.</p>
<p><strong>Input:</strong> Step 3.2 list. Step 2.3 lead magnet.</p>
<p><strong>How to do it:</strong> Six-touch cadence over 8 weeks. Mix LinkedIn, email, and (where appropriate) phone. Each touch is short, specific, value-first. Open with the "one specific thing" you noted. Reference a real signal — they posted something, their firm just took on a relevant case, an industry event happened. Lead-magnet offer can come on touch 2 or 3, never touch 1.</p>
<p>Run the cadence as a deliberate practice. 15 outreach touches per workday is the right volume for a solo professional. More than that and quality drops. Less than that and momentum dies.</p>
<p><strong>Done-when criteria:</strong> All 100 people have received at least four touches across 8 weeks. Conversation rate of 8–15% (8–15 named people responded with interest) is normal. Less than 5% means the message is wrong; rewrite. More than 25% means the targeting got lucky; verify before scaling.</p>
<p><strong>Common failure modes:</strong> Sending touch 1 to all 100 then giving up when 92 ignore you. (The compounding is in touches 3–6.) Generic copy that ignores the "one specific thing." Pitching the offer on touch 1.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Smartlead or Instantly ($39–94/mo) for cold-email infrastructure (deliverability matters). HubSpot CRM Free or Pipedrive ($25/seat) for tracking touches. Calendly for booking the calls that result.</li>
<li><strong>Useful With Caveats:</strong> Lemlist ($59+/mo) — premium worth it only if you actually use the personalization features. Otherwise overpriced versus Smartlead.</li>
<li><strong>Mostly Theater:</strong> Cold-outreach AI that generates "100% personalized" messages. The personalization is shallow. Buyers can tell. Better to send fewer messages with real personalization than more with fake.</li>
</ul>
<p><strong>Risks:</strong> Email deliverability. Sending 100 cold emails from a fresh domain will land you in spam folders. Use a separate sending domain, warm it up over 4–6 weeks, follow SPF/DKIM/DMARC standards. Smartlead handles this; sending from your business Gmail does not.</p>
<p>For licensed professionals: state bar associations and professional licensing boards have rules about solicitation. Consult yours before launching cold outreach. Some states prohibit certain cold-contact patterns for attorneys, doctors, and engineers in regulated practice.</p>
<hr>
<h3>Step 3.4 — Content Distribution Cadence</h3>
<p><strong>Produces:</strong> A consistent, multi-month flow of content on the platform(s) your buyers actually inhabit, building credibility while warm and Dream 100 outreach runs in parallel.</p>
<p><strong>Input:</strong> Phase 1 pain doc. Phase 2 positioning. Knowledge of where buyers actually gather.</p>
<p><strong>How to do it:</strong> Pick <em>one</em> primary platform. For high-ticket professional services in 2026, that's almost always LinkedIn. Possibly an industry-specific publication (ABA Journal, ASHRAE Journal, etc.) for the highest-credentialing-value plays. Don't multi-platform until the primary one is producing.</p>
<p>The content cadence framework that works:</p>
<ul>
<li><strong>Monday — Pain post.</strong> A real piece of buyer pain, observed or quoted, with your take. 150–300 words.</li>
<li><strong>Wednesday — Mechanism post.</strong> A specific technical observation or framework, in your area of expertise. 200–400 words. This is the "I know things" post.</li>
<li><strong>Friday — Case study or proof.</strong> A sanitized story from your work, or a public case dissected. 250–500 words.</li>
</ul>
<p>Three posts a week. Same days. Same time. For 12 weeks before evaluating. The discipline matters more than the volume — buyers notice consistency over six months.</p>
<p><strong>Done-when criteria:</strong> 12 weeks of consistent posting. Engagement metrics matter less than reach growth and the qualitative feedback that comes in (DMs, comments, lurkers reaching out). The right buyers reading you silently for 8 weeks before contacting you is the dominant pattern.</p>
<p><strong>Common failure modes:</strong> Multi-platforming too early (LinkedIn + X + Instagram + TikTok). Posting whenever you "feel inspired" instead of on cadence. Generic "thought leadership" posts that aren't grounded in real buyer pain. Stopping after three weeks because results aren't visible.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Claude/ChatGPT to draft and refine post copy from your raw notes. Buffer or Hypefury for scheduling. Notion for content calendar.</li>
<li><strong>Useful With Caveats:</strong> Repurpose.io, OpusClip for converting long-form (podcast, video) into short-form social posts. Useful if you're already producing long-form. Theater if you're not.</li>
<li><strong>Mostly Theater:</strong> AI tools that "generate a year of content in 10 minutes." The output is generic. It does not move buyers. Worse, it identifies you as someone using AI to generate content, which actively damages credibility for high-ticket professional services. This is <strong>Identity Commoditization</strong> in action — see the Closing section for the full framing of why generic AI output collapses your price floor.</li>
</ul>
<p><strong>The honest tradeoff:</strong> AI can save 30–50% of your time on the <em>editing</em> and <em>formatting</em> layer. It cannot save time on the <em>thinking</em> layer. The thinking is the work. If you're using AI to skip the thinking, you're skipping the value.</p>
<hr>
<h3>Step 3.5 — Paid Channels (Defer Until Earned)</h3>
<p><strong>Produces:</strong> Scaled distribution of proven content/offers, after warm and Dream 100 outreach have produced consistent close signal.</p>
<p><strong>Input:</strong> Steps 3.1–3.4 producing measurable conversation rate, close rate, and lifetime value data. You need at least 10 closed clients before you have any business spending on paid ads.</p>
<p><strong>How to do it:</strong> This step is deferred for most professional service operators for 6–12 months. The reason: high-ticket service buyers don't typically respond to paid ads the way e-commerce buyers do. Your CAC math has to work, and it usually doesn't until you've validated the funnel manually.</p>
<p>When you do enter paid: start with one platform (LinkedIn ads if your buyer is on LinkedIn; Google Search if they search for your category; Meta only if your buyer demographic is verified active there). Set a hard monthly cap. Track CAC and LTV explicitly. Cut spend the moment CAC > 0.33 × LTV.</p>
<p><strong>Done-when criteria:</strong> Active paid channel with measurable CAC under your threshold and predictable conversion rate over a 60-day window.</p>
<p><strong>Common failure modes:</strong> Running paid before manual outreach has validated message-market fit. Boosting LinkedIn posts (almost never worth it for high-ticket B2B). Treating paid as a substitute for organic instead of an amplifier of organic.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Native ad platforms. Hyros or Triple Whale for tracking only if spend justifies it.</li>
<li><strong>Mostly Theater:</strong> "AI ad optimizer" tools that promise to manage your campaigns. The platforms' built-in optimization is now better than most third-party tools.</li>
</ul>
<hr>
<h2>Phase 4 — Operations and Delivery</h2>
<h3>What this phase produces</h3>
<p>The systems that let you deliver promised outcomes consistently, capture knowledge from every engagement, and maintain quality as volume increases. SOPs, templates, knowledge management, and the boring infrastructure that prevents the business from collapsing under its own success.</p>
<h3>Why it matters</h3>
<p>Phase 3 will produce clients faster than you expect once it works. Operators without Phase 4 systems compound chaos with every new client. Within six months they're working 70-hour weeks, dropping deliverables, and the original positioning erodes.</p>
<p>This phase runs in parallel with Phase 3 from the moment your first client signs. Don't wait until you're overwhelmed to start.</p>
<hr>
<h3>Step 4.1 — Client Onboarding SOP</h3>
<p><strong>Produces:</strong> A documented, repeatable process for taking a signed client from "yes" to "first deliverable" without anything falling through the cracks.</p>
<p><strong>Input:</strong> Phase 1 SOW template. Your delivery process from your first three engagements.</p>
<p><strong>How to do it:</strong> Document the process. Welcome email template. Kickoff-call agenda. Information-gathering checklist. Project-folder template. Communication-cadence agreement. Payment-collection workflow. The first time you do this it takes a day. Every time after that it saves a day.</p>
<p><strong>Done-when criteria:</strong> A new client signs and the first 14 days run identically each time, with no email you have to write from scratch and no question you have to look up.</p>
<p><strong>Common failure modes:</strong> Reinventing the onboarding for each client. Not having a kickoff agenda. Forgetting to invoice. Missing the information-gathering step and getting blocked mid-engagement.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Notion or Process Street for SOP storage. Loom for recording explainer videos once and reusing them. Calendly for scheduling. PandaDoc or Bonsai for contract+invoice infrastructure.</li>
<li><strong>Useful With Caveats:</strong> Bonsai or HoneyBook for end-to-end client management — useful if you want one tool, costlier than piecing tools together.</li>
<li><strong>Mostly Theater:</strong> AI "client onboarding agents." Onboarding is relationship-building. Automate the <em>reminders</em> and <em>templates</em>; do the relationship work yourself.</li>
</ul>
<hr>
<h3>Step 4.2 — Delivery SOP</h3>
<p><strong>Produces:</strong> A documented, repeatable process for delivering the actual service, from start of engagement to final deliverable to client offboarding.</p>
<p><strong>Input:</strong> Step 4.1 onboarding output. Your delivery method from prior work.</p>
<p><strong>How to do it:</strong> Document each phase of delivery. Templates for each artifact you produce. Quality checklists. Internal review steps. Time-tracking convention. Client communication touchpoints. For technical work (forensic engineering, expert witness reports), include the credentialing-and-citation discipline that protects your work product from challenge.</p>
<p><strong>Done-when criteria:</strong> A new engagement of the same type as a prior engagement takes 30–50% less time on the second iteration than the first, because the templates and checklists carry the load.</p>
<p><strong>Common failure modes:</strong> No quality checklist (every deliverable is bespoke and inconsistent). No time tracking (you discover after-the-fact you priced wrong). No internal review step (errors ship to client).</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Notion or Confluence for SOP storage. Toggl or Harvest for time tracking. Claude/ChatGPT for first-draft generation of report sections that have known patterns.</li>
<li><strong>Useful With Caveats:</strong> Tana, Reflect, Mem for AI-assisted note-taking. Genuinely useful for knowledge capture across many engagements. Learning curve is real.</li>
<li><strong>Mostly Theater:</strong> AI tools that promise to "automate your delivery." If your service is high-ticket, the delivery is the value. Don't automate the value.</li>
</ul>
<hr>
<h3>Step 4.3 — Knowledge Management</h3>
<p><strong>Produces:</strong> A growing internal library of every successful artifact (winning emails, approved report sections, effective objection responses, sanitized case examples) organized for fast retrieval and reuse.</p>
<p><strong>Input:</strong> Every client engagement, ongoing.</p>
<p><strong>How to do it:</strong> After each engagement, spend 30 minutes capturing what worked. Tag it. File it. Make it findable. Within 12 months you have a "winners library" that compounds — each new engagement starts 60% complete because templates exist.</p>
<p><strong>Done-when criteria:</strong> When starting any new artifact, you can find at least one prior version to start from in under 60 seconds.</p>
<p><strong>Common failure modes:</strong> Capturing nothing (everything is rebuilt from scratch). Capturing everything (the library is too big to navigate). No tagging convention.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Notion or Obsidian. Tana for advanced relational tagging. Search-friendly file naming.</li>
<li><strong>Useful With Caveats:</strong> Mem.ai, Reflect — AI-native note systems. Promising; learning curve and lock-in risk.</li>
</ul>
<hr>
<h3>Step 4.4 — Tech Stack Hygiene</h3>
<p><strong>Produces:</strong> A documented inventory of every tool you use, what it does, what it costs, who has access, what data it holds, and when it's reviewed for replacement or cancellation.</p>
<p><strong>Input:</strong> All your existing subscriptions and tools.</p>
<p><strong>How to do it:</strong> One spreadsheet. Quarterly review. Cancel anything not actively used. Note any tool with sensitive client data (CRM, file storage, email infrastructure) and verify their security posture.</p>
<p><strong>Done-when criteria:</strong> No surprise charges. No forgotten tools. No "wait, where did I store that file?" moments.</p>
<p><strong>Common failure modes:</strong> Tool sprawl. Three CRMs, two email-marketing platforms, four file-storage services. Each one $30–100/month, none of them used fully.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Just a spreadsheet. Vertice or Cledara if your tool spend exceeds $2K/month and you want active SaaS management.</li>
<li><strong>Mostly Theater:</strong> "AI-driven tech stack auditors." Most professional service operators have 8–15 tools, not 80. A spreadsheet review takes an hour.</li>
</ul>
<hr>
<h2>Phase 5 — Iteration and Scale</h2>
<h3>What this phase produces</h3>
<p>Continuous learning that flows back into Phases 1–4, compounding the business's effectiveness over time. This is the only phase that has no end state.</p>
<h3>Why it matters</h3>
<p>The original document called this the "Master Loop" and described it in mythology. The real version is unglamorous: review your numbers monthly, review your buyer feedback quarterly, review your offer and positioning annually, kill what isn't working, double down on what is.</p>
<h3>Honest framing on this phase</h3>
<p>Most operators skip Phase 5 entirely. They run Phases 1–4 once, get a working business, and stop iterating. Within 18–24 months their offer is stale, their content is repetitive, their CAC is climbing, and they don't know why. Phase 5 is the boring discipline that prevents this.</p>
<hr>
<h3>Step 5.1 — Monthly Metrics Review</h3>
<p><strong>Produces:</strong> A one-page dashboard reviewed once per month showing the metrics that matter for your business.</p>
<p><strong>Input:</strong> Data from your CRM, your email tool, your accounting, your time-tracking.</p>
<p><strong>How to do it:</strong> Track only the metrics you can actually act on. For most professional service operators that's: number of conversations started, number of qualified opportunities, number closed, average deal value, lifetime value, CAC, hours per engagement, revenue per hour. Eight numbers. Review monthly. Note trends.</p>
<p><strong>Done-when criteria:</strong> First Monday of every month, the dashboard is updated, you've spent 30 minutes reviewing it, you've decided one thing to change based on what it says.</p>
<p><strong>Common failure modes:</strong> Tracking 40 metrics (paralysis). Tracking vanity metrics (LinkedIn impressions). Reviewing the dashboard but never changing anything based on it.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Google Sheets. Notion databases. HubSpot or Pipedrive reports. Stripe dashboard for revenue.</li>
<li><strong>Mostly Theater:</strong> "AI-powered analytics dashboards" with 50 widgets and no actionable insight.</li>
</ul>
<hr>
<h3>Step 5.2 — Quarterly Buyer Feedback</h3>
<p><strong>Produces:</strong> Direct conversation with at least 5 recent clients each quarter, capturing what worked, what didn't, what they'd change, and what they'd buy next.</p>
<p><strong>Input:</strong> Your client list.</p>
<p><strong>How to do it:</strong> Schedule four 30-minute calls per quarter with recent clients. Open-ended questions. Record (with permission). Capture verbatim quotes. Look for patterns across calls.</p>
<p><strong>Done-when criteria:</strong> Every quarter, you have new buyer language and new insights flowing back into your offer, content, and SOPs.</p>
<p><strong>Common failure modes:</strong> Skipping these calls because they feel awkward to ask for. Asking only people who liked you (selection bias). Hearing feedback and not acting on it.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Otter.ai, Fathom, Granola for transcription. Claude/ChatGPT to synthesize themes across transcripts.</li>
</ul>
<hr>
<h3>Step 5.3 — A/B Testing (Earned)</h3>
<p><strong>Produces:</strong> Continuous optimization of your highest-volume marketing assets — sales page, lead magnet, email subject lines, ad creative — based on real conversion data.</p>
<p><strong>Input:</strong> Sufficient traffic volume to actually have statistical significance. For most professional service operators this means 1,000+ page visits per month per asset. Below that, A/B testing is theater.</p>
<p><strong>How to do it:</strong> Test one variable at a time. Define hypothesis upfront. Run until significance (or 4 weeks max). Document the result. Apply the winner. Move to the next test.</p>
<p><strong>Done-when criteria:</strong> Each high-volume asset has been through at least 4 deliberate test cycles per year.</p>
<p><strong>Common failure modes:</strong> Testing without enough traffic (you'll get random noise). Testing too many variables at once. Calling a test winner before it reaches significance. Forgetting which variant won and why.</p>
<p><strong>AI/tool layer:</strong></p>
<ul>
<li><strong>Real:</strong> Native A/B in your email tool, ad platform, and CMS (most have it built-in). VWO, Optimizely if you have real volume.</li>
<li><strong>Mostly Theater:</strong> AI-driven "auto-optimization." Useful at scale (Meta, Google ads platforms run their own); the third-party "AI testing agents" mostly recreate functionality the platforms already have.</li>
</ul>
<hr>
<h3>Step 5.4 — Offer and Positioning Refresh</h3>
<p><strong>Produces:</strong> Annual review of your core offer, positioning, pricing, and target buyer. Either confirmation that it's still right, or deliberate evolution.</p>
<p><strong>Input:</strong> Phase 5 metrics. Quarterly buyer feedback. Competitive landscape changes.</p>
<p><strong>How to do it:</strong> Once a year, block a full day. Review your Phase 1 documents. Are they still accurate? Has the buyer pain shifted? Has your delivery capability evolved? Is your pricing still right? Decide what to keep, what to evolve, what to retire.</p>
<p><strong>Done-when criteria:</strong> End of each year, you have an explicit decision: "this is still the offer for next year" or "here is what changes."</p>
<p><strong>Common failure modes:</strong> Skipping the annual review. Refreshing the offer without buyer feedback to support it. Refreshing for vanity reasons (you got bored) instead of strategic ones.</p>
<hr>
<h3>Step 5.5 — Scale Decision</h3>
<p><strong>Produces:</strong> A deliberate choice about whether to scale vertically (more clients in same niche), horizontally (same offer in adjacent niches), or stay solo.</p>
<p><strong>Input:</strong> 18+ months of operating data. Honest self-assessment of what you actually want.</p>
<p><strong>How to do it:</strong> This decision is more about you than about the business. Some operators want to stay a solo expert with high margins and short hours. Some want to build a firm. Both are legitimate. The mistake is drifting into one without choosing.</p>
<p>If scaling vertically: hire associate practitioners, document delivery extensively, develop training for them, plan for quality control. If scaling horizontally: pilot the new niche before committing, treat it as Phase 1 again from scratch. If staying solo: raise prices.</p>
<p><strong>Done-when criteria:</strong> Explicit written decision with criteria for revisiting.</p>
<p><strong>Common failure modes:</strong> Drifting into scaling because it sounds like success. Hiring before SOPs are documented (chaos compounds). Hiring before you've explicitly chosen what role you want.</p>
<hr>
<h2>The Feedback Loops</h2>
<p>The original document called this the "Master Loop." Here are the actual loops, named honestly:</p>
<p><strong>Phase 5.1 metrics → Phase 1.2 pain doc.</strong> When your conversation rate or close rate drops, the message has stopped resonating. The buyer's pain has shifted. Re-do pain discovery.</p>
<p><strong>Phase 5.2 buyer feedback → Phase 2.3 lead magnet, Phase 2.4 sales page, Phase 1.3 offer.</strong> Buyer language captured in feedback calls flows directly into asset copy. Their objections become your FAQ. Their unmet needs become your next offer.</p>
<p><strong>Phase 5.3 A/B test results → Phase 2 assets, Phase 3.4 content cadence.</strong> Winning variants get codified. Losing patterns get retired.</p>
<p><strong>Phase 4.3 knowledge library → Phase 3.4 content, Phase 2.3 lead magnet.</strong> Your sanitized case examples become content. Your most-asked questions become lead magnets. The library compounds the marketing.</p>
<p><strong>Phase 5.4 offer refresh → all of Phase 1.</strong> Once a year, the entire foundation gets revisited.</p>
<p>These loops are not magic. They are scheduled review meetings with yourself. The discipline is in keeping them on the calendar.</p>
<hr>
<h2>Closing — What Makes This Work</h2>
<p>This document gives you structure. It does not give you discipline. The structure is portable; discipline is not. The operators who will get value from this skeleton are the ones who:</p>
<ul>
<li>Walk Phase 1 fully before launching, even when it feels slow</li>
<li>Set kill criteria and honor them</li>
<li>Track what's working and what isn't, monthly</li>
<li>Talk to actual buyers, quarterly</li>
<li>Refresh the foundation, annually</li>
<li>Resist the temptation to add tools, agents, and complexity in place of doing the work</li>
</ul>
<p>The "agentic" layer in 2026 is real for narrow jobs. It is mostly theater for unbounded creative or strategic work. AI saves 30–50% of time on editing, formatting, and synthesis tasks. It does not save time on thinking, on listening to buyers, on building credibility, or on the relationship work that actually closes high-ticket professional service engagements. Operators who try to substitute AI for those things produce volume without conversion.</p>
<h3>The Identity Commoditization risk</h3>
<p>This is the meta-risk that runs across every phase of this document, and it deserves to be named explicitly.</p>
<p><strong>The mechanism:</strong> When ten operators in your niche all use the same AI tools with similar prompts to produce content, outreach, lead magnets, and proposals, their output converges. Buyers can tell. Not always consciously — sometimes just as a vague sense that "everyone sounds the same now." When that happens at scale, the entire niche commoditizes. Buyers stop trying to identify the best provider and shop on price. Your price floor collapses. Your margin compresses. The work you trained for thirty years to do gets valued like a generic service.</p>
<p><strong>Why this is the central 2026 risk for high-ticket professional services:</strong> Your buyer is paying premium prices because you bring something specific — credentials, judgment, a way of seeing problems, a track record. AI commodifies the wrappers around those things (your emails, your posts, your reports) faster than it commodifies the substance. If the wrappers all look the same, buyers default to lowest price because they cannot tell the substance apart from outside.</p>
<p><strong>How to defend against it:</strong></p>
<ul>
<li><strong>Use AI for editing and synthesis, never for thinking.</strong> Draft your post yourself, then have AI tighten it. Not the other way around.</li>
<li><strong>Feed your AI tools your specific intellectual property</strong> — your prior reports, your characteristic phrases, your case examples, your point of view. A model with no context about you produces generic output. A model fed your archive produces output in your voice. This is what the Knowledge Management library in Step 4.3 is actually for.</li>
<li><strong>Reserve the highest-stakes artifacts for hand-craftsmanship.</strong> Sales pages, expert reports, depositions, anything a buyer reads carefully — these get written by you, not by AI. Use AI to refine, never to generate.</li>
<li><strong>Make your content carry signals only you can produce.</strong> Specific case numbers from your prior work. A photograph from a job site. A technical diagram in your hand. A recording of your voice. Anything that proves a human did the work.</li>
<li><strong>Audit yourself quarterly.</strong> Read three of your recent outreach messages aloud. Read three competitor outreach messages aloud. If you can't immediately tell which is yours, you have a problem.</li>
</ul>
<p>The operators who win in 2026 use AI as a force multiplier on a distinctive practice. The operators who lose use AI as a substitute for one. Same tools, opposite outcomes.</p>
<p>The work is the work. This document tells you what the work is and in what order. The rest is on you.</p>
<hr>
<h2>Where the existing RISER artifacts fit</h2>
<table><thead><tr><th>Phase / Step</th><th>RISER artifact</th></tr></thead><tbody><tr><td>1.2 Pain Discovery</td><td>MVO Decision Engine (Gates 00½, 01) · Pain Discovery Tool Catalog (41 tools)</td></tr><tr><td>1.3 Offer Hypothesis</td><td>MVO Decision Engine (Gates 04–06) · Marketing Plan Generator (section 08 of every plan)</td></tr><tr><td>1.4 MVP Definition</td><td>MVO Decision Engine (full 17-gate sequence)</td></tr><tr><td>2.1 Competitive Intel</td><td>MVO Decision Engine (Gate 03 Competitive Moat)</td></tr><tr><td>2.3 Lead Magnet</td><td>Marketing Plan Generator (section 05 of every plan)</td></tr><tr><td>3.1 Warm Outreach</td><td>Marketing Plan Generator (section 09 outreach scripts)</td></tr><tr><td>3.2 Dream 100</td><td>Client Acquisition Catalog (Dream 100 template, 39-tool stack)</td></tr><tr><td>3.3 Outreach Cadence</td><td>Marketing Plan Generator (section 09) · Client Acquisition Catalog (Channel 6 outreach + CRM)</td></tr><tr><td>3.4 Content Distribution</td><td>Marketing Plan Generator (section 03 Where They Gather, section 04 Channel Priority, sections 06+07 hook/headline/cadence)</td></tr></tbody></table>
<p>The widgets generate the artifacts. This document tells you when and why to use them. Together they form a working operator's plan, not an unbeatable mastermind 2026 unstoppable scaling agentic essay.</p>
<p>The work is the work.</p>
<p><strong>Captain out.</strong></p>
</body>
</html>Original asset: RISER-Operators-Flow.md
# RISER Operator's Flow
## A structural skeleton for building, marketing, and scaling a high-ticket professional services business — phase by phase, step by step, with the actual work named honestly.
---
**Version 1 · April 2026 · Captain's Logic Operating Doctrine**
This document is the spine. It tells you what stages exist, what order they go in, what each one produces, what could go wrong, and where the existing RISER widgets fit. Use it as a checklist on any given Tuesday — "I'm at Phase 2, Step 3, here is the next concrete deliverable" — not as a vision document to read once and forget.
The framework covers five phases, eighteen steps, and one continuous feedback loop. Phases roughly correspond to weeks 1–4 (Phase 1), 5–8 (Phase 2), 9–12 (Phase 3), and 13+ (Phases 4 and 5, which are continuous from launch onward). A solo operator can complete Phase 1 in seven days if they are disciplined; most take longer because Phase 1 is where the real thinking happens and skipping it makes everything downstream harder.
Three honest framings before you start:
**This is not a get-rich-quick plan.** It is a working operator's plan. The fastest result you will see from doing this correctly is a real client conversation in week three. The first paying client typically lands in week six to ten. Operators who expect faster usually skipped Phase 1.
**Most "AI agents" mentioned in marketing-stack content are aspirational.** The agent layer in 2026 is mostly real for narrow, well-bounded jobs: drafting first replies a human approves, pulling structured data from PDFs, summarizing call transcripts, routing leads to the right sequence. It is mostly hype for unbounded creative or strategic work. Throughout this document, tools are graded **Real**, **Useful With Caveats**, or **Mostly Theater**. Use the Real ones, treat the second category with measurement, skip the third.
**The risks that will actually bite an operator are not the ones marketing content discusses.** Reddit API access can change overnight (GummySearch shut down in November 2025 when Reddit denied API access). LinkedIn's automation crackdowns kill outreach tools regularly. Email deliverability collapses under cold-volume sends. State bar associations and professional licensing boards have rules about AI-personalized outreach that can endanger your license if violated. These risks are flagged inside each step where they apply.
---
## Phase 1 — Foundation
### What this phase produces
A validated business hypothesis you can defend with evidence, an offer that solves a pain people actually have, and a minimum viable version you can sell next week. Not a finished product. Not a polished brand. A defensible *bet* with a known kill criterion.
### Why it matters
Operators who skip this phase end up in Phase 3 (traffic generation) trying to drive volume to a thing nobody clearly wants. They compensate with bigger ad spend, more outreach, more content. None of it works because the offer is wrong. Phase 1 is unglamorous and slow. It is also the highest-leverage week of the entire build.
---
### Step 1.1 — Idea Capture
**Produces:** A one-paragraph statement of the business or service idea, who you think it serves, and what specific problem you think it solves.
**Input:** Your existing skills, prior work, professional credentials, and the rough hypothesis you're entering with.
**How to do it:** Write the paragraph by hand on paper. Two hundred words. Include the buyer (one sentence), the problem (one sentence), the solution (one sentence), the price tier (one sentence), and what makes you specifically the right person to deliver it (one sentence). The constraint forces clarity.
**Done-when criteria:** A literate friend can read the paragraph once and explain back to you what your business does, who it's for, and why someone would pay you. If they can't, rewrite.
**Common failure modes:** Writing in jargon. Listing features instead of outcomes. Defining the buyer too broadly ("small business owners" instead of "construction defect attorneys at mid-sized firms in Arizona"). Hiding behind credentials instead of describing what you actually do for clients.
**AI/tool layer:** None needed at this step. **Mostly Theater** if you're using AI to "validate" the idea here — the model will tell you almost any idea sounds promising. Save the validation work for Step 1.3.
**Iteration trigger:** Phase 5 customer feedback that contradicts your stated buyer or problem. Rewrite this paragraph quarterly.
---
### Step 1.2 — Pain Discovery
**Produces:** A document with three to five real pain points your buyer experiences, written in their own language, with evidence sources. Not pain you assume they have. Pain they say out loud.
**Input:** The Step 1.1 paragraph. Your hypothesis about who the buyer is.
**How to do it:** Three parallel research tracks, run for one week:
1. **Direct conversations.** Five to ten phone or video calls with people in your target buyer category. Not pitches. Listening tours. Questions: What's the most frustrating part of [problem area]? When did this last cause a real problem? What did you try? What worked? What didn't?
2. **Public language mining.** Read what your buyers post and ask in places they gather: LinkedIn posts and comments, association forums, niche Slack groups, industry-specific subreddits if any exist, Quora answers in their domain. Copy verbatim phrases into a document.
3. **Tool-assisted scanning.** Use the RISER Pain Discovery Tool Catalog — specifically the Reddit pain mining tools, audience intelligence tools (SparkToro), and VOC synthesis tools — to surface language patterns at scale.
**Sort what you find into two buckets — burning vs chronic.** This distinction is the most useful prioritization tool in pain discovery. **Burning pain** is active crisis: a lawsuit was filed last week, a deposition is in 14 days, a client just sued, a deadline is tomorrow, a regulator just sent a notice. Burning pain drives buying *this week*. **Chronic pain** is the dull background ache: communication is messy, vendor management is annoying, paperwork takes too long. Chronic pain is real but rarely triggers a buying decision on its own — it needs a triggering event to become burning.
For high-ticket professional services, your offer must address burning pain. Operators who build offers for chronic pain spend years marketing to people who agree there's a problem but never buy. Tag every pain point in your discovery doc as B (burning) or C (chronic). If your top three pains are all C, your offer or your avatar is wrong.
**Done-when criteria:** You have at least 20 verbatim quotes from real buyers describing pain in their own words, organized into 3–5 themes, each tagged burning or chronic. At least two of your top themes are burning. You can show a friend the quotes (with sources) and they can independently identify the themes you found and the burning/chronic tag.
**Common failure modes:** Using your own words instead of the buyer's. Treating one Reddit thread as evidence. Skipping the direct conversations because they're hard to schedule (this is the single biggest stall point). Picking only pain points that flatter your existing solution.
**AI/tool layer:**
- **Real:** Otter.ai or Fathom for transcribing buyer conversations. ChatGPT/Claude for synthesizing themes across transcripts. SparkToro for finding where buyers gather.
- **Useful With Caveats:** PainOnSocial, PainPointy for surfacing language patterns. They produce useful raw material but the categorization needs human review — the AI is wrong about pain intensity ranking maybe one third of the time.
- **Mostly Theater:** Any tool claiming to "automatically generate buyer personas" without you talking to a single buyer. The output looks plausible. It will not survive contact with reality.
**Iteration trigger:** Quarterly. Buyer pain shifts as their context shifts (regulatory changes, economic conditions, technology shifts). The doc you wrote in Q1 needs revision by Q3.
**Existing RISER artifact:** The **MVO Decision Engine widget** (Gate 00½ Pain Discovery, Gate 01 Hungry Avatar). The **Pain Discovery Tool Catalog** lists the 41 tools that fit this work and their honest tradeoffs.
---
### Step 1.3 — Offer Hypothesis
**Produces:** A specific named offer — what you sell, what it costs, what the buyer gets, what they walk away from the call with — that maps directly to the pain you found.
**Input:** Step 1.2 pain document. Your skills inventory.
**How to do it:** Write the offer in one page, using Hormozi's value-equation structure. Name the dream outcome (in the buyer's words). Name the perceived likelihood (your proof — credentials, prior work, sample deliverable). Name the time delay (how long until they get the result). Name the effort/sacrifice (what they have to do versus what you do). The offer wins or loses on whether (Dream × Likelihood) ÷ (Time × Effort) is high.
Decide on a named mechanism. Not "I do forensic engineering" — "The 14-Day VRF Failure Forensic Audit." Specific deliverable, specific timeframe, specific outcome.
Decide on a kill criterion before launch. *"If I cannot get one paying engagement at this price within 60 days of starting active outreach, I will reduce price by 25% or restructure the offer."* Write the criterion down. Date it. Keep it visible.
**Done-when criteria:** You can describe the offer in 30 seconds, name the price, name the deliverable timeline, name your kill criterion, and a literate friend can repeat it back accurately.
**Common failure modes:** Pricing too low because you're nervous (this is universal — your first instinct on price is usually 40–60% of what the market pays). Naming the offer in your own jargon instead of the buyer's. Skipping the kill criterion because writing it feels like admitting you might fail. The kill criterion is the *whole point* — it converts a vague hope into a falsifiable bet.
**AI/tool layer:**
- **Real:** Claude or ChatGPT to pressure-test offer language by simulating buyer objections. Wynter ($540+/test) for actual ICP message testing if the price tier justifies it.
- **Mostly Theater:** Any "AI offer generator" that produces a finished offer without you doing the pain research first. The output is generic.
**Iteration trigger:** First five buyer conversations. If buyers don't immediately understand the offer or push back hard on price, restructure.
**Existing RISER artifact:** The **MVO Decision Engine** Gate 04 Solution Sketch, Gate 05 Offer, Gate 06 Pricing. The **Marketing Plan Generator** outputs a complete offer angle in section 08 of every plan it produces.
---
### Step 1.4 — MVP / Service Definition
**Produces:** The actual *thing* you will deliver. For services this is a scope-of-work template. For software this is a working prototype. For productized services this is a defined deliverable package.
**Input:** Step 1.3 offer document.
**How to do it:** Write the scope of work in one page. What's included. What's not included. Timeline. Communication cadence. Revisions. Out-of-scope handling. Payment terms. For a service business, this is also where you decide what you will template, what you will custom-build, and what you will refuse to do.
For productized services (most professional services should be productized): name the package, list the exact deliverables, set the price, set the timeline, define what makes a customer eligible to buy.
**Done-when criteria:** You have an SOW you could send to a buyer this afternoon. It defines scope so clearly that you know in advance what you're delivering and so does the buyer.
**Common failure modes:** Vague scope language ("ongoing strategic guidance") that lets buyers expand the work without paying more. Missing the "out of scope" section. No defined revision limit. Promising deliverables you haven't actually built a process for.
**AI/tool layer:**
- **Real:** Claude or ChatGPT to draft the SOW from a checklist. PandaDoc or Bonsai for SOW signing infrastructure (free or low cost).
- **Mostly Theater:** Building a "Product Architect Agent" workflow before you've delivered the service to one human. Map the actual delivery from one real engagement first.
**Iteration trigger:** After the first three engagements. You will discover scope leaks and SOW gaps you didn't anticipate. Update the template.
---
## Phase 2 — Positioning and Asset Build
### What this phase produces
The artifacts a buyer encounters before they buy from you. Brand, message, lead magnet, sales page, proof. Not all of them at once — the minimum credible set.
### Why it matters
Phase 1 gave you a defensible offer. Phase 2 gives buyers a way to evaluate you without talking to you first. For high-ticket professional services, where buyers research at 11pm before deciding who to contact, the asset layer is what gets you on the consideration list. Skip it and you're invisible.
### Honest framing on this phase
You don't need a $5,000 logo. You don't need a 12-page brand bible. You don't need a hand-photographed headshot. You need the minimum credible set, deployed within a week, and you need to spend the saved time on Phase 3 outreach. Operators stall here because polishing assets feels productive. It is not. It is procrastination dressed as work.
---
### Step 2.1 — Competitive Intelligence
**Produces:** A one-page comparison matrix of three to five direct competitors — their offer, their pricing, their positioning, their lead magnet, their hook, what's working for them, what's missing.
**Input:** Phase 1 work. Knowledge of who else serves your buyer.
**How to do it:** List five competitors. Open each one's website, lead magnet (download it), pricing page (if visible), LinkedIn, and any case studies. Fill in the matrix. Note what you can't easily improve on (their credentials, their tenure) and what you can (their positioning, their offer specificity, their pain language match).
**Done-when criteria:** You can name in one sentence per competitor what's strong about their positioning and what's weak. You have an explicit "we're different from them because..." for each.
**Common failure modes:** Researching too many competitors (five is enough; ten is hiding from the work). Fixating on what they do better instead of what they leave on the table. Copying their offer instead of differentiating from it.
**AI/tool layer:**
- **Real:** Built With or SimilarWeb for tech-stack and traffic visibility on competitor sites (free or low-tier). Wayback Machine to see how their positioning has evolved.
- **Useful With Caveats:** Apify, Bright Data for scraping if you need depth. Compliance and TOS questions matter — read them.
- **Mostly Theater:** "AI-driven competitive intelligence agents" that promise daily monitoring. They produce dashboards. Dashboards are not insight.
**Iteration trigger:** Quarterly. Competitor offers and positioning shift; your matrix needs refresh.
---
### Step 2.2 — Brand & Asset Minimum Viable Set
**Produces:** A logo (or wordmark), one professional headshot, a one-page bio, a defined color palette, and a one-page service overview document. That's the minimum. Nothing more until you've closed five clients.
**Input:** Phase 1 work. Your existing materials.
**How to do it:** Use Canva or Figma. Pay $200–$500 for a wordmark on Fiverr or 99designs if you want polish. Get a real headshot — phone-camera selfie quality is fine for LinkedIn but not for an expert witness directory listing. Write the one-page bio in third person, including your specific credentials, three concrete prior accomplishments (sanitized if needed), and a clear statement of who you serve.
**Done-when criteria:** You have a presentable LinkedIn profile, a presentable directory listing draft, and a service overview PDF you can email to a prospect.
**Common failure modes:** Spending three weeks on a logo. Hiring a brand strategist before you have buyers. Writing the bio in language that sounds like every other consultant's bio.
**AI/tool layer:**
- **Real:** Canva ($15/mo) for fast asset production. Claude/ChatGPT to draft and polish the bio. Looka for $50 wordmark generation if you can't decide what you want.
- **Mostly Theater:** AI-generated "brand identity systems." Looks impressive, costs significant time, doesn't move buyers. Save brand investment for after you have customer feedback.
---
### Step 2.3 — Lead Magnet (Gift First)
**Produces:** A specific, valuable, narrow asset that solves one micro-problem for your buyer in exchange for their email or a 15-minute call. Not a generic ebook. A diagnostic checklist, a calculator, a contract review template, a five-page "how to evaluate X" guide.
**Input:** Phase 1 pain doc. Knowledge of buyer's specific decision moments.
**How to do it:** Pick the buyer's most concrete sub-pain. Build the asset that solves it. Constraint: this asset should be useful even if the buyer never works with you. That's what triggers reciprocity (Cialdini). A bait-and-switch lead magnet that turns into a pitch deck does not work and damages trust.
**Done-when criteria:** A buyer who downloads this asset finds it genuinely useful and would tell a colleague about it. You've tested this with two real buyers before launch.
**Common failure modes:** Generic "10 tips for X" content. Disguised pitch decks. Asset is too long (40 pages = won't be read) or too short (one tip = not worth the email).
**AI/tool layer:**
- **Real:** Claude/ChatGPT to draft the asset content. Canva or Figma for layout. ConvertKit, Beehiiv, or Mailchimp for email delivery infrastructure.
- **Mostly Theater:** "AI lead magnet generators" that produce generic content with no specific buyer in mind.
**Existing RISER artifact:** The **Marketing Plan Generator** generates a specific lead-magnet recommendation for any profession+avatar combination as section 05 of every plan.
---
### Step 2.4 — Sales Page / Service Page
**Produces:** A single page on your website (or a one-page Notion/Carrd if you're moving fast) that names the buyer, the pain, the offer, the proof, and the next step. Not a homepage. A targeted page for the specific avatar you're going after.
**Input:** All prior Phase 1 and 2 work.
**How to do it:** Use the long-form direct response structure: hook → problem → why-other-things-fail → mechanism → proof → offer → bonuses (only if real) → guarantee or risk reversal → CTA. Write it once, in their voice. Word count: 800–1,500 for a high-ticket service.
**Done-when criteria:** A cold buyer can read the page and either qualify themselves in (book a call) or qualify out (close the tab). It does both jobs without making them work.
**Common failure modes:** Writing about yourself instead of the buyer. Burying the offer below the fold. Vague CTAs ("Get in touch"). No social proof. No risk reversal.
**AI/tool layer:**
- **Real:** Webflow, Carrd, Framer for fast page hosting. Claude/ChatGPT for copy iteration (it's good at this when you give it Phase 1 buyer language).
- **Useful With Caveats:** Hyros, Triple Whale for tracking — only if your spend justifies it.
- **Mostly Theater:** "AI website builders" that promise full sites in one click. Outputs are generic. Use a template instead.
---
## Phase 3 — Acquisition
### What this phase produces
Real buyer conversations. Not awareness. Not "thought leadership." Conversations with named humans who could pay you, where they say yes, no, or "tell me more."
### Why it matters
Everything in Phases 1 and 2 is unfalsifiable until Phase 3 puts it in front of buyers. Operators who linger in 1 and 2 are usually avoiding the discomfort of 3. The cure is to launch publicly before you feel ready, then let real feedback drive the iterations.
### The order matters
For high-ticket professional services, run these channels in this order. Don't run them in parallel until each is proven.
1. **Warm outreach** to your existing network (week one)
2. **Dream 100 cold outreach** to named humans in your target market (week two)
3. **Content distribution** on the platforms your buyers actually use (ongoing from week one)
4. **Paid ads** only after channels 1–3 produce signal
---
### Step 3.1 — Warm Network Outreach
**Produces:** 5–15 conversations with people who already know you, plus a list of 20–50 introductions they could make to people you don't know.
**Input:** Phase 1 and 2 assets. Your contact list.
**How to do it:** Write a 4–6 sentence note. Tell them what you're doing now. Ask if they know anyone in your target buyer category. Offer to do something useful for them in return. Send it to everyone you've worked with in the last decade. Include the lead magnet as a gift.
**Done-when criteria:** All notes sent within seven days. Track replies. Track who introduces you. Follow up.
**Common failure modes:** Hiding from this step because asking former colleagues feels needy. (It is not. It is normal professional behavior.) Not having anything specific to ask for. Asking for "any help" instead of "an introduction to anyone you know who handles construction defect cases."
**AI/tool layer:**
- **Real:** Your existing inbox and LinkedIn. Claude/ChatGPT to personalize each outreach note from a base template. Notion or a simple spreadsheet to track responses.
- **Mostly Theater:** Automating warm outreach. The whole point is the personal note.
**Existing RISER artifact:** The **Marketing Plan Generator** outputs a LinkedIn first-touch template, a cold-email template, and a community-reply template in section 09 of every plan it produces. Adapt those for warm context.
---
### Step 3.2 — Dream 100 List Building
**Produces:** A spreadsheet of 100 named humans in your target buyer category — name, title, firm, geography, contact route, and one specific reason this person fits.
**Input:** Phase 1 buyer definition.
**How to do it:** Use the segment breakdown from the **Client Acquisition Catalog Dream 100 template** (or build your own equivalent). For a forensic engineer that's roughly: 25 construction defect attorneys + 25 insurance defense attorneys + 15 subrogation managers + 15 mechanical contractor GCs + 10 property management firms + 10 technical committee chairs.
For each, find them on LinkedIn (Sales Navigator helps), record their firm, find their email (Apollo, Hunter, or guessable patterns), record one specific thing they do that's relevant. The "one specific thing" prevents your outreach from being generic.
**Done-when criteria:** 100 names. Real ones. Verified contact info for at least 70 of them. Notes column filled in for at least 50.
**Common failure modes:** Listing firm names instead of human names. Stopping at 30 because the list is "good enough" (it isn't — Dream 100 works because of compounding, not because the first 30 are special). Skipping the "one specific thing" column.
**AI/tool layer:**
- **Real:** LinkedIn Sales Navigator ($99/mo). Apollo (free tier or $59/mo). PACER ($0.10/page) for federal court records to identify attorneys handling specific case types. Justia for free legal directory search. A spreadsheet (Google Sheets is fine).
- **Useful With Caveats:** Clay ($149+/mo) if you want enrichment-and-personalization-at-scale workflow. Steep learning curve. Probably overkill until you have 30+ confirmed buyers in pipeline.
- **Mostly Theater:** "AI SDR agents" that build the list and personalize the outreach for you autonomously. They produce volume. Volume is not the bottleneck. Specificity is.
**Existing RISER artifact:** The **Client Acquisition Catalog** has the full tool stack with verified pricing, organized by channel. The Dream 100 template segment-counts are inside the catalog.
**Risks worth flagging:** LinkedIn TOS prohibits most automation. Sales Navigator usage is fine. Tools that auto-message people through LinkedIn risk account suspension and have killed many an outreach plan.
---
### Step 3.3 — Dream 100 Outreach Cadence
**Produces:** First-touch messages sent to all 100 people, follow-up sequence executed, conversations started.
**Input:** Step 3.2 list. Step 2.3 lead magnet.
**How to do it:** Six-touch cadence over 8 weeks. Mix LinkedIn, email, and (where appropriate) phone. Each touch is short, specific, value-first. Open with the "one specific thing" you noted. Reference a real signal — they posted something, their firm just took on a relevant case, an industry event happened. Lead-magnet offer can come on touch 2 or 3, never touch 1.
Run the cadence as a deliberate practice. 15 outreach touches per workday is the right volume for a solo professional. More than that and quality drops. Less than that and momentum dies.
**Done-when criteria:** All 100 people have received at least four touches across 8 weeks. Conversation rate of 8–15% (8–15 named people responded with interest) is normal. Less than 5% means the message is wrong; rewrite. More than 25% means the targeting got lucky; verify before scaling.
**Common failure modes:** Sending touch 1 to all 100 then giving up when 92 ignore you. (The compounding is in touches 3–6.) Generic copy that ignores the "one specific thing." Pitching the offer on touch 1.
**AI/tool layer:**
- **Real:** Smartlead or Instantly ($39–94/mo) for cold-email infrastructure (deliverability matters). HubSpot CRM Free or Pipedrive ($25/seat) for tracking touches. Calendly for booking the calls that result.
- **Useful With Caveats:** Lemlist ($59+/mo) — premium worth it only if you actually use the personalization features. Otherwise overpriced versus Smartlead.
- **Mostly Theater:** Cold-outreach AI that generates "100% personalized" messages. The personalization is shallow. Buyers can tell. Better to send fewer messages with real personalization than more with fake.
**Risks:** Email deliverability. Sending 100 cold emails from a fresh domain will land you in spam folders. Use a separate sending domain, warm it up over 4–6 weeks, follow SPF/DKIM/DMARC standards. Smartlead handles this; sending from your business Gmail does not.
For licensed professionals: state bar associations and professional licensing boards have rules about solicitation. Consult yours before launching cold outreach. Some states prohibit certain cold-contact patterns for attorneys, doctors, and engineers in regulated practice.
---
### Step 3.4 — Content Distribution Cadence
**Produces:** A consistent, multi-month flow of content on the platform(s) your buyers actually inhabit, building credibility while warm and Dream 100 outreach runs in parallel.
**Input:** Phase 1 pain doc. Phase 2 positioning. Knowledge of where buyers actually gather.
**How to do it:** Pick *one* primary platform. For high-ticket professional services in 2026, that's almost always LinkedIn. Possibly an industry-specific publication (ABA Journal, ASHRAE Journal, etc.) for the highest-credentialing-value plays. Don't multi-platform until the primary one is producing.
The content cadence framework that works:
- **Monday — Pain post.** A real piece of buyer pain, observed or quoted, with your take. 150–300 words.
- **Wednesday — Mechanism post.** A specific technical observation or framework, in your area of expertise. 200–400 words. This is the "I know things" post.
- **Friday — Case study or proof.** A sanitized story from your work, or a public case dissected. 250–500 words.
Three posts a week. Same days. Same time. For 12 weeks before evaluating. The discipline matters more than the volume — buyers notice consistency over six months.
**Done-when criteria:** 12 weeks of consistent posting. Engagement metrics matter less than reach growth and the qualitative feedback that comes in (DMs, comments, lurkers reaching out). The right buyers reading you silently for 8 weeks before contacting you is the dominant pattern.
**Common failure modes:** Multi-platforming too early (LinkedIn + X + Instagram + TikTok). Posting whenever you "feel inspired" instead of on cadence. Generic "thought leadership" posts that aren't grounded in real buyer pain. Stopping after three weeks because results aren't visible.
**AI/tool layer:**
- **Real:** Claude/ChatGPT to draft and refine post copy from your raw notes. Buffer or Hypefury for scheduling. Notion for content calendar.
- **Useful With Caveats:** Repurpose.io, OpusClip for converting long-form (podcast, video) into short-form social posts. Useful if you're already producing long-form. Theater if you're not.
- **Mostly Theater:** AI tools that "generate a year of content in 10 minutes." The output is generic. It does not move buyers. Worse, it identifies you as someone using AI to generate content, which actively damages credibility for high-ticket professional services. This is **Identity Commoditization** in action — see the Closing section for the full framing of why generic AI output collapses your price floor.
**The honest tradeoff:** AI can save 30–50% of your time on the *editing* and *formatting* layer. It cannot save time on the *thinking* layer. The thinking is the work. If you're using AI to skip the thinking, you're skipping the value.
---
### Step 3.5 — Paid Channels (Defer Until Earned)
**Produces:** Scaled distribution of proven content/offers, after warm and Dream 100 outreach have produced consistent close signal.
**Input:** Steps 3.1–3.4 producing measurable conversation rate, close rate, and lifetime value data. You need at least 10 closed clients before you have any business spending on paid ads.
**How to do it:** This step is deferred for most professional service operators for 6–12 months. The reason: high-ticket service buyers don't typically respond to paid ads the way e-commerce buyers do. Your CAC math has to work, and it usually doesn't until you've validated the funnel manually.
When you do enter paid: start with one platform (LinkedIn ads if your buyer is on LinkedIn; Google Search if they search for your category; Meta only if your buyer demographic is verified active there). Set a hard monthly cap. Track CAC and LTV explicitly. Cut spend the moment CAC > 0.33 × LTV.
**Done-when criteria:** Active paid channel with measurable CAC under your threshold and predictable conversion rate over a 60-day window.
**Common failure modes:** Running paid before manual outreach has validated message-market fit. Boosting LinkedIn posts (almost never worth it for high-ticket B2B). Treating paid as a substitute for organic instead of an amplifier of organic.
**AI/tool layer:**
- **Real:** Native ad platforms. Hyros or Triple Whale for tracking only if spend justifies it.
- **Mostly Theater:** "AI ad optimizer" tools that promise to manage your campaigns. The platforms' built-in optimization is now better than most third-party tools.
---
## Phase 4 — Operations and Delivery
### What this phase produces
The systems that let you deliver promised outcomes consistently, capture knowledge from every engagement, and maintain quality as volume increases. SOPs, templates, knowledge management, and the boring infrastructure that prevents the business from collapsing under its own success.
### Why it matters
Phase 3 will produce clients faster than you expect once it works. Operators without Phase 4 systems compound chaos with every new client. Within six months they're working 70-hour weeks, dropping deliverables, and the original positioning erodes.
This phase runs in parallel with Phase 3 from the moment your first client signs. Don't wait until you're overwhelmed to start.
---
### Step 4.1 — Client Onboarding SOP
**Produces:** A documented, repeatable process for taking a signed client from "yes" to "first deliverable" without anything falling through the cracks.
**Input:** Phase 1 SOW template. Your delivery process from your first three engagements.
**How to do it:** Document the process. Welcome email template. Kickoff-call agenda. Information-gathering checklist. Project-folder template. Communication-cadence agreement. Payment-collection workflow. The first time you do this it takes a day. Every time after that it saves a day.
**Done-when criteria:** A new client signs and the first 14 days run identically each time, with no email you have to write from scratch and no question you have to look up.
**Common failure modes:** Reinventing the onboarding for each client. Not having a kickoff agenda. Forgetting to invoice. Missing the information-gathering step and getting blocked mid-engagement.
**AI/tool layer:**
- **Real:** Notion or Process Street for SOP storage. Loom for recording explainer videos once and reusing them. Calendly for scheduling. PandaDoc or Bonsai for contract+invoice infrastructure.
- **Useful With Caveats:** Bonsai or HoneyBook for end-to-end client management — useful if you want one tool, costlier than piecing tools together.
- **Mostly Theater:** AI "client onboarding agents." Onboarding is relationship-building. Automate the *reminders* and *templates*; do the relationship work yourself.
---
### Step 4.2 — Delivery SOP
**Produces:** A documented, repeatable process for delivering the actual service, from start of engagement to final deliverable to client offboarding.
**Input:** Step 4.1 onboarding output. Your delivery method from prior work.
**How to do it:** Document each phase of delivery. Templates for each artifact you produce. Quality checklists. Internal review steps. Time-tracking convention. Client communication touchpoints. For technical work (forensic engineering, expert witness reports), include the credentialing-and-citation discipline that protects your work product from challenge.
**Done-when criteria:** A new engagement of the same type as a prior engagement takes 30–50% less time on the second iteration than the first, because the templates and checklists carry the load.
**Common failure modes:** No quality checklist (every deliverable is bespoke and inconsistent). No time tracking (you discover after-the-fact you priced wrong). No internal review step (errors ship to client).
**AI/tool layer:**
- **Real:** Notion or Confluence for SOP storage. Toggl or Harvest for time tracking. Claude/ChatGPT for first-draft generation of report sections that have known patterns.
- **Useful With Caveats:** Tana, Reflect, Mem for AI-assisted note-taking. Genuinely useful for knowledge capture across many engagements. Learning curve is real.
- **Mostly Theater:** AI tools that promise to "automate your delivery." If your service is high-ticket, the delivery is the value. Don't automate the value.
---
### Step 4.3 — Knowledge Management
**Produces:** A growing internal library of every successful artifact (winning emails, approved report sections, effective objection responses, sanitized case examples) organized for fast retrieval and reuse.
**Input:** Every client engagement, ongoing.
**How to do it:** After each engagement, spend 30 minutes capturing what worked. Tag it. File it. Make it findable. Within 12 months you have a "winners library" that compounds — each new engagement starts 60% complete because templates exist.
**Done-when criteria:** When starting any new artifact, you can find at least one prior version to start from in under 60 seconds.
**Common failure modes:** Capturing nothing (everything is rebuilt from scratch). Capturing everything (the library is too big to navigate). No tagging convention.
**AI/tool layer:**
- **Real:** Notion or Obsidian. Tana for advanced relational tagging. Search-friendly file naming.
- **Useful With Caveats:** Mem.ai, Reflect — AI-native note systems. Promising; learning curve and lock-in risk.
---
### Step 4.4 — Tech Stack Hygiene
**Produces:** A documented inventory of every tool you use, what it does, what it costs, who has access, what data it holds, and when it's reviewed for replacement or cancellation.
**Input:** All your existing subscriptions and tools.
**How to do it:** One spreadsheet. Quarterly review. Cancel anything not actively used. Note any tool with sensitive client data (CRM, file storage, email infrastructure) and verify their security posture.
**Done-when criteria:** No surprise charges. No forgotten tools. No "wait, where did I store that file?" moments.
**Common failure modes:** Tool sprawl. Three CRMs, two email-marketing platforms, four file-storage services. Each one $30–100/month, none of them used fully.
**AI/tool layer:**
- **Real:** Just a spreadsheet. Vertice or Cledara if your tool spend exceeds $2K/month and you want active SaaS management.
- **Mostly Theater:** "AI-driven tech stack auditors." Most professional service operators have 8–15 tools, not 80. A spreadsheet review takes an hour.
---
## Phase 5 — Iteration and Scale
### What this phase produces
Continuous learning that flows back into Phases 1–4, compounding the business's effectiveness over time. This is the only phase that has no end state.
### Why it matters
The original document called this the "Master Loop" and described it in mythology. The real version is unglamorous: review your numbers monthly, review your buyer feedback quarterly, review your offer and positioning annually, kill what isn't working, double down on what is.
### Honest framing on this phase
Most operators skip Phase 5 entirely. They run Phases 1–4 once, get a working business, and stop iterating. Within 18–24 months their offer is stale, their content is repetitive, their CAC is climbing, and they don't know why. Phase 5 is the boring discipline that prevents this.
---
### Step 5.1 — Monthly Metrics Review
**Produces:** A one-page dashboard reviewed once per month showing the metrics that matter for your business.
**Input:** Data from your CRM, your email tool, your accounting, your time-tracking.
**How to do it:** Track only the metrics you can actually act on. For most professional service operators that's: number of conversations started, number of qualified opportunities, number closed, average deal value, lifetime value, CAC, hours per engagement, revenue per hour. Eight numbers. Review monthly. Note trends.
**Done-when criteria:** First Monday of every month, the dashboard is updated, you've spent 30 minutes reviewing it, you've decided one thing to change based on what it says.
**Common failure modes:** Tracking 40 metrics (paralysis). Tracking vanity metrics (LinkedIn impressions). Reviewing the dashboard but never changing anything based on it.
**AI/tool layer:**
- **Real:** Google Sheets. Notion databases. HubSpot or Pipedrive reports. Stripe dashboard for revenue.
- **Mostly Theater:** "AI-powered analytics dashboards" with 50 widgets and no actionable insight.
---
### Step 5.2 — Quarterly Buyer Feedback
**Produces:** Direct conversation with at least 5 recent clients each quarter, capturing what worked, what didn't, what they'd change, and what they'd buy next.
**Input:** Your client list.
**How to do it:** Schedule four 30-minute calls per quarter with recent clients. Open-ended questions. Record (with permission). Capture verbatim quotes. Look for patterns across calls.
**Done-when criteria:** Every quarter, you have new buyer language and new insights flowing back into your offer, content, and SOPs.
**Common failure modes:** Skipping these calls because they feel awkward to ask for. Asking only people who liked you (selection bias). Hearing feedback and not acting on it.
**AI/tool layer:**
- **Real:** Otter.ai, Fathom, Granola for transcription. Claude/ChatGPT to synthesize themes across transcripts.
---
### Step 5.3 — A/B Testing (Earned)
**Produces:** Continuous optimization of your highest-volume marketing assets — sales page, lead magnet, email subject lines, ad creative — based on real conversion data.
**Input:** Sufficient traffic volume to actually have statistical significance. For most professional service operators this means 1,000+ page visits per month per asset. Below that, A/B testing is theater.
**How to do it:** Test one variable at a time. Define hypothesis upfront. Run until significance (or 4 weeks max). Document the result. Apply the winner. Move to the next test.
**Done-when criteria:** Each high-volume asset has been through at least 4 deliberate test cycles per year.
**Common failure modes:** Testing without enough traffic (you'll get random noise). Testing too many variables at once. Calling a test winner before it reaches significance. Forgetting which variant won and why.
**AI/tool layer:**
- **Real:** Native A/B in your email tool, ad platform, and CMS (most have it built-in). VWO, Optimizely if you have real volume.
- **Mostly Theater:** AI-driven "auto-optimization." Useful at scale (Meta, Google ads platforms run their own); the third-party "AI testing agents" mostly recreate functionality the platforms already have.
---
### Step 5.4 — Offer and Positioning Refresh
**Produces:** Annual review of your core offer, positioning, pricing, and target buyer. Either confirmation that it's still right, or deliberate evolution.
**Input:** Phase 5 metrics. Quarterly buyer feedback. Competitive landscape changes.
**How to do it:** Once a year, block a full day. Review your Phase 1 documents. Are they still accurate? Has the buyer pain shifted? Has your delivery capability evolved? Is your pricing still right? Decide what to keep, what to evolve, what to retire.
**Done-when criteria:** End of each year, you have an explicit decision: "this is still the offer for next year" or "here is what changes."
**Common failure modes:** Skipping the annual review. Refreshing the offer without buyer feedback to support it. Refreshing for vanity reasons (you got bored) instead of strategic ones.
---
### Step 5.5 — Scale Decision
**Produces:** A deliberate choice about whether to scale vertically (more clients in same niche), horizontally (same offer in adjacent niches), or stay solo.
**Input:** 18+ months of operating data. Honest self-assessment of what you actually want.
**How to do it:** This decision is more about you than about the business. Some operators want to stay a solo expert with high margins and short hours. Some want to build a firm. Both are legitimate. The mistake is drifting into one without choosing.
If scaling vertically: hire associate practitioners, document delivery extensively, develop training for them, plan for quality control. If scaling horizontally: pilot the new niche before committing, treat it as Phase 1 again from scratch. If staying solo: raise prices.
**Done-when criteria:** Explicit written decision with criteria for revisiting.
**Common failure modes:** Drifting into scaling because it sounds like success. Hiring before SOPs are documented (chaos compounds). Hiring before you've explicitly chosen what role you want.
---
## The Feedback Loops
The original document called this the "Master Loop." Here are the actual loops, named honestly:
**Phase 5.1 metrics → Phase 1.2 pain doc.** When your conversation rate or close rate drops, the message has stopped resonating. The buyer's pain has shifted. Re-do pain discovery.
**Phase 5.2 buyer feedback → Phase 2.3 lead magnet, Phase 2.4 sales page, Phase 1.3 offer.** Buyer language captured in feedback calls flows directly into asset copy. Their objections become your FAQ. Their unmet needs become your next offer.
**Phase 5.3 A/B test results → Phase 2 assets, Phase 3.4 content cadence.** Winning variants get codified. Losing patterns get retired.
**Phase 4.3 knowledge library → Phase 3.4 content, Phase 2.3 lead magnet.** Your sanitized case examples become content. Your most-asked questions become lead magnets. The library compounds the marketing.
**Phase 5.4 offer refresh → all of Phase 1.** Once a year, the entire foundation gets revisited.
These loops are not magic. They are scheduled review meetings with yourself. The discipline is in keeping them on the calendar.
---
## Closing — What Makes This Work
This document gives you structure. It does not give you discipline. The structure is portable; discipline is not. The operators who will get value from this skeleton are the ones who:
- Walk Phase 1 fully before launching, even when it feels slow
- Set kill criteria and honor them
- Track what's working and what isn't, monthly
- Talk to actual buyers, quarterly
- Refresh the foundation, annually
- Resist the temptation to add tools, agents, and complexity in place of doing the work
The "agentic" layer in 2026 is real for narrow jobs. It is mostly theater for unbounded creative or strategic work. AI saves 30–50% of time on editing, formatting, and synthesis tasks. It does not save time on thinking, on listening to buyers, on building credibility, or on the relationship work that actually closes high-ticket professional service engagements. Operators who try to substitute AI for those things produce volume without conversion.
### The Identity Commoditization risk
This is the meta-risk that runs across every phase of this document, and it deserves to be named explicitly.
**The mechanism:** When ten operators in your niche all use the same AI tools with similar prompts to produce content, outreach, lead magnets, and proposals, their output converges. Buyers can tell. Not always consciously — sometimes just as a vague sense that "everyone sounds the same now." When that happens at scale, the entire niche commoditizes. Buyers stop trying to identify the best provider and shop on price. Your price floor collapses. Your margin compresses. The work you trained for thirty years to do gets valued like a generic service.
**Why this is the central 2026 risk for high-ticket professional services:** Your buyer is paying premium prices because you bring something specific — credentials, judgment, a way of seeing problems, a track record. AI commodifies the wrappers around those things (your emails, your posts, your reports) faster than it commodifies the substance. If the wrappers all look the same, buyers default to lowest price because they cannot tell the substance apart from outside.
**How to defend against it:**
- **Use AI for editing and synthesis, never for thinking.** Draft your post yourself, then have AI tighten it. Not the other way around.
- **Feed your AI tools your specific intellectual property** — your prior reports, your characteristic phrases, your case examples, your point of view. A model with no context about you produces generic output. A model fed your archive produces output in your voice. This is what the Knowledge Management library in Step 4.3 is actually for.
- **Reserve the highest-stakes artifacts for hand-craftsmanship.** Sales pages, expert reports, depositions, anything a buyer reads carefully — these get written by you, not by AI. Use AI to refine, never to generate.
- **Make your content carry signals only you can produce.** Specific case numbers from your prior work. A photograph from a job site. A technical diagram in your hand. A recording of your voice. Anything that proves a human did the work.
- **Audit yourself quarterly.** Read three of your recent outreach messages aloud. Read three competitor outreach messages aloud. If you can't immediately tell which is yours, you have a problem.
The operators who win in 2026 use AI as a force multiplier on a distinctive practice. The operators who lose use AI as a substitute for one. Same tools, opposite outcomes.
The work is the work. This document tells you what the work is and in what order. The rest is on you.
---
## Where the existing RISER artifacts fit
| Phase / Step | RISER artifact |
|---|---|
| 1.2 Pain Discovery | MVO Decision Engine (Gates 00½, 01) · Pain Discovery Tool Catalog (41 tools) |
| 1.3 Offer Hypothesis | MVO Decision Engine (Gates 04–06) · Marketing Plan Generator (section 08 of every plan) |
| 1.4 MVP Definition | MVO Decision Engine (full 17-gate sequence) |
| 2.1 Competitive Intel | MVO Decision Engine (Gate 03 Competitive Moat) |
| 2.3 Lead Magnet | Marketing Plan Generator (section 05 of every plan) |
| 3.1 Warm Outreach | Marketing Plan Generator (section 09 outreach scripts) |
| 3.2 Dream 100 | Client Acquisition Catalog (Dream 100 template, 39-tool stack) |
| 3.3 Outreach Cadence | Marketing Plan Generator (section 09) · Client Acquisition Catalog (Channel 6 outreach + CRM) |
| 3.4 Content Distribution | Marketing Plan Generator (section 03 Where They Gather, section 04 Channel Priority, sections 06+07 hook/headline/cadence) |
The widgets generate the artifacts. This document tells you when and why to use them. Together they form a working operator's plan, not an unbeatable mastermind 2026 unstoppable scaling agentic essay.
The work is the work.
**Captain out.**
Original asset: RISER-Step-1.1-Idea-Capture.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Step 1.1 Idea Capture · RISER Operator's Flow</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter+Tight:[email protected]&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a; --paper: #f7f4ee; --paper-warm: #f0eadf; --paper-deep: #e9e2d2;
--rule: #1a1a1a; --red: #c9302a; --red-deep: #8b1f1c; --red-tint: #fbe8e6;
--green: #1d6e3a; --green-tint: #dcefe2; --gold: #b8893a; --gold-tint: #f5ead0;
--teal: #2c5f5a; --teal-tint: #d8e6e4; --muted: #5a564f;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body { font-family: var(--sans); background: var(--paper); color: var(--ink); line-height: 1.55; font-size: 15px; min-height: 100vh; }
main { max-width: 900px; margin: 0 auto; padding: 40px 32px 80px; }
.toc-link { display: inline-block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); text-decoration: none; margin-bottom: 24px; }
.toc-link:hover { color: var(--red-deep); }
.masthead { border-bottom: 3px double var(--rule); padding-bottom: 24px; margin-bottom: 32px; }
.kicker { font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; display: flex; align-items: center; gap: 14px; }
.kicker::after { content: ''; flex: 1; height: 1px; background: var(--rule); opacity: 0.3; }
.title { font-family: var(--serif); font-weight: 600; font-size: clamp(32px, 4.5vw, 48px); line-height: 1.05; letter-spacing: -0.025em; margin-bottom: 14px; }
.title em { font-style: italic; font-weight: 400; color: var(--red-deep); }
.subtitle { font-family: var(--serif); font-style: italic; font-size: 17px; color: var(--muted); max-width: 720px; line-height: 1.5; }
.stages { display: flex; gap: 0; margin: 18px 0 24px; border: 1.5px solid var(--rule); background: var(--paper-warm); font-family: var(--mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; }
.stage-pill { flex: 1; padding: 10px 14px; border-right: 1.5px solid var(--rule); color: var(--muted); display: flex; align-items: center; gap: 10px; }
.stage-pill:last-child { border-right: none; }
.stage-pill .num { width: 22px; height: 22px; border: 1.5px solid currentColor; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-weight: 700; font-size: 11px; flex-shrink: 0; }
.stage-pill.active { background: var(--ink); color: var(--paper); font-weight: 700; }
.field { margin-bottom: 24px; }
.field-label { display: block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-bottom: 8px; }
.field-help { font-family: var(--serif); font-style: italic; font-size: 14px; color: var(--muted); margin-bottom: 10px; line-height: 1.45; }
input[type="text"], input[type="password"], textarea, select { width: 100%; padding: 12px 16px; font-family: var(--sans); font-size: 15px; border: 1.5px solid var(--rule); background: var(--paper); color: var(--ink); border-radius: 0; transition: border-color 0.15s, background 0.15s; }
input:focus, textarea:focus, select:focus { outline: none; border-color: var(--red-deep); background: #fff; }
textarea { resize: vertical; min-height: 100px; line-height: 1.5; font-family: var(--sans); }
.field-primary { background: var(--paper-warm); border: 1.5px solid var(--rule); border-left: 4px solid var(--red-deep); padding: 22px 24px 24px; margin-bottom: 28px; box-shadow: 4px 4px 0 var(--rule); }
.field-primary .field-label { font-family: var(--serif); font-size: 22px; letter-spacing: -0.015em; text-transform: none; color: var(--ink); font-weight: 600; margin-bottom: 6px; line-height: 1.2; }
.field-primary input[type="text"], .field-primary textarea, .field-primary select { font-size: 17px; padding: 14px 18px; border-width: 2px; }
.btn { font-family: var(--mono); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; padding: 12px 22px; border: 1.5px solid var(--rule); background: var(--paper); color: var(--ink); cursor: pointer; transition: all 0.12s; font-weight: 600; text-decoration: none; display: inline-block; }
.btn:hover:not(:disabled) { background: var(--ink); color: var(--paper); }
.btn:disabled { opacity: 0.35; cursor: not-allowed; background: var(--paper-deep) !important; color: var(--muted) !important; border-color: var(--muted) !important; }
.btn-primary { background: var(--red-deep); color: var(--paper); border-color: var(--red-deep); }
.btn-primary:hover:not(:disabled) { background: var(--red); border-color: var(--red); }
.btn-ghost { border-color: var(--muted); color: var(--muted); }
.btn-row { display: flex; gap: 12px; margin-top: 28px; flex-wrap: wrap; align-items: center; }
.banner { padding: 14px 18px; font-size: 14px; border-left: 4px solid; margin-bottom: 20px; font-family: var(--serif); line-height: 1.5; }
.banner-info { background: var(--teal-tint); border-color: var(--teal); color: var(--teal); }
.banner-warn { background: var(--red-tint); border-color: var(--red-deep); color: var(--red-deep); }
.banner-success { background: var(--green-tint); border-color: var(--green); color: var(--green); }
.banner strong { font-weight: 700; }
.api-key-section { margin-top: 24px; padding: 20px; background: var(--paper-warm); border: 1.5px solid var(--rule); }
.api-key-section h3 { font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-bottom: 8px; }
.api-key-section p { font-size: 13px; color: var(--muted); margin-bottom: 12px; line-height: 1.45; }
.api-key-section input[type="password"] { font-family: var(--mono); font-size: 13px; }
.model-toggle { display: flex; gap: 8px; margin-top: 12px; }
.model-toggle button { flex: 1; padding: 8px 12px; font-family: var(--mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; background: var(--paper); border: 1.5px solid var(--rule); cursor: pointer; font-weight: 600; }
.model-toggle button.active { background: var(--ink); color: var(--paper); }
.loading-state { text-align: center; padding: 50px 20px; font-family: var(--serif); font-style: italic; font-size: 17px; color: var(--muted); }
@keyframes pulse-dot { 0%, 80%, 100% { opacity: 0.3; } 40% { opacity: 1; } }
.dot { animation: pulse-dot 1.4s infinite ease-in-out; display: inline-block; font-size: 24px; }
.dot:nth-child(2) { animation-delay: 0.2s; }
.dot:nth-child(3) { animation-delay: 0.4s; }
.loading-step-text { font-family: var(--mono); font-style: normal; font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; margin-top: 16px; color: var(--red-deep); font-weight: 600; }
.output-box { background: var(--paper-warm); border: 1.5px solid var(--rule); border-left: 4px solid var(--gold); padding: 22px 24px; margin: 18px 0; }
.output-box h4 { font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-bottom: 10px; }
.output-box .output-content { font-family: var(--serif); font-size: 16px; line-height: 1.6; white-space: pre-wrap; }
.output-meta { font-family: var(--mono); font-size: 11px; color: var(--muted); margin-top: 12px; letter-spacing: 0.04em; }
.card { background: var(--paper); border: 1.5px solid var(--rule); padding: 22px 24px; margin-bottom: 18px; }
.card-warm { background: var(--paper-warm); }
.card-header { display: flex; align-items: baseline; gap: 14px; margin-bottom: 14px; border-bottom: 1.5px solid var(--rule); padding-bottom: 10px; }
.card-num { font-family: var(--mono); font-size: 11px; font-weight: 700; color: var(--red-deep); letter-spacing: 0.1em; }
.card h3 { font-family: var(--serif); font-size: 22px; font-weight: 600; letter-spacing: -0.015em; flex: 1; line-height: 1.2; }
.card p { font-family: var(--serif); font-size: 15px; line-height: 1.55; margin-bottom: 10px; }
.copy-btn { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; padding: 6px 12px; border: 1.5px solid var(--rule); background: var(--paper); color: var(--ink); cursor: pointer; transition: all 0.12s; margin-left: 8px; }
.copy-btn:hover { background: var(--ink); color: var(--paper); }
.copy-btn.copied { background: var(--green); color: var(--paper); border-color: var(--green); }
.setup-hint { font-family: var(--mono); font-size: 11px; letter-spacing: 0.06em; color: var(--red-deep); margin-top: 12px; padding: 10px 14px; background: var(--red-tint); border-left: 3px solid var(--red-deep); }
@media print { body { background: #fff; font-size: 11pt; } .api-key-section, .btn-row, .toc-link { display: none !important; } main { padding: 0; max-width: 100%; } .card, .output-box { background: #fff !important; border: 1px solid #555 !important; page-break-inside: avoid; } @page { margin: 0.6in; size: letter; } }
</style>
</head>
<body>
<main>
<a href="RISER-Suite-Index.html" class="toc-link">← Suite Index · Table of Contents</a>
<div class="masthead">
<div class="kicker">Phase 1 · Step 1.1 · Idea Capture</div>
<h1 class="title">Capture your <em>idea</em> in one paragraph</h1>
<p class="subtitle">200 words. Five sentences. Buyer + problem + solution + price tier + why you. The constraint forces clarity. This paragraph becomes the foundation for every step that follows.</p>
</div>
<div class="stages">
<div class="stage-pill active"><span class="num">1</span><span>Your raw idea</span></div>
<div class="stage-pill" id="stage-2-pill"><span class="num">2</span><span>Refined paragraph</span></div>
<div class="stage-pill" id="stage-3-pill"><span class="num">3</span><span>Save & next step</span></div>
</div>
<section id="stage-input">
<div class="card">
<div class="card-header"><div class="card-num">START</div><h3>Tell me about your business idea</h3></div>
<p>Free-form. Don't try to structure it yet. Tell me what you're thinking about, who you think it's for, what problem you think it solves, what makes you the right person, and roughly what you'd charge. If you don't know one of those yet, just say so — Claude will help you sharpen what's missing.</p>
</div>
<div class="field field-primary">
<label class="field-label" for="business-model">Your business model</label>
<p class="field-help">Pick the closest fit. This shapes how Claude refines your idea — an Etsy seller's plan looks different from a forensic engineer's.</p>
<select id="business-model">
<option value="">— Pick one —</option>
<option value="product-physical">Physical product / Etsy / DTC (handmade goods, branded products, supplements)</option>
<option value="product-digital">Digital product / content (course, ebook, template, SaaS, paid newsletter)</option>
<option value="service-pro">Professional service (consulting, expert witness, legal, accounting, agency)</option>
<option value="service-coaching">Coaching / training (life, fitness, business, relationship)</option>
<option value="service-local">Local / brick-and-mortar (restaurant, gym, med spa, contractor)</option>
<option value="creator">Creator / influencer (podcast, YouTube, newsletter)</option>
<option value="affiliate-mlm">Affiliate / partnership / MLM</option>
<option value="other">Other / hybrid (specify in your idea below)</option>
</select>
</div>
<div class="field">
<label class="field-label" for="raw-idea">Your idea, in your own words</label>
<p class="field-help">Anywhere from 30 to 300 words. The more specific you are, the better Claude can refine it. If something is unclear or unknown, say so explicitly — that's information too.</p>
<textarea id="raw-idea" rows="8" placeholder="e.g. I'm a forensic engineer with 35 years of experience in HVAC and VRF systems. I want to build a service for insurance defense attorneys handling commercial property subrogation cases. They need credentialed experts who can write Daubert-defensible reports in 10–14 days. I've done this work for years but want to systematize and grow it. I'd charge $500–$650/hr."></textarea>
</div>
<div class="api-key-section">
<h3>Anthropic API Key</h3>
<p>This page calls the Anthropic API directly from your browser. Your key is stored only in localStorage — never sent anywhere except Anthropic. <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noopener" style="color: var(--red-deep);">Get a key here</a>. The key carries between RISER files in the same browser if localStorage allows.</p>
<input type="password" id="api-key" placeholder="sk-ant-…" autocomplete="off">
<div class="model-toggle">
<button id="model-sonnet" class="active" data-model="claude-sonnet-4-6">Sonnet 4.6 (faster · cheaper)</button>
<button id="model-opus" data-model="claude-opus-4-7">Opus 4.7 (highest quality)</button>
</div>
</div>
<div class="btn-row">
<button class="btn btn-primary" id="refine-btn" disabled>Refine into paragraph →</button>
</div>
<div id="input-hint" class="setup-hint" style="display: none;"></div>
</section>
<section id="stage-refined" style="display: none;">
<div id="loading-state" class="loading-state" style="display: none;">
<div><span class="dot">•</span><span class="dot">•</span><span class="dot">•</span></div>
<div class="loading-step-text" id="loading-step-text">Reading your idea…</div>
</div>
<div id="refined-output"></div>
</section>
</main>
<script>
'use strict';
const STATE_KEY = 'riser:operator:v1';
const STEP_ID = 'phase-1.1';
const ANTI_FAB = `
CRITICAL ANTI-FABRICATION RULES — non-negotiable:
1. NEVER invent fake firm names, fake people's names, fake testimonials, or fabricated quotes.
2. NEVER write specific outcome guarantees ("this generates X leads per month").
3. NEVER fabricate market sizes, percentages, or revenue projections.
4. If you lack deep niche knowledge, SAY SO EXPLICITLY in caveats. Don't bluff.
5. Use [BRACKETS] for all user-fill placeholders.
6. For regulated activity (legal, medical, financial, MLM), include compliance reminders.
7. Match the operator's stated business model. No generic advice that ignores the input.`;
function loadState() {
try { const r = localStorage.getItem(STATE_KEY); return r ? JSON.parse(r) : {}; }
catch (e) { return {}; }
}
function saveState(s) { try { localStorage.setItem(STATE_KEY, JSON.stringify(s)); } catch (e) {} }
function setStepOutput(id, output) {
const s = loadState(); s.outputs = s.outputs || {};
s.outputs[id] = Object.assign({}, output, { completedAt: new Date().toISOString() });
saveState(s);
}
function getStepOutput(id) { const s = loadState(); return (s.outputs || {})[id] || null; }
function escapeHtml(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); }
function el(id) { return document.getElementById(id); }
function copyToClipboard(text, btn) {
if (!navigator.clipboard) return alert('Clipboard not available');
navigator.clipboard.writeText(text).then(() => {
if (btn) { const o = btn.textContent; btn.textContent = 'Copied ✓'; btn.classList.add('copied'); setTimeout(() => { btn.textContent = o; btn.classList.remove('copied'); }, 1600); }
});
}
// Load saved key + model
const state = loadState();
if (state.apiKey) el('api-key').value = state.apiKey;
if (state.model === 'claude-opus-4-7') {
document.querySelectorAll('.model-toggle button').forEach(b => b.classList.remove('active'));
el('model-opus').classList.add('active');
}
// Restore prior input if step was completed
const saved = getStepOutput(STEP_ID);
if (saved) {
if (saved.businessModel) el('business-model').value = saved.businessModel;
if (saved.rawIdea) el('raw-idea').value = saved.rawIdea;
if (saved.paragraph) showRefinedOutput(saved.paragraph, saved.notes || [], saved.missingFields || []);
}
// Listeners
el('api-key').addEventListener('input', e => {
const s = loadState(); s.apiKey = e.target.value.trim(); saveState(s);
checkReady();
});
document.querySelectorAll('.model-toggle button').forEach(b => {
b.addEventListener('click', () => {
document.querySelectorAll('.model-toggle button').forEach(x => x.classList.remove('active'));
b.classList.add('active');
const s = loadState(); s.model = b.dataset.model; saveState(s);
});
});
el('business-model').addEventListener('change', checkReady);
el('raw-idea').addEventListener('input', checkReady);
function checkReady() {
const model = el('business-model').value;
const idea = el('raw-idea').value.trim();
const key = el('api-key').value.trim();
const ok = model && idea.length >= 30 && key.length >= 20;
el('refine-btn').disabled = !ok;
const hint = el('input-hint');
if (ok) { hint.style.display = 'none'; }
else {
const missing = [];
if (key.length < 20) missing.push('API key (≥20 chars)');
if (!model) missing.push('Business model');
if (idea.length < 30) missing.push('Idea description (≥30 chars; you have ' + idea.length + ')');
hint.textContent = 'Still needed: ' + missing.join(' · ');
hint.style.display = 'block';
}
}
checkReady();
el('refine-btn').addEventListener('click', refineIdea);
async function callClaude(sys, user, opts) {
opts = opts || {};
const s = loadState();
const body = {
model: opts.model || s.model || 'claude-sonnet-4-6',
max_tokens: opts.maxTokens || 1500,
system: sys,
messages: [{ role: 'user', content: user }]
};
const r = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': s.apiKey,
'anthropic-version': '2023-06-01',
'anthropic-dangerous-direct-browser-access': 'true'
},
body: JSON.stringify(body)
});
if (!r.ok) throw new Error('API error ' + r.status + ': ' + (await r.text()).slice(0, 220));
const d = await r.json();
return (d.content && d.content[0] && d.content[0].text) || '';
}
function extractJSON(text) {
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
if (fenced) { try { return JSON.parse(fenced[1].trim()); } catch (e) {} }
const start = text.indexOf('{'), end = text.lastIndexOf('}');
if (start !== -1 && end > start) { try { return JSON.parse(text.slice(start, end + 1)); } catch (e) {} }
throw new Error('Could not parse JSON from response');
}
async function refineIdea() {
const businessModel = el('business-model').value;
const rawIdea = el('raw-idea').value.trim();
el('stage-input').style.display = 'none';
el('stage-refined').style.display = 'block';
el('loading-state').style.display = 'block';
el('refined-output').innerHTML = '';
el('stage-2-pill').classList.add('active');
const steps = ['Reading your idea…', 'Identifying buyer specificity…', 'Naming the problem precisely…', 'Sharpening the solution…', 'Pressure-testing pricing…', 'Drafting the paragraph…'];
let idx = 0;
const interval = setInterval(() => { idx = Math.min(idx + 1, steps.length - 1); el('loading-step-text').textContent = steps[idx]; }, 3500);
const sys = `You are an expert direct-response strategist working in the lineage of Alex Hormozi, Russell Brunson, and Eugene Schwartz. Your job is to refine an operator's raw business idea into a disciplined 5-sentence paragraph.
Structure exactly:
- Sentence 1: WHO (specific buyer — title, industry, geography, deal-size signal)
- Sentence 2: PROBLEM (specific pain in concrete language)
- Sentence 3: SOLUTION (the specific deliverable, not the abstract category)
- Sentence 4: PRICE TIER (rough order of magnitude)
- Sentence 5: WHY YOU (one credibility signal)
Length: 150-220 words across 5 sentences.
If any field is missing or vague, do NOT invent it. Mark with [BRACKETED PLACEHOLDER] in the paragraph and add to missingFields.
Match refinement to stated business model. Etsy paragraph reads like Etsy. Forensic engineer paragraph reads like that. Do not impose generic SaaS vocabulary.
Return EXACTLY this JSON, no fences, no prose:
{
"paragraph": "5 sentences as one flowing paragraph.",
"notes": ["Up to 4 short observations: what got sharper, what's fuzzy, what to test."],
"missingFields": ["Any of: WHO | PROBLEM | SOLUTION | PRICE | WHY_YOU — only if bracketed."]
}` + ANTI_FAB;
const businessModelLabel = {
'product-physical': 'Physical product / Etsy / DTC',
'product-digital': 'Digital product / content',
'service-pro': 'Professional service',
'service-coaching': 'Coaching / training',
'service-local': 'Local / brick-and-mortar',
'creator': 'Creator / influencer',
'affiliate-mlm': 'Affiliate / partnership / MLM',
'other': 'Other / hybrid'
}[businessModel] || businessModel;
const user = 'Business model: ' + businessModelLabel + '\n\nRaw idea (operator\'s words):\n' + rawIdea + '\n\nRefine into the disciplined 5-sentence paragraph.';
try {
const text = await callClaude(sys, user, { maxTokens: 1500 });
const obj = extractJSON(text);
if (!obj.paragraph) throw new Error('Model returned no paragraph');
clearInterval(interval);
el('loading-state').style.display = 'none';
setStepOutput(STEP_ID, {
businessModel: businessModel,
rawIdea: rawIdea,
paragraph: obj.paragraph,
notes: obj.notes || [],
missingFields: obj.missingFields || []
});
const s = loadState();
s.business = { idea: obj.paragraph, model: businessModel, detail: rawIdea };
saveState(s);
showRefinedOutput(obj.paragraph, obj.notes || [], obj.missingFields || []);
} catch (err) {
clearInterval(interval);
el('loading-state').style.display = 'none';
el('refined-output').innerHTML = '<div class="banner banner-warn"><strong>Refinement failed.</strong> ' + escapeHtml(err.message || 'Unknown error') + '<br><br>Common causes: API key issue · rate limit · network · malformed JSON.<br><br><a href="#" onclick="location.reload();return false;" style="color: var(--red-deep);">Try again</a></div>';
}
}
function showRefinedOutput(paragraph, notes, missingFields) {
let html = '';
html += '<div class="output-box">';
html += '<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px;">';
html += '<h4 style="margin: 0;">Your refined idea paragraph</h4>';
html += '<button class="copy-btn" id="copy-paragraph">Copy</button>';
html += '</div>';
html += '<div class="output-content">' + escapeHtml(paragraph) + '</div>';
html += '<div class="output-meta">~' + paragraph.split(/\s+/).length + ' words · saved to localStorage · use this paragraph in Step 1.2</div>';
html += '</div>';
if (notes && notes.length > 0) {
html += '<div class="card"><div class="card-header"><div class="card-num">NOTES</div><h3>Observations</h3></div><ul style="list-style: none; padding: 0;">';
notes.forEach(n => { html += '<li style="padding: 6px 0 6px 22px; position: relative; font-family: var(--serif); font-size: 15px; line-height: 1.55;"><span style="position: absolute; left: 0; color: var(--gold); font-weight: 700;">→</span>' + escapeHtml(n) + '</li>'; });
html += '</ul></div>';
}
if (missingFields && missingFields.length > 0) {
html += '<div class="banner banner-warn"><strong>Honest gaps:</strong> ' + missingFields.map(escapeHtml).join(', ') + '. These are bracketed in the paragraph. Step 1.3 (Pain Discovery) will sharpen the PROBLEM if missing. Step 1.4 (Offer Hypothesis) will sharpen PRICE and SOLUTION.</div>';
}
html += '<div class="btn-row">';
html += '<button class="btn btn-ghost" id="edit-again-btn">← Edit</button>';
html += '<a href="RISER-Suite-Index.html" class="btn">Suite Index</a>';
html += '<a href="RISER-Step-1.2-Buyer-Decision-Style.html" class="btn btn-primary">Continue to Step 1.2 — Buyer Decision Style →</a>';
html += '</div>';
html += '<div class="banner banner-info" style="margin-top: 14px;"><strong>Hand-off note:</strong> Open <code>RISER-Step-1.2-Buyer-Decision-Style.html</code> in this same browser. If your browser shares localStorage between local files (Chrome usually does), Step 1.2 will pick up your paragraph automatically. If not, copy the paragraph above and paste it into the prior-context field on Step 1.2.</div>';
el('refined-output').innerHTML = html;
el('stage-3-pill').classList.add('active');
document.getElementById('copy-paragraph').addEventListener('click', function() { copyToClipboard(paragraph, this); });
document.getElementById('edit-again-btn').addEventListener('click', function() {
el('stage-input').style.display = 'block';
el('stage-refined').style.display = 'none';
el('stage-2-pill').classList.remove('active');
el('stage-3-pill').classList.remove('active');
window.scrollTo({ top: 0, behavior: 'smooth' });
});
}
console.log('RISER Step 1.1 Idea Capture loaded. Saved:', saved ? 'yes' : 'no');
</script>
</body>
</html>
Original asset: RISER-Step-1.2-Buyer-Decision-Style.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Step 1.2 Buyer Decision Style · RISER Operator's Flow</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter+Tight:[email protected]&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a; --paper: #f7f4ee; --paper-warm: #f0eadf; --paper-deep: #e9e2d2;
--rule: #1a1a1a; --red: #c9302a; --red-deep: #8b1f1c; --red-tint: #fbe8e6;
--green: #1d6e3a; --green-tint: #dcefe2; --gold: #b8893a; --gold-tint: #f5ead0;
--teal: #2c5f5a; --teal-tint: #d8e6e4; --muted: #5a564f; --slate: #4a4e69;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body { font-family: var(--sans); background: var(--paper); color: var(--ink); line-height: 1.55; font-size: 15px; min-height: 100vh; }
main { max-width: 900px; margin: 0 auto; padding: 40px 32px 80px; }
.toc-link { display: inline-block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); text-decoration: none; margin-bottom: 24px; }
.toc-link:hover { color: var(--red-deep); }
.masthead { border-bottom: 3px double var(--rule); padding-bottom: 24px; margin-bottom: 32px; }
.kicker { font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; display: flex; align-items: center; gap: 14px; }
.kicker::after { content: ''; flex: 1; height: 1px; background: var(--rule); opacity: 0.3; }
.title { font-family: var(--serif); font-weight: 600; font-size: clamp(32px, 4.5vw, 48px); line-height: 1.05; letter-spacing: -0.025em; margin-bottom: 14px; }
.title em { font-style: italic; font-weight: 400; color: var(--red-deep); }
.subtitle { font-family: var(--serif); font-style: italic; font-size: 17px; color: var(--muted); max-width: 720px; line-height: 1.5; }
.stages { display: flex; gap: 0; margin: 18px 0 24px; border: 1.5px solid var(--rule); background: var(--paper-warm); font-family: var(--mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; }
.stage-pill { flex: 1; padding: 10px 14px; border-right: 1.5px solid var(--rule); color: var(--muted); display: flex; align-items: center; gap: 10px; }
.stage-pill:last-child { border-right: none; }
.stage-pill .num { width: 22px; height: 22px; border: 1.5px solid currentColor; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-weight: 700; font-size: 11px; flex-shrink: 0; }
.stage-pill.active { background: var(--ink); color: var(--paper); font-weight: 700; }
.field { margin-bottom: 24px; }
.field-label { display: block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-bottom: 8px; }
.field-help { font-family: var(--serif); font-style: italic; font-size: 14px; color: var(--muted); margin-bottom: 10px; line-height: 1.45; }
input[type="text"], input[type="password"], textarea, select { width: 100%; padding: 12px 16px; font-family: var(--sans); font-size: 15px; border: 1.5px solid var(--rule); background: var(--paper); color: var(--ink); border-radius: 0; transition: border-color 0.15s, background 0.15s; }
input:focus, textarea:focus, select:focus { outline: none; border-color: var(--red-deep); background: #fff; }
textarea { resize: vertical; min-height: 100px; line-height: 1.5; font-family: var(--sans); }
.field-primary { background: var(--paper-warm); border: 1.5px solid var(--rule); border-left: 4px solid var(--red-deep); padding: 22px 24px 24px; margin-bottom: 28px; box-shadow: 4px 4px 0 var(--rule); }
.field-primary .field-label { font-family: var(--serif); font-size: 22px; letter-spacing: -0.015em; text-transform: none; color: var(--ink); font-weight: 600; margin-bottom: 6px; line-height: 1.2; }
.field-primary input[type="text"], .field-primary textarea { font-size: 17px; padding: 14px 18px; border-width: 2px; }
.btn { font-family: var(--mono); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; padding: 12px 22px; border: 1.5px solid var(--rule); background: var(--paper); color: var(--ink); cursor: pointer; transition: all 0.12s; font-weight: 600; text-decoration: none; display: inline-block; }
.btn:hover:not(:disabled) { background: var(--ink); color: var(--paper); }
.btn:disabled { opacity: 0.35; cursor: not-allowed; background: var(--paper-deep) !important; color: var(--muted) !important; border-color: var(--muted) !important; }
.btn-primary { background: var(--red-deep); color: var(--paper); border-color: var(--red-deep); }
.btn-primary:hover:not(:disabled) { background: var(--red); border-color: var(--red); }
.btn-ghost { border-color: var(--muted); color: var(--muted); }
.btn-row { display: flex; gap: 12px; margin-top: 28px; flex-wrap: wrap; align-items: center; }
.banner { padding: 14px 18px; font-size: 14px; border-left: 4px solid; margin-bottom: 20px; font-family: var(--serif); line-height: 1.5; }
.banner-info { background: var(--teal-tint); border-color: var(--teal); color: var(--teal); }
.banner-warn { background: var(--red-tint); border-color: var(--red-deep); color: var(--red-deep); }
.banner-success { background: var(--green-tint); border-color: var(--green); color: var(--green); }
.banner strong { font-weight: 700; }
.api-key-section { margin-top: 24px; padding: 20px; background: var(--paper-warm); border: 1.5px solid var(--rule); }
.api-key-section h3 { font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-bottom: 8px; }
.api-key-section p { font-size: 13px; color: var(--muted); margin-bottom: 12px; line-height: 1.45; }
.api-key-section input[type="password"] { font-family: var(--mono); font-size: 13px; }
.model-toggle { display: flex; gap: 8px; margin-top: 12px; }
.model-toggle button { flex: 1; padding: 8px 12px; font-family: var(--mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; background: var(--paper); border: 1.5px solid var(--rule); cursor: pointer; font-weight: 600; }
.model-toggle button.active { background: var(--ink); color: var(--paper); }
.loading-state { text-align: center; padding: 50px 20px; font-family: var(--serif); font-style: italic; font-size: 17px; color: var(--muted); }
@keyframes pulse-dot { 0%, 80%, 100% { opacity: 0.3; } 40% { opacity: 1; } }
.dot { animation: pulse-dot 1.4s infinite ease-in-out; display: inline-block; font-size: 24px; }
.dot:nth-child(2) { animation-delay: 0.2s; }
.dot:nth-child(3) { animation-delay: 0.4s; }
.loading-step-text { font-family: var(--mono); font-style: normal; font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; margin-top: 16px; color: var(--red-deep); font-weight: 600; }
.card { background: var(--paper); border: 1.5px solid var(--rule); padding: 22px 24px; margin-bottom: 18px; }
.card-warm { background: var(--paper-warm); }
.card-header { display: flex; align-items: baseline; gap: 14px; margin-bottom: 14px; border-bottom: 1.5px solid var(--rule); padding-bottom: 10px; }
.card-num { font-family: var(--mono); font-size: 11px; font-weight: 700; color: var(--red-deep); letter-spacing: 0.1em; }
.card h3 { font-family: var(--serif); font-size: 22px; font-weight: 600; letter-spacing: -0.015em; flex: 1; line-height: 1.2; }
.card p { font-family: var(--serif); font-size: 15px; line-height: 1.55; margin-bottom: 10px; }
.copy-btn { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; padding: 6px 12px; border: 1.5px solid var(--rule); background: var(--paper); color: var(--ink); cursor: pointer; transition: all 0.12s; margin-left: 8px; }
.copy-btn:hover { background: var(--ink); color: var(--paper); }
.copy-btn.copied { background: var(--green); color: var(--paper); border-color: var(--green); }
.setup-hint { font-family: var(--mono); font-size: 11px; letter-spacing: 0.06em; color: var(--red-deep); margin-top: 12px; padding: 10px 14px; background: var(--red-tint); border-left: 3px solid var(--red-deep); }
.style-card { border-left: 5px solid; padding: 18px 22px; margin-bottom: 14px; background: var(--paper); border: 1.5px solid var(--rule); }
.style-blueprint { border-left-color: var(--teal); }
.style-action { border-left-color: var(--red-deep); }
.style-nurturing { border-left-color: var(--gold); }
.style-knowledge { border-left-color: var(--slate); }
.style-letter { display: inline-block; width: 42px; height: 42px; line-height: 42px; text-align: center; background: var(--ink); color: var(--paper); font-family: var(--serif); font-weight: 700; font-size: 22px; margin-right: 14px; vertical-align: middle; }
.style-blueprint .style-letter { background: var(--teal); }
.style-action .style-letter { background: var(--red-deep); }
.style-nurturing .style-letter { background: var(--gold); }
.style-knowledge .style-letter { background: var(--slate); }
.style-name { display: inline-block; vertical-align: middle; font-family: var(--serif); font-size: 20px; font-weight: 600; letter-spacing: -0.01em; line-height: 1.2; }
.style-name small { display: block; font-family: var(--mono); font-size: 11px; color: var(--muted); letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; margin-top: 2px; }
.style-content { margin-top: 14px; font-family: var(--serif); font-size: 15px; line-height: 1.55; }
.confidence { display: inline-block; font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; padding: 3px 8px; border: 1px solid currentColor; margin-left: 8px; font-weight: 700; }
.conf-high { color: var(--green); background: var(--green-tint); border-color: var(--green); }
.conf-medium { color: var(--gold); background: var(--gold-tint); border-color: var(--gold); }
.conf-low { color: var(--muted); background: var(--paper-warm); }
.temp-tag { display: inline-block; font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; padding: 2px 8px; margin-left: 8px; font-weight: 700; }
.temp-cold { background: #d8e6e4; color: var(--teal); }
.temp-warm { background: var(--gold-tint); color: var(--gold); }
.temp-hot { background: var(--red-tint); color: var(--red-deep); }
.journey-section { margin-bottom: 16px; padding: 14px 16px; background: var(--paper-warm); border: 1px solid var(--rule); }
.journey-section h5 { font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-bottom: 6px; }
.journey-section p { font-family: var(--serif); font-size: 15px; line-height: 1.55; margin: 0; }
.phrase-list { margin: 8px 0 12px 0; padding: 0; list-style: none; }
.phrase-list li { padding: 5px 12px; margin-bottom: 4px; background: var(--paper-warm); border-left: 3px solid var(--gold); font-family: var(--serif); font-style: italic; font-size: 14px; line-height: 1.45; }
.phrase-list.repel li { border-left-color: var(--red-deep); background: var(--red-tint); }
.mismatch-card { background: var(--red-tint); border: 1.5px solid var(--red-deep); padding: 16px 20px; margin-bottom: 14px; }
.mismatch-card h4 { font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-bottom: 8px; }
.mismatch-card p { font-family: var(--serif); font-size: 15px; line-height: 1.55; margin: 0; }
.path-toggle { display: flex; gap: 0; margin-bottom: 16px; border: 1.5px solid var(--rule); }
.path-toggle button { flex: 1; padding: 12px 16px; font-family: var(--mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; background: var(--paper); color: var(--ink); border: none; border-right: 1.5px solid var(--rule); cursor: pointer; font-weight: 600; transition: background 0.12s, color 0.12s; }
.path-toggle button:last-child { border-right: none; }
.path-toggle button.active { background: var(--ink); color: var(--paper); }
.path-toggle button:hover:not(.active) { background: var(--paper-warm); }
.ip-notice { background: var(--paper-deep); border: 1.5px solid var(--muted); padding: 12px 16px; margin: 14px 0; font-family: var(--serif); font-size: 13px; line-height: 1.5; font-style: italic; color: var(--muted); }
@media print { body { background: #fff; font-size: 11pt; } .api-key-section, .btn-row, .toc-link, .path-toggle { display: none !important; } main { padding: 0; max-width: 100%; } .card, .style-card, .mismatch-card, .journey-section { background: #fff !important; border: 1px solid #555 !important; page-break-inside: avoid; } @page { margin: 0.6in; size: letter; } }
</style>
</head>
<body>
<main>
<a href="RISER-Suite-Index.html" class="toc-link">← Suite Index · Table of Contents</a>
<div class="masthead">
<div class="kicker">Phase 1 · Step 1.2 · Buyer Decision Style</div>
<h1 class="title">How does your buyer <em>actually</em> decide?</h1>
<p class="subtitle">Most operators sell in their own decision style, not the buyer's. This step types your buyer into one of four decision styles — Blueprint, Action, Nurturing, Knowledge — and tells you what content moves them at every stage of the journey from cold to warm to hot.</p>
</div>
<div class="stages">
<div class="stage-pill active"><span class="num">1</span><span>Describe your buyer</span></div>
<div class="stage-pill" id="stage-2-pill"><span class="num">2</span><span>Decision style profile</span></div>
<div class="stage-pill" id="stage-3-pill"><span class="num">3</span><span>Save & next step</span></div>
</div>
<section id="prior-context"></section>
<div class="ip-notice">
<strong style="font-style: normal; color: var(--ink);">A note on framework lineage:</strong> This step uses a four-style decision-making framework grounded in DISC personality theory (William Marston, public domain), Cialdini's six principles of persuasion, and Eugene Schwartz's awareness staging. The four-letter mnemonic is coincidental and the methodology is not affiliated with any trademarked personality system. This is a buyer-decision-style profile for marketing application, not a clinical personality assessment.
</div>
<section id="stage-input">
<div class="field">
<label class="field-label">Which path fits your situation?</label>
<p class="field-help">If you've talked to a real buyer, describe them. If you're earlier and your avatar is more abstract, the second path generates a likely-style profile based on your business model.</p>
<div class="path-toggle">
<button id="path-specific" class="active">A · I can describe one specific buyer</button>
<button id="path-general">B · Profile my avatar in general</button>
</div>
</div>
<div class="field field-primary" id="panel-specific">
<label class="field-label" for="buyer-description">Describe one specific buyer (real or representative)</label>
<p class="field-help">100–300 words. Include: what they say in their own language, how they decide (fast/slow, alone/with others), what they ask for, what objections they raise, what closed them or stopped them. The more verbatim language, the sharper the profile.</p>
<textarea id="buyer-description" rows="8" placeholder="e.g. Sarah, partner at a 40-attorney defense firm in Phoenix. When I described the offering, she immediately asked 'have you testified in this jurisdiction before' and 'how fast can you turn around a Daubert-defensible report?' She said 'I can't risk an expert who falls apart on cross.' She wanted to see two prior reports before scheduling a call. Made the decision herself."></textarea>
</div>
<div class="field field-primary" id="panel-general" style="display: none;">
<label class="field-label" for="avatar-description">Describe your target avatar in general</label>
<p class="field-help">Don't have specific buyer conversations yet? Describe the avatar at the general level — title, industry, situation, what makes them buy this category. The profile will be a likely-style distribution, not a specific person.</p>
<textarea id="avatar-description" rows="6" placeholder="e.g. Mid-size insurance defense attorneys handling commercial property subrogation cases. Senior associates and junior partners, billing $400-650/hr. Need credentialed experts who can write Daubert-defensible reports in 10-14 days."></textarea>
</div>
<div class="api-key-section">
<h3>Anthropic API Key</h3>
<p>Stored only in localStorage. <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noopener" style="color: var(--red-deep);">Get a key</a>. Carries between RISER files in same browser if localStorage allows.</p>
<input type="password" id="api-key" placeholder="sk-ant-…" autocomplete="off">
<div class="model-toggle">
<button id="model-sonnet" class="active" data-model="claude-sonnet-4-6">Sonnet 4.6 (faster · cheaper)</button>
<button id="model-opus" data-model="claude-opus-4-7">Opus 4.7 (highest quality)</button>
</div>
</div>
<div class="btn-row">
<a href="RISER-Step-1.1-Idea-Capture.html" class="btn btn-ghost">← Step 1.1</a>
<a href="RISER-Suite-Index.html" class="btn btn-ghost">Suite Index</a>
<button class="btn btn-primary" id="profile-btn" disabled>Generate decision-style profile →</button>
</div>
<div id="input-hint" class="setup-hint" style="display: none;"></div>
</section>
<section id="stage-profile" style="display: none;">
<div id="loading-state" class="loading-state" style="display: none;">
<div><span class="dot">•</span><span class="dot">•</span><span class="dot">•</span></div>
<div class="loading-step-text" id="loading-step-text">Reading your buyer description…</div>
</div>
<div id="profile-output"></div>
</section>
</main>
<script>
'use strict';
const STATE_KEY = 'riser:operator:v1';
const STEP_ID = 'phase-1.2';
const ANTI_FAB = `
CRITICAL ANTI-FABRICATION RULES — non-negotiable:
1. NEVER invent fake firm names, fake people's names, fake testimonials, or fabricated quotes.
2. NEVER write specific outcome guarantees ("this generates X leads per month").
3. NEVER fabricate market sizes, percentages, or revenue projections.
4. If you lack deep niche knowledge, SAY SO EXPLICITLY in caveats. Don't bluff.
5. Use [BRACKETS] for all user-fill placeholders.
6. For regulated activity (legal, medical, financial, MLM), include compliance reminders.
7. Match the operator's stated business model. No generic advice that ignores the input.`;
function loadState() { try { const r = localStorage.getItem(STATE_KEY); return r ? JSON.parse(r) : {}; } catch (e) { return {}; } }
function saveState(s) { try { localStorage.setItem(STATE_KEY, JSON.stringify(s)); } catch (e) {} }
function setStepOutput(id, output) {
const s = loadState(); s.outputs = s.outputs || {};
s.outputs[id] = Object.assign({}, output, { completedAt: new Date().toISOString() });
saveState(s);
}
function getStepOutput(id) { const s = loadState(); return (s.outputs || {})[id] || null; }
function escapeHtml(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); }
function el(id) { return document.getElementById(id); }
function copyToClipboard(text, btn) {
if (!navigator.clipboard) return alert('Clipboard not available');
navigator.clipboard.writeText(text).then(() => {
if (btn) { const o = btn.textContent; btn.textContent = 'Copied ✓'; btn.classList.add('copied'); setTimeout(() => { btn.textContent = o; btn.classList.remove('copied'); }, 1600); }
});
}
const state = loadState();
let priorIdea = getStepOutput('phase-1.1');
let priorParagraph = priorIdea ? priorIdea.paragraph : '';
let priorBusinessModel = priorIdea ? priorIdea.businessModel : '';
let path = 'specific';
if (state.apiKey) el('api-key').value = state.apiKey;
if (state.model === 'claude-opus-4-7') {
document.querySelectorAll('.model-toggle button').forEach(b => b.classList.remove('active'));
el('model-opus').classList.add('active');
}
// Render prior context (Step 1.1) or manual paste fallback
const priorEl = el('prior-context');
function renderPriorContext() {
if (priorParagraph && priorParagraph.length > 50) {
priorEl.innerHTML =
'<div class="card card-warm" style="border-left: 4px solid var(--teal);">' +
'<div class="card-header"><div class="card-num">CONTEXT FROM STEP 1.1</div><h3>Your refined business idea</h3></div>' +
'<p style="font-style: italic;">' + escapeHtml(priorParagraph) + '</p>' +
'<p style="font-size: 13px; color: var(--muted); margin-top: 10px;">This is being used as context. <a href="#" id="edit-prior" style="color: var(--red-deep);">Replace it manually</a> if needed.</p>' +
'</div>';
document.getElementById('edit-prior').addEventListener('click', function(e) { e.preventDefault(); showManualPriorInput(); });
} else {
showManualPriorInput();
}
}
function showManualPriorInput() {
priorEl.innerHTML =
'<div class="banner banner-warn"><strong>No Step 1.1 context found in this browser.</strong> Either complete Step 1.1 first (recommended), or paste your refined idea paragraph below to give Claude context. The profile works without it but will be sharper with it.</div>' +
'<div class="field"><label class="field-label" for="manual-prior">Paste your refined idea paragraph here (optional)</label>' +
'<textarea id="manual-prior" rows="4" placeholder="Paste the 5-sentence paragraph from Step 1.1 here, or leave blank to skip."></textarea></div>';
document.getElementById('manual-prior').addEventListener('input', e => { priorParagraph = e.target.value.trim(); checkReady(); });
}
renderPriorContext();
// Path toggle
el('path-specific').addEventListener('click', () => {
path = 'specific';
el('path-specific').classList.add('active'); el('path-general').classList.remove('active');
el('panel-specific').style.display = 'block'; el('panel-general').style.display = 'none';
checkReady();
});
el('path-general').addEventListener('click', () => {
path = 'general';
el('path-general').classList.add('active'); el('path-specific').classList.remove('active');
el('panel-general').style.display = 'block'; el('panel-specific').style.display = 'none';
checkReady();
});
el('api-key').addEventListener('input', e => { const s = loadState(); s.apiKey = e.target.value.trim(); saveState(s); checkReady(); });
document.querySelectorAll('.model-toggle button').forEach(b => {
b.addEventListener('click', () => {
document.querySelectorAll('.model-toggle button').forEach(x => x.classList.remove('active'));
b.classList.add('active');
const s = loadState(); s.model = b.dataset.model; saveState(s);
});
});
el('buyer-description').addEventListener('input', checkReady);
el('avatar-description').addEventListener('input', checkReady);
function getInputText() {
return path === 'specific' ? el('buyer-description').value.trim() : el('avatar-description').value.trim();
}
function checkReady() {
const text = getInputText();
const key = el('api-key').value.trim();
const ok = text.length >= 50 && key.length >= 20;
el('profile-btn').disabled = !ok;
const hint = el('input-hint');
if (ok) hint.style.display = 'none';
else {
const missing = [];
if (key.length < 20) missing.push('API key (≥20 chars)');
if (text.length < 50) missing.push('Buyer description (≥50 chars; you have ' + text.length + ')');
hint.textContent = 'Still needed: ' + missing.join(' · ');
hint.style.display = 'block';
}
}
// Restore saved
const saved = getStepOutput(STEP_ID);
if (saved) {
if (saved.path) {
path = saved.path;
if (path === 'general') el('path-general').click();
}
if (saved.inputText) {
if (path === 'specific') el('buyer-description').value = saved.inputText;
else el('avatar-description').value = saved.inputText;
}
if (saved.profile) showProfile(saved.profile);
}
checkReady();
el('profile-btn').addEventListener('click', generateProfile);
async function callClaude(sys, user, opts) {
opts = opts || {};
const s = loadState();
const body = {
model: opts.model || s.model || 'claude-sonnet-4-6',
max_tokens: opts.maxTokens || 4000,
system: sys, messages: [{ role: 'user', content: user }]
};
const r = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-api-key': s.apiKey, 'anthropic-version': '2023-06-01', 'anthropic-dangerous-direct-browser-access': 'true' },
body: JSON.stringify(body)
});
if (!r.ok) throw new Error('API error ' + r.status + ': ' + (await r.text()).slice(0, 220));
const d = await r.json();
return (d.content && d.content[0] && d.content[0].text) || '';
}
function extractJSON(text) {
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
if (fenced) { try { return JSON.parse(fenced[1].trim()); } catch (e) {} }
const start = text.indexOf('{'), end = text.lastIndexOf('}');
if (start !== -1 && end > start) { try { return JSON.parse(text.slice(start, end + 1)); } catch (e) {} }
throw new Error('Could not parse JSON from response');
}
async function generateProfile() {
const inputText = getInputText();
el('stage-input').style.display = 'none';
el('stage-profile').style.display = 'block';
el('loading-state').style.display = 'block';
el('profile-output').innerHTML = '';
el('stage-2-pill').classList.add('active');
const steps = ['Reading your buyer description…', 'Identifying decision-making patterns…', 'Typing dominant style…', 'Mapping cold/warm/hot journey content…', 'Surfacing activating phrases…', 'Flagging mismatch risks…', 'Drafting your operator playbook…'];
let idx = 0;
const interval = setInterval(() => { idx = Math.min(idx + 1, steps.length - 1); el('loading-step-text').textContent = steps[idx]; }, 3500);
const sys = `You are an expert in buyer psychology working in the lineage of public-domain frameworks: DISC personality theory (William Marston), Robert Cialdini's six principles of persuasion, and Eugene Schwartz's awareness staging. You produce decision-style profiles for buyers, calibrated to the operator's specific business model.
THE FOUR DECISION STYLES — public-domain framework categories, not licensed B.A.N.K. methodology:
B — BLUEPRINT-DRIVEN (Plan-first):
- Decides slowly, methodically. Wants structure, documentation, predictability.
- Asks: "What's the process? Milestones? Warranty?"
- Activated by: authority, consistency, written guarantees, step-by-step plans.
- Repelled by: vague timelines, "we'll figure it out," high-pressure closes.
- Cialdini levers: Authority + Consistency.
A — ACTION-DRIVEN (Move-fast):
- Decides fast. Wants results, hates lengthy proposals. Values speed and outcome.
- Asks: "How fast? ROI? Who else like me has done this?"
- Activated by: scarcity, social proof, fast wins, decisive language.
- Repelled by: long process documents, slow timelines, theory without practice.
- Cialdini levers: Scarcity + Social Proof.
N — NURTURING-DRIVEN (Relationship-first):
- Decides through trust. Wants to feel heard. Cares about reputation, ethics, fit.
- Asks: "Who else have you helped? Will I be in good hands? Do you really understand?"
- Activated by: liking, reciprocity, story-based selling, evidence of care.
- Repelled by: hard sells, transactional language, name-dropping for status.
- Cialdini levers: Liking + Reciprocity.
K — KNOWLEDGE-DRIVEN (Detail-first):
- Decides through evidence. Wants data, deep proof, technical detail.
- Asks: "Methodology? Show me the data. Failure rate?"
- Activated by: precision, technical authority, transparent data, careful logic.
- Repelled by: hand-waving, marketing speak, oversimplification, unsourced claims.
- Cialdini levers: Authority + Logos.
Most buyers are MIX of dominant + secondary. Always identify both.
THE BUYER'S JOURNEY — temperature-calibrated content:
- COLD: buyer doesn't know they have a problem. Goal: surface problem in their words.
- WARM: buyer knows problem, researching solutions. Goal: prove your approach works.
- HOT: buyer is comparing alternatives or buying. Goal: remove final objections.
Different decision styles need different content at each temperature. The profile must address both axes.
Return EXACTLY this JSON, no fences, no prose:
{
"dominant_style": "blueprint" | "action" | "nurturing" | "knowledge",
"dominant_confidence": "high" | "medium" | "low",
"secondary_style": "blueprint" | "action" | "nurturing" | "knowledge",
"summary": "2-3 sentences plain language",
"decision_pattern": "1 paragraph 50-100 words: how dominant + secondary mix expresses",
"cold_stage_content": "What moves this buyer at cold stage. 60-100 words.",
"warm_stage_content": "What moves this buyer at warm stage. 60-100 words.",
"hot_stage_content": "What closes this buyer at hot stage. 60-100 words.",
"activating_phrases": ["5 verbatim phrases 6-15 words each"],
"repelling_phrases": ["5 verbatim phrases 6-15 words each"],
"likely_objections": ["3-5 specific objections in their voice 10-25 words each"],
"seller_mismatch_warning": "1 paragraph 60-100 words: how operator will mis-fire if natural style differs from buyer's, what to adjust",
"caveats": ["1-3 honest limitations"]
}` + ANTI_FAB;
const businessContext = priorParagraph
? 'Business idea (from Step 1.1):\n' + priorParagraph + '\n\nBusiness model: ' + (priorBusinessModel || 'unspecified') + '\n\n'
: 'No prior business context available.\n\n';
const inputContext = path === 'specific'
? 'PATH A — Specific buyer description:\n' + inputText
: 'PATH B — General avatar description (no specific buyer yet):\n' + inputText + '\n\nNote: produce likely-style profile based on most common decision style for this avatar in this business model. Mark dominant_confidence as "medium" or "low".';
const user = businessContext + inputContext + '\n\nProfile this buyer.';
try {
const text = await callClaude(sys, user, { maxTokens: 4000 });
const obj = extractJSON(text);
const required = ['dominant_style', 'dominant_confidence', 'secondary_style', 'summary', 'decision_pattern', 'cold_stage_content', 'warm_stage_content', 'hot_stage_content', 'activating_phrases', 'repelling_phrases', 'likely_objections', 'seller_mismatch_warning'];
for (const r of required) { if (!(r in obj)) throw new Error('Profile missing required field: ' + r); }
clearInterval(interval);
el('loading-state').style.display = 'none';
setStepOutput(STEP_ID, {
path: path, inputText: inputText,
businessIdea: priorParagraph || null,
profile: obj
});
showProfile(obj);
} catch (err) {
clearInterval(interval);
el('loading-state').style.display = 'none';
el('profile-output').innerHTML = '<div class="banner banner-warn"><strong>Profile generation failed.</strong> ' + escapeHtml(err.message || 'Unknown error') + '<br><br>Common causes: API key issue · rate limit · network · malformed JSON.<br><br><a href="#" onclick="location.reload();return false;" style="color: var(--red-deep);">Try again</a></div>';
}
}
const STYLE_META = {
blueprint: { letter: 'B', name: 'Blueprint-driven', tagline: 'Plan-first · structured · methodical', cls: 'style-blueprint' },
action: { letter: 'A', name: 'Action-driven', tagline: 'Move-fast · results · decisive', cls: 'style-action' },
nurturing: { letter: 'N', name: 'Nurturing-driven', tagline: 'Relationship-first · trust · care', cls: 'style-nurturing' },
knowledge: { letter: 'K', name: 'Knowledge-driven', tagline: 'Detail-first · evidence · technical', cls: 'style-knowledge' }
};
function showProfile(p) {
let html = '';
const dom = STYLE_META[p.dominant_style] || STYLE_META.knowledge;
const sec = STYLE_META[p.secondary_style] || null;
const confCls = 'conf-' + (p.dominant_confidence || 'medium');
html += '<div class="style-card ' + dom.cls + '">';
html += '<span class="style-letter">' + dom.letter + '</span>';
html += '<div class="style-name" style="display: inline-block;">' + escapeHtml(dom.name);
html += '<span class="confidence ' + confCls + '">' + escapeHtml((p.dominant_confidence || 'medium').toUpperCase()) + ' CONFIDENCE</span>';
html += '<small>' + escapeHtml(dom.tagline) + '</small></div>';
html += '<div class="style-content"><p>' + escapeHtml(p.summary) + '</p></div></div>';
if (sec && p.secondary_style !== p.dominant_style) {
html += '<div class="style-card ' + sec.cls + '" style="opacity: 0.92;">';
html += '<span class="style-letter">' + sec.letter + '</span>';
html += '<div class="style-name" style="display: inline-block;">' + escapeHtml(sec.name);
html += '<span class="confidence" style="background: var(--paper-warm); color: var(--muted); border-color: var(--muted);">SECONDARY</span>';
html += '<small>' + escapeHtml(sec.tagline) + '</small></div></div>';
}
html += '<div class="card"><div class="card-header"><div class="card-num">DECISION PATTERN</div><h3>How the mix expresses itself</h3></div>';
html += '<p>' + escapeHtml(p.decision_pattern) + '</p></div>';
html += '<div class="card"><div class="card-header"><div class="card-num">BUYER\'S JOURNEY</div><h3>Content for each stage</h3></div>';
html += '<div class="journey-section"><h5>Cold stage <span class="temp-tag temp-cold">COLD</span></h5><p>' + escapeHtml(p.cold_stage_content) + '</p></div>';
html += '<div class="journey-section"><h5>Warm stage <span class="temp-tag temp-warm">WARM</span></h5><p>' + escapeHtml(p.warm_stage_content) + '</p></div>';
html += '<div class="journey-section"><h5>Hot stage <span class="temp-tag temp-hot">HOT</span></h5><p>' + escapeHtml(p.hot_stage_content) + '</p></div></div>';
html += '<div class="card"><div class="card-header"><div class="card-num">PHRASES</div><h3>What activates / what repels</h3></div>';
html += '<p style="font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--green); font-weight: 700; margin-top: 6px;">Activating phrases</p>';
html += '<ul class="phrase-list">' + (p.activating_phrases || []).map(ph => '<li>' + escapeHtml(ph) + '</li>').join('') + '</ul>';
html += '<p style="font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--red-deep); font-weight: 700; margin-top: 14px;">Repelling phrases (avoid)</p>';
html += '<ul class="phrase-list repel">' + (p.repelling_phrases || []).map(ph => '<li>' + escapeHtml(ph) + '</li>').join('') + '</ul></div>';
html += '<div class="card"><div class="card-header"><div class="card-num">OBJECTIONS</div><h3>Likely objections, ranked</h3></div><ul style="list-style: none; padding: 0;">';
(p.likely_objections || []).forEach((o, i) => {
html += '<li style="padding: 8px 0 8px 30px; position: relative; font-family: var(--serif); font-size: 15px; line-height: 1.55; border-bottom: 1px dashed var(--muted);"><span style="position: absolute; left: 0; font-family: var(--mono); font-weight: 700; color: var(--red-deep);">' + (i + 1) + '.</span>' + escapeHtml(o) + '</li>';
});
html += '</ul></div>';
html += '<div class="mismatch-card"><h4>⚠ Seller mismatch — your blind spot</h4><p>' + escapeHtml(p.seller_mismatch_warning) + '</p></div>';
if (p.caveats && p.caveats.length > 0) {
html += '<div class="banner banner-info"><strong>Caveats:</strong> ' + p.caveats.map(escapeHtml).join(' · ') + '</div>';
}
const summaryText = buildPlainTextSummary(p, dom, sec);
html += '<div class="btn-row">';
html += '<button class="btn btn-ghost" id="edit-again-btn">← Edit input</button>';
html += '<button class="btn" id="copy-summary-btn">Copy profile as text</button>';
html += '<a href="RISER-Suite-Index.html" class="btn">Suite Index</a>';
html += '</div>';
html += '<div class="banner banner-info" style="margin-top: 14px;"><strong>Hand-off note:</strong> Step 1.3 (Pain Discovery) is not yet built as a standalone file. When it ships, it will read this profile from localStorage if your browser allows. Profile saved.</div>';
el('profile-output').innerHTML = html;
el('stage-3-pill').classList.add('active');
document.getElementById('edit-again-btn').addEventListener('click', function() {
el('stage-input').style.display = 'block'; el('stage-profile').style.display = 'none';
el('stage-2-pill').classList.remove('active'); el('stage-3-pill').classList.remove('active');
window.scrollTo({ top: 0, behavior: 'smooth' });
});
document.getElementById('copy-summary-btn').addEventListener('click', function() { copyToClipboard(summaryText, this); });
}
function buildPlainTextSummary(p, dom, sec) {
let s = 'BUYER DECISION STYLE PROFILE\n============================\n\n';
s += 'Dominant: ' + dom.name + ' (' + (p.dominant_confidence || 'medium').toUpperCase() + ' confidence)\n';
if (sec && p.secondary_style !== p.dominant_style) s += 'Secondary: ' + sec.name + '\n';
s += '\nSUMMARY\n' + p.summary + '\n\nDECISION PATTERN\n' + p.decision_pattern + '\n';
s += '\nBUYER\'S JOURNEY\n\n[COLD]\n' + p.cold_stage_content + '\n\n[WARM]\n' + p.warm_stage_content + '\n\n[HOT]\n' + p.hot_stage_content + '\n';
s += '\nACTIVATING PHRASES\n';
(p.activating_phrases || []).forEach((ph, i) => { s += (i + 1) + '. ' + ph + '\n'; });
s += '\nREPELLING PHRASES (avoid)\n';
(p.repelling_phrases || []).forEach((ph, i) => { s += (i + 1) + '. ' + ph + '\n'; });
s += '\nLIKELY OBJECTIONS\n';
(p.likely_objections || []).forEach((o, i) => { s += (i + 1) + '. ' + o + '\n'; });
s += '\nSELLER MISMATCH WARNING\n' + p.seller_mismatch_warning + '\n';
if (p.caveats && p.caveats.length) {
s += '\nCAVEATS\n';
p.caveats.forEach((c, i) => { s += (i + 1) + '. ' + c + '\n'; });
}
return s;
}
console.log('RISER Step 1.2 Buyer Decision Style loaded. Prior context:', priorParagraph ? 'yes' : 'no', '· Saved:', saved ? 'yes' : 'no');
</script>
</body>
</html>
Original asset: RISER-Suite-Index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RISER Suite Index · Operator's Kit</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter+Tight:[email protected]&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a; --paper: #f7f4ee; --paper-warm: #f0eadf; --paper-deep: #e9e2d2;
--rule: #1a1a1a; --red: #c9302a; --red-deep: #8b1f1c; --red-tint: #fbe8e6;
--green: #1d6e3a; --green-tint: #dcefe2; --gold: #b8893a; --gold-tint: #f5ead0;
--teal: #2c5f5a; --teal-tint: #d8e6e4; --muted: #5a564f;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body { font-family: var(--sans); background: var(--paper); color: var(--ink); line-height: 1.55; font-size: 15px; min-height: 100vh; }
main { max-width: 1000px; margin: 0 auto; padding: 48px 32px 80px; }
.masthead { border-bottom: 3px double var(--rule); padding-bottom: 28px; margin-bottom: 36px; }
.kicker { font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; display: flex; align-items: center; gap: 14px; }
.kicker::after { content: ''; flex: 1; height: 1px; background: var(--rule); opacity: 0.3; }
.title { font-family: var(--serif); font-weight: 600; font-size: clamp(36px, 5vw, 56px); line-height: 1.02; letter-spacing: -0.025em; margin-bottom: 14px; }
.title em { font-style: italic; font-weight: 400; color: var(--red-deep); }
.subtitle { font-family: var(--serif); font-style: italic; font-size: 18px; color: var(--muted); max-width: 760px; line-height: 1.5; }
.section-header {
font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
color: var(--red-deep); font-weight: 700;
margin: 36px 0 16px; padding-bottom: 8px;
border-bottom: 1.5px solid var(--rule);
display: flex; align-items: center; gap: 12px;
}
.section-header .num {
font-family: var(--serif); font-style: italic; font-size: 14px;
font-weight: 400; color: var(--muted); letter-spacing: 0;
text-transform: none;
}
.intro-card {
background: var(--paper-warm);
border: 1.5px solid var(--rule);
border-left: 4px solid var(--red-deep);
padding: 24px 28px;
margin-bottom: 32px;
}
.intro-card h3 {
font-family: var(--serif); font-weight: 600; font-size: 22px;
letter-spacing: -0.015em; line-height: 1.2; margin-bottom: 12px;
}
.intro-card p {
font-family: var(--serif); font-size: 16px; line-height: 1.6; margin-bottom: 12px;
}
.intro-card p:last-child { margin-bottom: 0; }
.intro-card strong { font-weight: 700; color: var(--ink); }
.start-here-banner {
background: var(--gold-tint); border: 1.5px solid var(--gold);
border-left: 4px solid var(--gold);
padding: 16px 20px; margin-bottom: 24px;
font-family: var(--serif); font-size: 15px; line-height: 1.55;
}
.start-here-banner strong { font-weight: 700; color: var(--ink); }
.artifact-grid {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
margin-bottom: 8px;
}
.artifact-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 22px 24px;
display: block;
text-decoration: none;
color: var(--ink);
transition: transform 0.12s, box-shadow 0.12s, background 0.12s;
}
.artifact-card:hover {
transform: translateY(-2px);
box-shadow: 4px 4px 0 var(--rule);
background: var(--paper-warm);
}
.artifact-card.featured {
border-left: 4px solid var(--red-deep);
}
.artifact-card.live-step {
border-left: 4px solid var(--green);
}
.artifact-card.coming-soon {
opacity: 0.55;
background: var(--paper-deep);
cursor: default;
pointer-events: none;
}
.artifact-card.doctrine {
border-left: 4px solid var(--teal);
}
.card-row {
display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap;
margin-bottom: 8px;
}
.artifact-num {
font-family: var(--mono); font-size: 11px; font-weight: 700;
color: var(--red-deep); letter-spacing: 0.12em;
min-width: 38px;
}
.artifact-name {
font-family: var(--serif); font-size: 22px; font-weight: 600;
letter-spacing: -0.015em; line-height: 1.2; flex: 1;
}
.artifact-tag {
font-family: var(--mono); font-size: 10px; font-weight: 700;
letter-spacing: 0.1em; text-transform: uppercase;
padding: 3px 8px; border: 1px solid currentColor;
}
.tag-doctrine { color: var(--teal); background: var(--teal-tint); border-color: var(--teal); }
.tag-widget { color: var(--red-deep); background: var(--red-tint); border-color: var(--red-deep); }
.tag-step { color: var(--green); background: var(--green-tint); border-color: var(--green); }
.tag-soon { color: var(--muted); background: var(--paper-warm); border-color: var(--muted); }
.tag-reference { color: var(--gold); background: var(--gold-tint); border-color: var(--gold); }
.artifact-desc {
font-family: var(--serif); font-size: 15px; line-height: 1.55;
margin-bottom: 10px;
}
.artifact-when {
font-family: var(--mono); font-size: 11px; letter-spacing: 0.06em;
color: var(--muted); padding-top: 10px; border-top: 1px dashed var(--rule);
line-height: 1.55;
}
.artifact-when strong { color: var(--red-deep); font-weight: 700; }
.usage-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 24px 28px;
margin-bottom: 24px;
}
.usage-card h4 {
font-family: var(--mono); font-size: 12px; letter-spacing: 0.14em;
text-transform: uppercase; color: var(--red-deep); font-weight: 700;
margin-bottom: 10px;
}
.usage-card p { font-family: var(--serif); font-size: 15px; line-height: 1.6; margin-bottom: 10px; }
.usage-card ol, .usage-card ul {
font-family: var(--serif); font-size: 15px; line-height: 1.6;
padding-left: 22px; margin-bottom: 10px;
}
.usage-card li { margin-bottom: 6px; }
.usage-card code {
font-family: var(--mono); font-size: 13px;
background: var(--paper-warm); padding: 1px 6px;
border: 1px solid var(--rule);
}
.foot-discipline {
margin-top: 40px; padding-top: 24px;
border-top: 1.5px solid var(--rule);
font-family: var(--serif); font-size: 14px; line-height: 1.6;
color: var(--muted); font-style: italic;
}
.foot-discipline strong { font-style: normal; color: var(--ink); font-weight: 700; }
@media print {
body { background: #fff; font-size: 11pt; }
.artifact-card { background: #fff !important; border: 1px solid #555 !important; page-break-inside: avoid; }
@page { margin: 0.6in; size: letter; }
}
</style>
</head>
<body>
<main>
<div class="masthead">
<div class="kicker">RISER · Captain's Logic Operating Doctrine · v1</div>
<h1 class="title">The Suite <em>Index</em></h1>
<p class="subtitle">Ten artifacts for operators building real businesses — Etsy crafts, digital products, professional services, coaching, brick-and-mortar, affiliate programs. Each tool is a single self-contained HTML file. Open this index, pick the one you need, and double-click to open it. Outputs save to your browser between files in most cases.</p>
</div>
<div class="intro-card">
<h3>How this kit is organized</h3>
<p>RISER is built as a <strong>doctrine document</strong> (the spine), <strong>five widgets</strong> (the work), and <strong>two new step pages</strong> (the foundation work — Phase 1). Plus a script and reference markdown.</p>
<p>The doctrine document tells you <em>where you are</em> in the work — what phase, what step. The widgets execute the work for that step. The two step pages walk you through the foundational moves before you touch the bigger widgets.</p>
<p><strong>Don't try to use everything at once.</strong> Pick the artifact that maps to where you actually are right now. Walk it. Save the output. Move to the next one when ready.</p>
</div>
<div class="start-here-banner">
<strong>Don't know where to start?</strong> Open the <strong>RISER Operator's Flow doctrine document</strong> below. It explains the 5 phases / 22 steps and tells you which widget belongs at each step. That's the spine. Everything else hangs from it.
</div>
<!-- ============ THE SPINE ============ -->
<div class="section-header">
<span>The Spine</span>
<span class="num">— start here if you're new to the kit</span>
</div>
<div class="artifact-grid">
<a class="artifact-card doctrine" href="RISER-Operators-Flow.html">
<div class="card-row">
<span class="artifact-num">DOC 01</span>
<span class="artifact-name">RISER Operator's Flow — Doctrine Document</span>
<span class="artifact-tag tag-doctrine">Doctrine</span>
</div>
<p class="artifact-desc">Five phases, 22 steps, one continuous feedback loop. Each step has done-when criteria, common failure modes, AI/tool layer guidance graded Real / Useful With Caveats / Mostly Theater, and a map to which RISER widget belongs at that step. Burning-vs-chronic pain prioritization. Identity Commoditization risk named. Reads as an operator's logbook, not a vision document.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> You're new to the kit · You're uncertain which phase you're in · You finish a step and want to know what comes next · You're recovering from a stall and need to diagnose where things broke.</p>
</a>
</div>
<!-- ============ PHASE 1 STEP PAGES ============ -->
<div class="section-header">
<span>Phase 1 Step Pages</span>
<span class="num">— foundation work, walked one step at a time</span>
</div>
<div class="artifact-grid">
<a class="artifact-card live-step" href="RISER-Step-1.1-Idea-Capture.html">
<div class="card-row">
<span class="artifact-num">STEP 1.1</span>
<span class="artifact-name">Idea Capture</span>
<span class="artifact-tag tag-step">Live · Claude API</span>
</div>
<p class="artifact-desc">Refines your raw business idea into a disciplined 5-sentence paragraph: WHO + PROBLEM + SOLUTION + PRICE TIER + WHY YOU. The constraint forces clarity. Honest gaps get marked with [BRACKETS] instead of fabricated. Universal across business models — Etsy, digital, services, coaching, local, affiliate. ~200 words output. Saves to localStorage.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> You have an idea and need to sharpen it · You're stuck describing what you do · You want to feed the same paragraph into multiple downstream tools.</p>
</a>
<a class="artifact-card live-step" href="RISER-Step-1.2-Buyer-Decision-Style.html">
<div class="card-row">
<span class="artifact-num">STEP 1.2</span>
<span class="artifact-name">Buyer Decision Style Profile</span>
<span class="artifact-tag tag-step">Live · Claude API</span>
</div>
<p class="artifact-desc">Types your buyer into one of four decision styles — Blueprint, Action, Nurturing, Knowledge — and tells you what content moves them across cold/warm/hot stages of the journey. Activating phrases. Repelling phrases. Likely objections ranked. <strong>Seller mismatch warning</strong> — the highest-leverage piece — names how your natural selling style will mis-fire if it doesn't match this buyer's decision style. Public-domain framework lineage (DISC + Cialdini + Schwartz), not licensed B.A.N.K. methodology.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> You finish Step 1.1 and want to understand HOW your buyer decides · You've had real buyer conversations and want to type the patterns · You're writing copy and don't know what tone fits · You suspect you're losing buyers because of style mismatch.</p>
</a>
</div>
<!-- ============ THE FIVE WIDGETS ============ -->
<div class="section-header">
<span>The Widgets</span>
<span class="num">— interactive tools that do the work for specific steps</span>
</div>
<div class="artifact-grid">
<a class="artifact-card featured" href="RISER-MVO-Widget-Direct.html">
<div class="card-row">
<span class="artifact-num">WIDGET 01</span>
<span class="artifact-name">MVO Decision Engine — 17 Gates</span>
<span class="artifact-tag tag-widget">Widget · Claude API</span>
</div>
<p class="artifact-desc">Validates a business idea through 17 sequential gates — burning-pain test, willingness-to-pay test, kill-criterion definition, MVP scope, channel readiness. Verdict: GO / NO / REWORK with specific reasoning. Anti-fabrication discipline throughout. Designed for operators considering whether to commit to an idea, not retroactive rationalization of one already chosen.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> Operator's Flow Step 1.1, 1.3, 1.4 (Idea Capture → Pain Discovery → Offer Hypothesis) · You're considering an idea and want hard validation before committing · You have a working business but want to test a new direction.</p>
</a>
<a class="artifact-card featured" href="RISER-Marketing-Plan-Generator.html">
<div class="card-row">
<span class="artifact-num">WIDGET 02</span>
<span class="artifact-name">Marketing Plan Generator</span>
<span class="artifact-tag tag-widget">Widget · Claude API</span>
</div>
<p class="artifact-desc">Three-stage interactive plan generator. Profession + avatar + 4 sharpening questions → 10-section custom marketing plan. Includes pre-filled scan buttons (Reddit, Google, LinkedIn, AnswerThePublic, SparkToro, PainOnSocial), three channel-specific outreach scripts (LinkedIn / Cold Email / Reddit reply) with copy buttons. Print stylesheet included.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> Operator's Flow Phase 2 (Asset Build) and early Phase 3 (Acquisition) · You have a validated business and need a coherent plan, not a list of tactics · You want a written deliverable to tape to the wall and execute against.</p>
</a>
<a class="artifact-card featured" href="RISER-Tool-Catalog.html">
<div class="card-row">
<span class="artifact-num">WIDGET 03</span>
<span class="artifact-name">Pain Discovery Tool Catalog</span>
<span class="artifact-tag tag-widget">Widget</span>
</div>
<p class="artifact-desc">41 verified tools across 7 tiers for surfacing buyer pain in their own language. Reddit scrapers, social listening, review mining, search-intent tools, survey platforms, interview transcript tools. Real pricing. Honest tradeoffs (fast/slow, expensive/free, broad/deep). No fabricated metrics.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> Operator's Flow Step 1.3 (Pain Discovery) · Your idea paragraph from Step 1.1 has a vague PROBLEM sentence · You need verbatim pain language to write a lead magnet, sales page, or outreach script.</p>
</a>
<a class="artifact-card featured" href="RISER-Client-Acquisition-Catalog.html">
<div class="card-row">
<span class="artifact-num">WIDGET 04</span>
<span class="artifact-name">Client Acquisition Tool Catalog</span>
<span class="artifact-tag tag-widget">Widget</span>
</div>
<p class="artifact-desc">39 verified tools across 7 channels for high-ticket professional service acquisition: Visitor ID, Expert Directories, LinkedIn, B2B Contact Data, Legal Intel, Outreach + CRM, Reputation. Six-step buyer journey framework. Dream 100 template. Real pricing.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> Operator's Flow Phase 3 (Acquisition) · You sell professional services or coaching at $5K+ deal size · You're building a Dream 100 list · You need to know which tool fills which gap before you spend.</p>
</a>
<a class="artifact-card featured" href="RISER-MVO-Widget-Explainer-Script.docx">
<div class="card-row">
<span class="artifact-num">WIDGET 05</span>
<span class="artifact-name">MVO Widget Explainer Script</span>
<span class="artifact-tag tag-reference">Reference · Word Doc</span>
</div>
<p class="artifact-desc">Talking-head video script (~28-35 min runtime) walking through the MVO Decision Engine. 8 sections. Doctrine pull-quotes. Designed for an operator-creator explaining the tool, not a tutorial-style demo. Word document for editing.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> You're recording video content explaining the MVO widget · You want script structure for a similar walk-through video on a different RISER artifact · You're building lead magnets that include video.</p>
</a>
</div>
<!-- ============ REFERENCE FILES ============ -->
<div class="section-header">
<span>Reference Files</span>
<span class="num">— source material, editable copies</span>
</div>
<div class="artifact-grid">
<a class="artifact-card" href="RISER-Operators-Flow.md" style="border-left: 4px solid var(--gold);">
<div class="card-row">
<span class="artifact-num">REF 01</span>
<span class="artifact-name">Operator's Flow — Markdown Source</span>
<span class="artifact-tag tag-reference">Markdown</span>
</div>
<p class="artifact-desc">The doctrine document in markdown form. Editable. Use this if you want to modify the flow for your own context, embed it in Notion or Obsidian, or feed it to another LLM as context for downstream work.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> You want to fork the doctrine for your own use · You're feeding RISER context into another tool · You prefer reading in markdown.</p>
</a>
<a class="artifact-card" href="RISER-Widget-Pain-Discovery-Tools-Merged.md" style="border-left: 4px solid var(--gold);">
<div class="card-row">
<span class="artifact-num">REF 02</span>
<span class="artifact-name">Pain Discovery Tools — Markdown Source</span>
<span class="artifact-tag tag-reference">Markdown</span>
</div>
<p class="artifact-desc">The Pain Discovery Tool Catalog source content in markdown. Useful for customization or pulling individual tool entries into other documents.</p>
<p class="artifact-when"><strong>USE WHEN:</strong> You want to extract specific tool reviews · You're adding new tools and want to maintain the same format.</p>
</a>
</div>
<!-- ============ COMING SOON STEPS ============ -->
<div class="section-header">
<span>Phase 1 Steps Still To Build</span>
<span class="num">— planned step pages, not yet shipped</span>
</div>
<div class="artifact-grid">
<div class="artifact-card coming-soon">
<div class="card-row">
<span class="artifact-num">STEP 1.3</span>
<span class="artifact-name">Pain Discovery</span>
<span class="artifact-tag tag-soon">Soon</span>
</div>
<p class="artifact-desc">Walks operator through pain discovery using prior context (Step 1.1 idea + Step 1.2 buyer profile). Produces a structured pain document with verbatim quotes, burning-vs-chronic tagging, and ranked priority. In the meantime, use the Pain Discovery Tool Catalog widget above.</p>
</div>
<div class="artifact-card coming-soon">
<div class="card-row">
<span class="artifact-num">STEP 1.4</span>
<span class="artifact-name">Offer Hypothesis</span>
<span class="artifact-tag tag-soon">Soon</span>
</div>
<p class="artifact-desc">Drafts an offer hypothesis using Hormozi-lineage value-equation thinking calibrated to the buyer's decision style. Defines kill criterion. Pressure-tests pricing. In the meantime, use Section 06 of the Marketing Plan Generator output.</p>
</div>
<div class="artifact-card coming-soon">
<div class="card-row">
<span class="artifact-num">STEP 1.5</span>
<span class="artifact-name">MVP / Service Definition</span>
<span class="artifact-tag tag-soon">Soon</span>
</div>
<p class="artifact-desc">Defines the smallest version of the offer you can ship and learn from. Scope, deliverable structure, pricing, kill criterion. For services this becomes your SOW template.</p>
</div>
</div>
<!-- ============ HOW TO USE ============ -->
<div class="section-header">
<span>How to use this kit</span>
<span class="num">— operating notes</span>
</div>
<div class="usage-card">
<h4>The honest sequence</h4>
<ol>
<li><strong>Read the Operator's Flow doctrine first.</strong> 30 minutes of reading. It tells you which artifact belongs at which step.</li>
<li><strong>Walk Phase 1 in order:</strong> Step 1.1 Idea Capture → Step 1.2 Buyer Decision Style → MVO Widget for full validation. The first two are fast. The MVO Widget is deep.</li>
<li><strong>For Phase 2 (Asset Build):</strong> Run the Marketing Plan Generator with your sharpened idea + buyer profile. Use the Pain Discovery Tool Catalog if pain language is still vague.</li>
<li><strong>For Phase 3 (Acquisition):</strong> Use the Client Acquisition Catalog if you sell high-ticket services or coaching. The Marketing Plan Generator's Section 09 covers acquisition for other business models.</li>
<li><strong>For Phase 4 + 5 (Operations + Iteration):</strong> The doctrine document is the spine. Standalone widgets for these phases are not yet built.</li>
</ol>
</div>
<div class="usage-card">
<h4>State sharing between files</h4>
<p>The two step pages (1.1 and 1.2) save your output to <code>localStorage</code>. Whether outputs carry between separate HTML files depends on your browser:</p>
<ul>
<li><strong>Chrome (default settings):</strong> Files in the same folder usually share localStorage. Step 1.2 will pick up Step 1.1's paragraph automatically.</li>
<li><strong>Firefox / Safari:</strong> Generally do NOT share between local files. Each file has isolated localStorage.</li>
<li><strong>Workaround that always works:</strong> Each step page has a "Copy" button on its output. Copy the text, then paste into the next step's prior-context field. The widgets are designed to handle either path.</li>
</ul>
<p>If you want guaranteed state sharing, host all the files on a single Netlify project so they share the same origin. But for personal operator practice, the copy-paste workflow is reliable and explicit.</p>
</div>
<div class="usage-card">
<h4>API key handling</h4>
<p>The two step pages and three widgets that use Claude all need an Anthropic API key. <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noopener" style="color: var(--red-deep);">Get one here</a>. Each tool stores it locally in your browser. Approximate cost per use: $0.05–$0.15 on Sonnet 4.6, $0.50–$1.50 on Opus 4.7.</p>
<p>Your key is never sent anywhere except <code>api.anthropic.com</code>. Anthropic's Trust Center lays out their data handling.</p>
</div>
<div class="usage-card">
<h4>Printing & sharing</h4>
<p>Every artifact has a print stylesheet that strips navigation and renders cleanly to PDF. Use your browser's "Print → Save as PDF" to capture an output.</p>
<p>To share an individual artifact with someone, you can drag any single <code>.html</code> file onto <a href="https://app.netlify.com/drop" target="_blank" rel="noopener" style="color: var(--red-deep);">Netlify Drop</a> for a free public URL. Single files don't have folder-vs-contents problems. Each one becomes its own deploy.</p>
</div>
<p class="foot-discipline">
<strong>Discipline notes for using this kit.</strong> No artifact in this suite produces fabricated metrics, fake firm names, invented testimonials, or outcome guarantees. Every Claude-generated output uses the same anti-fabrication rules. If a tool can't speak with confidence about your specific niche, it says so in caveats. The honest gap is part of the deliverable, not a defect to hide. Treat AI-generated drafts as starting points for testing in your real market — not as plans to execute without human judgment.
</p>
</main>
</body>
</html>
Original asset: RISER-Tool-Catalog.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RISER Tool Catalog · Pain Discovery & VOC Stack</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter+Tight:[email protected]&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0a0a0a;
--paper: #f7f4ee;
--paper-warm: #f0eadf;
--paper-deep: #e9e2d2;
--rule: #1a1a1a;
--red: #c9302a;
--red-deep: #8b1f1c;
--red-tint: #fbe8e6;
--red-soft: #f9d8d5;
--green: #1d6e3a;
--green-tint: #dcefe2;
--gold: #b8893a;
--gold-tint: #f5ead0;
--teal: #2c5f5a;
--teal-tint: #d8e6e4;
--muted: #5a564f;
--serif: 'Fraunces', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--mono: 'JetBrains Mono', Menlo, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: var(--sans);
background: var(--paper);
color: var(--ink);
line-height: 1.55;
font-size: 15px;
min-height: 100vh;
}
/* ============ MASTHEAD ============ */
.masthead {
border-bottom: 3px double var(--rule);
padding: 36px 32px 28px;
background: var(--paper);
position: relative;
}
.masthead-inner {
max-width: 1280px;
margin: 0 auto;
}
.kicker {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 14px;
}
.kicker::after {
content: '';
flex: 1;
height: 1px;
background: var(--rule);
opacity: 0.3;
}
.title {
font-family: var(--serif);
font-weight: 600;
font-size: clamp(36px, 5vw, 58px);
line-height: 1.0;
letter-spacing: -0.025em;
margin-bottom: 14px;
}
.title em {
font-style: italic;
font-weight: 400;
color: var(--red-deep);
}
.subtitle {
font-family: var(--serif);
font-style: italic;
font-size: 18px;
color: var(--muted);
max-width: 720px;
line-height: 1.45;
}
.colophon {
margin-top: 22px;
display: flex;
flex-wrap: wrap;
gap: 10px 22px;
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
letter-spacing: 0.05em;
}
.colophon span::before {
content: '·';
margin-right: 22px;
color: var(--muted);
opacity: 0.5;
}
.colophon span:first-child::before { content: ''; margin: 0; }
/* ============ INTRO STRIP ============ */
.intro {
padding: 32px;
background: var(--paper-warm);
border-bottom: 1px solid var(--rule);
}
.intro-inner {
max-width: 1280px;
margin: 0 auto;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 32px;
}
.intro-item h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--red-deep);
margin-bottom: 8px;
font-weight: 700;
}
.intro-item p {
font-family: var(--serif);
font-size: 16px;
line-height: 1.5;
}
.intro-item p strong {
font-weight: 600;
}
@media (max-width: 800px) {
.intro-inner { grid-template-columns: 1fr; }
}
/* ============ CONTROLS ============ */
.controls-bar {
position: sticky;
top: 0;
z-index: 50;
background: var(--paper);
border-bottom: 1px solid var(--rule);
padding: 16px 32px;
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.controls-inner {
max-width: 1280px;
margin: 0 auto;
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
}
.search-box {
flex: 1;
min-width: 240px;
position: relative;
}
.search-box input {
width: 100%;
padding: 10px 14px 10px 40px;
font-family: var(--sans);
font-size: 14px;
border: 1.5px solid var(--rule);
border-radius: 0;
background: var(--paper);
color: var(--ink);
transition: border-color 0.15s, background 0.15s;
}
.search-box input:focus {
outline: none;
border-color: var(--red-deep);
background: #fff;
}
.search-box::before {
content: '⌕';
position: absolute;
left: 14px;
top: 50%;
transform: translateY(-50%);
font-size: 16px;
color: var(--muted);
pointer-events: none;
}
.filter-group {
display: flex;
gap: 6px;
flex-wrap: wrap;
align-items: center;
}
.filter-label {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
margin-right: 4px;
}
.filter-btn {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.04em;
padding: 7px 12px;
border: 1.5px solid var(--rule);
background: var(--paper);
color: var(--ink);
cursor: pointer;
transition: all 0.12s;
text-transform: uppercase;
font-weight: 500;
}
.filter-btn:hover {
background: var(--ink);
color: var(--paper);
}
.filter-btn.active {
background: var(--red-deep);
color: var(--paper);
border-color: var(--red-deep);
}
.filter-btn.active:hover {
background: var(--red);
}
.results-counter {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.08em;
color: var(--muted);
margin-left: auto;
text-transform: uppercase;
}
.results-counter strong {
color: var(--ink);
font-weight: 700;
}
/* ============ MAIN CONTENT ============ */
main {
max-width: 1280px;
margin: 0 auto;
padding: 40px 32px 80px;
}
.tier-section {
margin-bottom: 64px;
scroll-margin-top: 100px;
}
.tier-section.hidden { display: none; }
.tier-header {
display: flex;
align-items: baseline;
gap: 16px;
margin-bottom: 10px;
border-bottom: 2px solid var(--rule);
padding-bottom: 14px;
}
.tier-num {
font-family: var(--mono);
font-size: 12px;
font-weight: 700;
color: var(--red-deep);
letter-spacing: 0.1em;
}
.tier-name {
font-family: var(--serif);
font-size: 32px;
font-weight: 600;
letter-spacing: -0.02em;
flex: 1;
}
.tier-count {
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
letter-spacing: 0.08em;
white-space: nowrap;
}
.tier-purpose {
font-family: var(--serif);
font-style: italic;
font-size: 16px;
color: var(--muted);
margin-bottom: 28px;
max-width: 760px;
line-height: 1.5;
}
.tier-purpose .gate-ref {
font-style: normal;
color: var(--red-deep);
font-weight: 600;
}
/* ============ TOOL CARDS ============ */
.tool-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
gap: 20px;
}
.tool-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 22px 22px 18px;
display: flex;
flex-direction: column;
position: relative;
transition: transform 0.12s, box-shadow 0.12s, background 0.12s;
}
.tool-card:hover {
transform: translateY(-2px);
box-shadow: 4px 4px 0 var(--rule);
background: var(--paper-warm);
}
.tool-card.hidden { display: none; }
.tool-card.tier-enterprise {
background: var(--paper-deep);
}
.tool-card.tier-enterprise:hover {
background: #ddd5c2;
}
.tool-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 6px;
}
.tool-name {
font-family: var(--serif);
font-size: 22px;
font-weight: 600;
line-height: 1.15;
letter-spacing: -0.01em;
}
.tool-name a {
color: var(--ink);
text-decoration: none;
border-bottom: 1px dotted var(--muted);
transition: border-color 0.12s, color 0.12s;
}
.tool-name a:hover {
color: var(--red-deep);
border-color: var(--red-deep);
}
.tool-flags {
display: flex;
gap: 4px;
flex-shrink: 0;
}
.flag {
font-family: var(--mono);
font-size: 9px;
font-weight: 700;
letter-spacing: 0.1em;
padding: 3px 6px;
border: 1px solid currentColor;
text-transform: uppercase;
white-space: nowrap;
}
.flag-new { color: var(--green); }
.flag-enterprise { color: var(--gold); }
.flag-budget { color: var(--teal); }
.flag-free { color: var(--green); background: var(--green-tint); border-color: var(--green); }
.tool-url {
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
margin-bottom: 12px;
letter-spacing: 0.02em;
word-break: break-all;
}
.tool-pricing {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
background: var(--paper-warm);
border-left: 3px solid var(--gold);
margin-bottom: 14px;
font-family: var(--mono);
font-size: 12px;
}
.tool-card.tier-enterprise .tool-pricing {
background: var(--paper);
border-left-color: var(--red-deep);
}
.pricing-label {
font-size: 10px;
letter-spacing: 0.12em;
color: var(--muted);
text-transform: uppercase;
flex-shrink: 0;
}
.pricing-value {
color: var(--ink);
font-weight: 600;
}
.tool-description {
font-family: var(--serif);
font-size: 15px;
line-height: 1.5;
margin-bottom: 14px;
color: var(--ink);
}
.tool-section {
margin-bottom: 12px;
font-size: 13px;
line-height: 1.5;
}
.tool-section h4 {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 4px;
}
.tool-section p {
color: var(--ink);
}
.tool-section ul {
list-style: none;
padding: 0;
}
.tool-section li {
padding-left: 14px;
position: relative;
margin-bottom: 3px;
color: var(--ink);
}
.tool-section li::before {
content: '→';
position: absolute;
left: 0;
color: var(--gold);
font-weight: 600;
}
.tool-footer {
display: flex;
gap: 8px;
margin-top: auto;
padding-top: 12px;
border-top: 1px dashed var(--muted);
flex-wrap: wrap;
}
.gate-tag {
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.06em;
padding: 3px 8px;
background: var(--red-tint);
color: var(--red-deep);
font-weight: 600;
}
/* ============ TOC NAV ============ */
.toc {
position: fixed;
top: 50%;
right: 24px;
transform: translateY(-50%);
z-index: 40;
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 14px 14px;
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.08em;
text-transform: uppercase;
max-width: 200px;
box-shadow: 4px 4px 0 var(--rule);
}
.toc-label {
font-weight: 700;
color: var(--red-deep);
margin-bottom: 8px;
border-bottom: 1px solid var(--rule);
padding-bottom: 6px;
}
.toc a {
display: block;
color: var(--ink);
text-decoration: none;
padding: 4px 0;
transition: color 0.12s;
line-height: 1.3;
}
.toc a:hover {
color: var(--red-deep);
}
.toc-num {
color: var(--muted);
margin-right: 6px;
}
@media (max-width: 1100px) {
.toc { display: none; }
}
/* ============ STACK SECTION ============ */
.stacks {
background: var(--paper-warm);
padding: 56px 32px;
border-top: 3px double var(--rule);
border-bottom: 3px double var(--rule);
margin: 64px -32px;
}
.stacks-inner {
max-width: 1280px;
margin: 0 auto;
}
.stacks-title {
font-family: var(--serif);
font-size: 36px;
font-weight: 600;
margin-bottom: 8px;
letter-spacing: -0.02em;
}
.stacks-sub {
font-family: var(--serif);
font-style: italic;
color: var(--muted);
margin-bottom: 36px;
font-size: 16px;
}
.stack-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
}
.stack-card {
background: var(--paper);
border: 1.5px solid var(--rule);
padding: 22px;
display: flex;
flex-direction: column;
}
.stack-card h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
font-weight: 700;
margin-bottom: 4px;
}
.stack-card .stack-name {
font-family: var(--serif);
font-size: 24px;
font-weight: 600;
margin-bottom: 10px;
letter-spacing: -0.015em;
}
.stack-card .stack-cost {
font-family: var(--mono);
font-size: 12px;
color: var(--gold);
font-weight: 600;
margin-bottom: 14px;
letter-spacing: 0.04em;
}
.stack-card p {
font-family: var(--serif);
font-size: 15px;
line-height: 1.5;
margin-bottom: 14px;
color: var(--ink);
}
.stack-card ul {
list-style: none;
padding: 0;
margin-top: auto;
}
.stack-card li {
padding: 6px 0;
border-bottom: 1px dotted var(--muted);
font-size: 13px;
color: var(--ink);
display: flex;
justify-content: space-between;
gap: 10px;
}
.stack-card li:last-child { border-bottom: none; }
.stack-card .stack-item-name {
font-weight: 500;
}
.stack-card .stack-item-tier {
font-family: var(--mono);
font-size: 10px;
color: var(--muted);
letter-spacing: 0.06em;
}
/* ============ FOOTER ============ */
footer {
border-top: 3px double var(--rule);
padding: 40px 32px 60px;
background: var(--paper);
}
.footer-inner {
max-width: 1280px;
margin: 0 auto;
}
.footer-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 40px;
margin-bottom: 32px;
}
@media (max-width: 700px) {
.footer-grid { grid-template-columns: 1fr; }
}
.footer-grid h3 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--red-deep);
margin-bottom: 12px;
font-weight: 700;
}
.footer-grid p {
font-family: var(--serif);
font-size: 15px;
line-height: 1.55;
color: var(--ink);
margin-bottom: 12px;
}
.footer-rule {
border-top: 1px solid var(--rule);
padding-top: 20px;
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
letter-spacing: 0.04em;
}
.footer-rule strong {
color: var(--ink);
font-weight: 700;
}
/* ============ NO RESULTS ============ */
.no-results {
text-align: center;
padding: 60px 20px;
font-family: var(--serif);
font-style: italic;
font-size: 18px;
color: var(--muted);
display: none;
}
.no-results.visible { display: block; }
/* ============ ANIMATIONS ============ */
@keyframes fadeUp {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.tool-card {
animation: fadeUp 0.3s ease-out backwards;
}
</style>
</head>
<body>
<header class="masthead">
<div class="masthead-inner">
<div class="kicker">RISER Captain's Logic · Companion Catalog · Standalone</div>
<h1 class="title">The Pain Discovery <em>&</em> Voice-of-Customer Stack</h1>
<p class="subtitle">Forty-one verified tools that feed the RISER MVO Decision Engine. Costs, features, benefits, and the specific gate each one serves. No omissions, no fabricated prices, no dead links.</p>
<div class="colophon">
<span>v1 · April 2026</span>
<span>41 tools across 7 tiers</span>
<span>All links verified live</span>
<span>Companion to the v3 widget</span>
</div>
</div>
</header>
<section class="intro">
<div class="intro-inner">
<div class="intro-item">
<h3>How to read this</h3>
<p>Tools are grouped by <strong>where they feed the widget</strong>, not alphabetically. The tier number tells you which gate they serve. Within tiers, the order is rough recommendation strength.</p>
</div>
<div class="intro-item">
<h3>About the pricing</h3>
<p>Where vendors publish prices, the <strong>real number</strong> appears. Where they only say "contact us," that's what's printed — no fabricated quotes. Enterprise tools are flagged so you don't sign up for a $1,000+/mo platform by accident.</p>
</div>
<div class="intro-item">
<h3>The minimum stack</h3>
<p><strong>One Tier 1 tool + SparkToro + Typeform.</strong> ~$60–100/month. That's enough to walk every gate of the widget with real evidence. Everything else compounds value, but isn't required to start.</p>
</div>
</div>
</section>
<div class="controls-bar">
<div class="controls-inner">
<div class="search-box">
<input type="text" id="searchInput" placeholder="Search tools by name, feature, or use case…" autocomplete="off">
</div>
<div class="filter-group">
<span class="filter-label">Tier:</span>
<button class="filter-btn active" data-filter="all" data-filter-type="tier">All</button>
<button class="filter-btn" data-filter="1" data-filter-type="tier">1·Reddit</button>
<button class="filter-btn" data-filter="2" data-filter-type="tier">2·Audience</button>
<button class="filter-btn" data-filter="3" data-filter-type="tier">3·VOC</button>
<button class="filter-btn" data-filter="4" data-filter-type="tier">4·Listening</button>
<button class="filter-btn" data-filter="5" data-filter-type="tier">5·Enterprise</button>
<button class="filter-btn" data-filter="6" data-filter-type="tier">6·Validation</button>
<button class="filter-btn" data-filter="7" data-filter-type="tier">7·Quant</button>
</div>
<div class="filter-group">
<span class="filter-label">Budget:</span>
<button class="filter-btn active" data-filter="all" data-filter-type="budget">All</button>
<button class="filter-btn" data-filter="free" data-filter-type="budget">Free</button>
<button class="filter-btn" data-filter="cheap" data-filter-type="budget"><$50/mo</button>
<button class="filter-btn" data-filter="mid" data-filter-type="budget">$50–500</button>
<button class="filter-btn" data-filter="enterprise" data-filter-type="budget">Enterprise</button>
</div>
<div class="results-counter"><strong id="resultCount">41</strong> shown</div>
</div>
</div>
<nav class="toc">
<div class="toc-label">Tiers</div>
<a href="#tier-1"><span class="toc-num">1·</span>Reddit Pain Mining</a>
<a href="#tier-2"><span class="toc-num">2·</span>Audience Intel</a>
<a href="#tier-3"><span class="toc-num">3·</span>VOC Synthesis</a>
<a href="#tier-4"><span class="toc-num">4·</span>Listening</a>
<a href="#tier-5"><span class="toc-num">5·</span>Enterprise</a>
<a href="#tier-6"><span class="toc-num">6·</span>Validation</a>
<a href="#tier-7"><span class="toc-num">7·</span>Quant</a>
<a href="#stacks" style="margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--rule); color: var(--red-deep);">Recommended Stacks</a>
</nav>
<main id="catalog">
<!-- Tools render here via JS -->
</main>
<div class="no-results" id="noResults">
No tools match those filters. Try widening your criteria or clearing the search.
</div>
<section class="stacks" id="stacks">
<div class="stacks-inner">
<h2 class="stacks-title">Recommended Stacks</h2>
<p class="stacks-sub">Three operator-tested combinations, ranked by where you are in the build.</p>
<div class="stack-grid">
<div class="stack-card">
<h3>Stage One</h3>
<div class="stack-name">Validation Starter</div>
<div class="stack-cost">~$60–100/month</div>
<p>Enough to walk Gate 00½ through Gate 06 with real evidence. Skip everything else until you have ten paying customers.</p>
<ul>
<li><span class="stack-item-name">PainOnSocial Starter</span><span class="stack-item-tier">$19/mo</span></li>
<li><span class="stack-item-name">SparkToro Personal</span><span class="stack-item-tier">$38/mo</span></li>
<li><span class="stack-item-name">F5Bot</span><span class="stack-item-tier">Free</span></li>
<li><span class="stack-item-name">Typeform free tier</span><span class="stack-item-tier">Free</span></li>
</ul>
</div>
<div class="stack-card">
<h3>Stage Two</h3>
<div class="stack-name">Iterate & Compound</div>
<div class="stack-cost">~$200–400/month</div>
<p>Add VOC structure once you have customer interview data and a live offer. Now Gate 08 has fuel.</p>
<ul>
<li><span class="stack-item-name">Stage One stack</span><span class="stack-item-tier">~$60</span></li>
<li><span class="stack-item-name">Dovetail Free or paid</span><span class="stack-item-tier">$0–29/mo</span></li>
<li><span class="stack-item-name">Brand24</span><span class="stack-item-tier">$99–199/mo</span></li>
<li><span class="stack-item-name">Hotjar</span><span class="stack-item-tier">$39+/mo</span></li>
</ul>
</div>
<div class="stack-card">
<h3>Stage Three</h3>
<div class="stack-name">Scale & Defend</div>
<div class="stack-cost">$500+/month</div>
<p>Tier 5 enterprise tools start to earn keep when you're running multi-channel and need cross-platform sentiment at scale. Most operators never need this.</p>
<ul>
<li><span class="stack-item-name">Stage Two stack</span><span class="stack-item-tier">~$300</span></li>
<li><span class="stack-item-name">Wynter message tests</span><span class="stack-item-tier">$540+/mo</span></li>
<li><span class="stack-item-name">Brandwatch / Sprout</span><span class="stack-item-tier">$1k+/mo</span></li>
<li><span class="stack-item-name">Insight7 or Productboard</span><span class="stack-item-tier">Custom</span></li>
</ul>
</div>
</div>
</div>
</section>
<footer>
<div class="footer-inner">
<div class="footer-grid">
<div>
<h3>Operator's note</h3>
<p>This catalog is a reference, not a shopping list. The widget's Gate 00½ has a skip-path because operator hypothesis can carry you to Gate 03 without paying anyone a dollar. Don't shop tools to avoid talking to humans — that's the trap that catches more founders than any other.</p>
<p>The right time to add a tool is the moment its absence is genuinely slowing you down. Not before.</p>
</div>
<div>
<h3>What I excluded</h3>
<p><strong>GummySearch</strong> — shut down November 30, 2025.<br><strong>DemandDrop, MarketScope</strong> — could not verify as live products.<br><strong>Twitter/X listening tools</strong> — API terms make most unreliable in 2026.</p>
</div>
</div>
<div class="footer-rule">
<strong>RISER Captain's Logic</strong> · Companion to the MVO Decision Engine v3 · April 2026 · All vendor names, pricing, and links verified at time of publication. Re-verify before purchase — pricing and availability change.
</div>
</div>
</footer>
<script>
// ============================================================================
// TOOL DATA — 41 verified entries
// ============================================================================
const TOOLS = [
// ============ TIER 1 — REDDIT PAIN MINING ============
{
id: 'painonsocial',
name: 'PainOnSocial',
url: 'https://www.painonsocial.com/',
urlDisplay: 'painonsocial.com',
tier: 1,
pricing: 'Starter $19/mo · Pro $49/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'AI Reddit scanner with 0–100 pain scoring across 30+ curated communities. Evidence quotes, AI-generated solution ideas, audience analysis. The reference tool for the widget.',
features: ['0–100 pain score per opportunity', 'Real Reddit quotes + permalinks', 'AI solution ideas with monetization', 'Curated 30+ subreddit catalog', 'Audience demographics analysis'],
benefit: 'Compresses weeks of manual subreddit reading into a single scan with structured, verifiable output.',
feeds: ['Gate 00½'],
notes: '7-day free trial on Starter. Pro adds 15 scans/day, 5 subreddits, 90-day timeframes.'
},
{
id: 'reddily',
name: 'Reddily',
url: 'https://reddily.io/',
urlDisplay: 'reddily.io',
tier: 1,
pricing: 'Pay-per-analysis · 5 free credits',
pricingTier: 'cheap',
flags: [],
blurb: 'Chrome extension + dashboard. Uses Google Gemini to extract sentiment, pain points, feature requests, and quotes from any Reddit thread. Pay-per-analysis pricing.',
features: ['One-click thread analysis', 'Batch processing up to 25 threads', 'Sentiment + pain extraction', 'Feature-request detection', 'Chrome extension'],
benefit: 'Best for ad-hoc research where you don\'t want a recurring subscription.',
feeds: ['Gate 00½'],
notes: 'Pay-per-analysis model means you only pay for what you scan.'
},
{
id: 'painpointy',
name: 'PainPointy',
url: 'https://painpointy.com/',
urlDisplay: 'painpointy.com',
tier: 1,
pricing: 'Pricing on site',
pricingTier: 'cheap',
flags: [],
blurb: 'Surfaces pain points, content ideas, reply opportunities, and brand mentions from Reddit. Smaller indie tool with a similar shape to PainOnSocial.',
features: ['60-second subreddit scans', 'Daily agency reports', 'Reply opportunity detection', 'Content idea surfacing'],
benefit: 'Lighter-weight alternative if PainOnSocial pricing or interface doesn\'t fit.',
feeds: ['Gate 00½', 'Gate 06']
},
{
id: 'buzzabout',
name: 'BuzzAbout',
url: 'https://buzzabout.ai/',
urlDisplay: 'buzzabout.ai',
tier: 1,
pricing: 'Pricing on site',
pricingTier: 'cheap',
flags: [],
blurb: 'Market research agent for Reddit and other social platforms. Broader source coverage than Reddit-only tools.',
features: ['Multi-platform coverage', 'AI agent workflow', 'Market trend tracking'],
benefit: 'Useful when your audience lives on more than just Reddit.',
feeds: ['Gate 00½', 'Gate 01']
},
{
id: 'syften',
name: 'Syften',
url: 'https://syften.com/',
urlDisplay: 'syften.com',
tier: 1,
pricing: '~$39.95/mo Standard',
pricingTier: 'cheap',
flags: [],
blurb: 'Tracks keywords across Reddit, Hacker News, and 10+ platforms. Real-time alerts. Closest like-for-like replacement for the discontinued GummySearch monitoring workflow.',
features: ['Reddit + HN + 10+ platforms', 'Boolean search support', 'Slack alerts', '20 filters on Standard'],
benefit: 'The tool to use if you specifically miss GummySearch\'s alert-and-monitor workflow.',
feeds: ['Gate 00½', 'Gate 09']
},
{
id: 'subredditsignals',
name: 'Subreddit Signals',
url: 'https://subredditsignals.com/',
urlDisplay: 'subredditsignals.com',
tier: 1,
pricing: 'Starter $19.99/mo',
pricingTier: 'cheap',
flags: ['new'],
blurb: 'AI-scored Reddit lead detection with 7-dimension intent classification (PURCHASE_READY, switching intent, budget questions). Built more for high-intent buyers than for raw pain mining.',
features: ['7-dimension intent scoring', 'PURCHASE_READY classification', '15 weekly lead tokens (Starter)', 'AI comment templates', 'Switching-intent detection'],
benefit: 'Best when you want leads, not just pain points — already-qualified buyers actively searching.',
feeds: ['Gate 00½', 'Gate 05']
},
{
id: 'redreach',
name: 'Redreach',
url: 'https://www.reddireach.com/',
urlDisplay: 'reddireach.com',
tier: 1,
pricing: '~$29/mo unlimited',
pricingTier: 'cheap',
flags: ['new'],
blurb: 'AI-powered Reddit conversation discovery and reply assist. Volume-oriented (unlimited monitoring, no token caps). Pair with intent scoring from another tool to filter noise.',
features: ['Unlimited monitoring', 'No token caps', 'AI reply assist', 'Google-ranking post detection', 'Bulk DM workflow'],
benefit: 'Volume play if you have time to filter manually and want broad coverage.',
feeds: ['Gate 00½', 'Gate 05']
},
{
id: 'apify-reddit',
name: 'Apify Reddit Pain Finder',
url: 'https://apify.com/solutionssmart/reddit-pain-finder',
urlDisplay: 'apify.com/solutionssmart/reddit-pain-finder',
tier: 1,
pricing: 'Pay-per-result',
pricingTier: 'cheap',
flags: ['new'],
blurb: 'Scraper that classifies posts into pain types (pricing, missing features, workflow friction, integration needs, switching) and ranks by priority. Works without API keys via RSS, or with Reddit OAuth at scale.',
features: ['Pain-type classification', 'Priority scoring', 'Promo-post filtering', 'Webhooks + n8n + Make + Zapier', 'No API key required'],
benefit: 'The DIY/automation-friendly option. Ideal if you want to pipe Reddit pain data into your own workflow.',
feeds: ['Gate 00½'],
notes: 'Built on Apify platform — supports scheduling, monitoring, integrations.'
},
// ============ TIER 2 — AUDIENCE INTELLIGENCE ============
{
id: 'sparktoro',
name: 'SparkToro',
url: 'https://sparktoro.com/',
urlDisplay: 'sparktoro.com',
tier: 2,
pricing: 'Personal $38/mo · Business $112/mo · Free 5 searches/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'The audience research standard. Search by keyword, hashtag, or natural-language description; get the websites, podcasts, YouTube channels, subreddits, and social accounts your audience actually engages with.',
features: ['Audience clickstream + Google + social', '"Describe Your Audience" natural language', 'Email-list audience analysis', 'Podcast + YouTube + subreddit data', 'Compare Audiences feature'],
benefit: 'Tells you exactly where the avatar gathers — feeds Gate 01 and Gate 05½ Dream 100.',
feeds: ['Gate 01', 'Gate 05½']
},
{
id: 'answerthepublic',
name: 'AnswerThePublic',
url: 'https://answerthepublic.com/en',
urlDisplay: 'answerthepublic.com',
tier: 2,
pricing: 'Free 3 searches/day · Paid from ~$11/mo',
pricingTier: 'cheap',
flags: ['free'],
blurb: 'Visualizes the questions people ask in autocomplete data. The "wh-" outputs are raw avatar pain language, ready to drop into copy.',
features: ['Google + Bing autocomplete data', 'Question wheel visualization', 'CSV export', 'New AI Dashboard'],
benefit: 'Instant raw customer language. The questions are the pain in their own words.',
feeds: ['Gate 01', 'Gate 06']
},
{
id: 'alsoasked',
name: 'AlsoAsked',
url: 'https://alsoasked.com/',
urlDisplay: 'alsoasked.com',
tier: 2,
pricing: 'Free 3 searches/day · Paid $15–59/mo',
pricingTier: 'cheap',
flags: ['free'],
blurb: 'Real-time "People Also Ask" data from Google in tree structure. Shows the next question your prospect is going to ask after the first one.',
features: ['Real-time PAA scraping', 'Tree-structured question hierarchy', 'CSV export', 'Visual question mapping'],
benefit: 'High-leverage for Gate 06½ false belief audit — Google has already clustered the next objection for you.',
feeds: ['Gate 06', 'Gate 06½']
},
{
id: 'buzzsumo',
name: 'BuzzSumo',
url: 'https://buzzsumo.com/',
urlDisplay: 'buzzsumo.com',
tier: 2,
pricing: 'From ~$199/mo',
pricingTier: 'mid',
flags: [],
blurb: 'Question Analyzer searches forum posts across Amazon, Reddit, Quora, Q&A sites. Content Analyzer shows what\'s actually getting shared.',
features: ['Question Analyzer (Amazon, Reddit, Quora)', 'Content trend tracking', 'Trending feeds 24h windows', 'Media database & journalist outreach', 'Slack integration'],
benefit: 'Combines pain mining with content performance — what gets shared is what gets clicked.',
feeds: ['Gate 01', 'Gate 06']
},
{
id: 'explodingtopics',
name: 'Exploding Topics',
url: 'https://explodingtopics.com/',
urlDisplay: 'explodingtopics.com',
tier: 2,
pricing: 'Pro from ~$39/mo',
pricingTier: 'cheap',
flags: [],
blurb: 'Categories with rising search trajectory before saturation. Feeds Gate 01\'s market trajectory scale directly.',
features: ['Trend categorization', 'Long-term momentum scoring', 'Category browsing (food, fitness, fintech, etc.)', 'Trend reports'],
benefit: 'Validates Gate 01 market trajectory with hard search data before you commit.',
feeds: ['Gate 01']
},
{
id: 'glimpse',
name: 'Glimpse',
url: 'https://meetglimpse.com/',
urlDisplay: 'meetglimpse.com',
tier: 2,
pricing: 'Free 10 searches/mo · Paid from $99/mo',
pricingTier: 'mid',
flags: ['new'],
blurb: 'Trend discovery built on Google Trends with absolute search volume, 12-month forecasts, and TikTok/Reddit/Instagram channel breakdowns.',
features: ['Absolute search volume (vs Google Trends 0–100 scale)', '12-month forecast (95%+ backtested accuracy)', 'TikTok/Reddit/Instagram channel data', 'Chrome extension', 'Real-time alerts'],
benefit: 'Closest competitor to Exploding Topics with more granular keyword tracking and forecasting.',
feeds: ['Gate 01', 'Gate 02']
},
// ============ TIER 3 — VOC SYNTHESIS ============
{
id: 'dovetail',
name: 'Dovetail',
url: 'https://dovetail.com/',
urlDisplay: 'dovetail.com',
tier: 3,
pricing: 'Free plan · Paid from $29/mo per user',
pricingTier: 'cheap',
flags: ['free'],
blurb: 'Customer intelligence platform. Centralize calls, tickets, surveys, interviews, reviews; AI auto-classifies into themes. The repository standard.',
features: ['Auto-import calls, tickets, surveys, interviews, reviews', 'AI theme classification', 'Searchable insight repository', 'Cross-project synthesis', 'Atomic UX research method'],
benefit: 'The default choice for customer-research teams who want everything in one place.',
feeds: ['VOC Vault', 'Gate 08']
},
{
id: 'insight7',
name: 'Insight7',
url: 'https://insight7.io/',
urlDisplay: 'insight7.io',
tier: 3,
pricing: 'Custom pricing',
pricingTier: 'mid',
flags: ['new'],
blurb: 'Auto-ingests recordings from Zoom, Google Meet, Teams; extracts themes by semantic meaning; generates branded reports with embedded evidence. Stronger automation than Dovetail at high session volumes.',
features: ['Auto-ingest Zoom/Meet/Teams', 'Semantic theme extraction (no manual tagging)', 'Branded reports with frequency data', 'Cross-session synthesis', 'Dropbox + Drive integration'],
benefit: 'Built for teams running 50+ interviews per month who need automation, not manual tagging.',
feeds: ['VOC Vault', 'Gate 08']
},
{
id: 'conveo',
name: 'Conveo',
url: 'https://conveo.ai/',
urlDisplay: 'conveo.ai',
tier: 3,
pricing: 'Custom enterprise pricing',
pricingTier: 'enterprise',
flags: ['new'],
blurb: 'AI-moderated video interviews with adaptive probing in 50+ languages. Built-in participant recruitment.',
features: ['Async AI-moderated video interviews', '50+ languages with adaptive follow-ups', 'Built-in participant panel', 'Multimodal analysis (speech + tone + visual)', 'Cross-study insight library'],
benefit: 'Use when you need fresh interview data, not just analysis of existing conversations.',
feeds: ['VOC Vault']
},
{
id: 'userinterviews',
name: 'User Interviews',
url: 'https://www.userinterviews.com/',
urlDisplay: 'userinterviews.com',
tier: 3,
pricing: 'Pay per recruit (~$25–100/participant)',
pricingTier: 'mid',
flags: [],
blurb: 'Recruits participants from a panel of 6 million vetted consumers and professionals. Now part of UserTesting.',
features: ['6M+ vetted participants', 'Bring-your-own-audience option', 'Scheduling + incentive management', 'Demographic + behavioral targeting'],
benefit: 'The fastest way to get interviews scheduled when you don\'t have your own audience yet.',
feeds: ['VOC Vault']
},
{
id: 'productboard',
name: 'Productboard / Pulse',
url: 'https://www.productboard.com/',
urlDisplay: 'productboard.com',
tier: 3,
pricing: 'Essentials from $19/maker/mo · Pulse enterprise',
pricingTier: 'mid',
flags: ['new'],
blurb: 'Customer feedback aggregator and pain-point analyzer for product teams. Pulse module surfaces VOC pain points specifically.',
features: ['Centralized customer feedback', 'Feature prioritization', 'Pulse VOC module', 'Roadmap integration'],
benefit: 'Best when feedback needs to feed into product decisions, not just live in a research repository.',
feeds: ['VOC Vault', 'Gate 08']
},
{
id: 'revuze',
name: 'Revuze',
url: 'https://www.revuze.it/',
urlDisplay: 'revuze.it',
tier: 3,
pricing: 'Custom enterprise pricing',
pricingTier: 'enterprise',
flags: ['new'],
blurb: 'Ingests unstructured customer language (reviews, support tickets, surveys) and converts it to structured market intelligence. Strongest for product/e-com VOC at scale.',
features: ['Unstructured-to-structured AI conversion', 'Multi-source ingestion', 'Sentiment + topic clustering', 'Trend forecasting'],
benefit: 'Built for e-commerce or product orgs swimming in review data.',
feeds: ['VOC Vault']
},
{
id: 'sentisum',
name: 'SentiSum',
url: 'https://www.sentisum.com/',
urlDisplay: 'sentisum.com',
tier: 3,
pricing: 'Custom pricing',
pricingTier: 'mid',
flags: ['new'],
blurb: 'Root-cause analysis on customer support complaints. Surfaces systemic problems worth solving.',
features: ['Support-ticket auto-tagging', 'Root-cause clustering', 'Sentiment + intent detection', 'CRM integrations'],
benefit: 'Use when you have live customer data and want to know what\'s actually breaking.',
feeds: ['Gate 08', 'Gate 09']
},
// ============ TIER 4 — LISTENING & MONITORING ============
{
id: 'f5bot',
name: 'F5Bot',
url: 'https://f5bot.com/',
urlDisplay: 'f5bot.com',
tier: 4,
pricing: 'Free',
pricingTier: 'free',
flags: ['free'],
blurb: 'Free email alerts for Reddit, Hacker News, Lobsters keywords. Zero cost, no analytics. The baseline tool.',
features: ['Email alerts on keyword mentions', 'Reddit + Hacker News + Lobsters', 'No account complexity'],
benefit: 'Free, dependable, gets out of the way. The first tool to install when you start.',
feeds: ['Gate 08', 'Gate 09']
},
{
id: 'brand24',
name: 'Brand24',
url: 'https://brand24.com/',
urlDisplay: 'brand24.com',
tier: 4,
pricing: 'From $99/mo',
pricingTier: 'mid',
flags: [],
blurb: 'Cross-platform mention monitoring with sentiment analysis. Mid-tier pricing, broader than Reddit-only.',
features: ['Cross-platform mention tracking', 'Sentiment analysis', 'Influencer detection', 'Reddit + web + social'],
benefit: 'The mid-tier choice when F5Bot isn\'t enough but Brandwatch is overkill.',
feeds: ['Gate 09']
},
{
id: 'mention',
name: 'Mention',
url: 'https://mention.com/',
urlDisplay: 'mention.com',
tier: 4,
pricing: 'From $41/mo Solo',
pricingTier: 'mid',
flags: [],
blurb: 'Real-time alerts across web and social. Useful for tracking how customers describe competitors — the complaints become Gate 06 hooks.',
features: ['Real-time alerts', 'Boolean search', 'Web + social coverage', 'Sentiment scoring'],
benefit: 'Watch competitors get complained about in real time, then write a hook against the complaint.',
feeds: ['Gate 06', 'Gate 09']
},
{
id: 'awario',
name: 'Awario',
url: 'https://awario.com/',
urlDisplay: 'awario.com',
tier: 4,
pricing: 'From $29/mo Starter',
pricingTier: 'cheap',
flags: [],
blurb: 'Brand monitoring with Reddit coverage and Boolean search at accessible price.',
features: ['Boolean search', 'Reddit + web + social', 'Lead detection', 'Sentiment analysis'],
benefit: 'The most accessible price point in the listening category for a real product.',
feeds: ['Gate 09']
},
{
id: 'social-searcher',
name: 'Social Searcher',
url: 'https://www.social-searcher.com/',
urlDisplay: 'social-searcher.com',
tier: 4,
pricing: 'Free tier · Paid from $4.50/mo',
pricingTier: 'free',
flags: ['new', 'free'],
blurb: 'Real-time multi-platform social monitoring with sentiment analysis. Generous free tier — useful before committing to paid tools.',
features: ['Multi-platform free search', 'Sentiment analysis', 'Real-time monitoring', 'Email alerts'],
benefit: 'The cheapest paid plan in the catalog. Worth trying before paying for Brand24 or Mention.',
feeds: ['Gate 09']
},
{
id: 'hootsuite',
name: 'Hootsuite',
url: 'https://www.hootsuite.com/',
urlDisplay: 'hootsuite.com',
tier: 4,
pricing: 'Professional $99/mo · Insights ~$600–1200/mo',
pricingTier: 'enterprise',
flags: ['new', 'enterprise'],
blurb: 'Social media management suite with listening capabilities. Stronger for scheduling than for pain mining; included for completeness.',
features: ['Multi-account scheduling', 'Insights add-on for listening', 'Sentiment analysis (paid tiers)', 'Team collaboration'],
benefit: 'Use only if you already need a scheduler. Don\'t buy this for pain mining alone.',
feeds: ['Gate 09']
},
{
id: 'agorapulse',
name: 'Agorapulse',
url: 'https://www.agorapulse.com/',
urlDisplay: 'agorapulse.com',
tier: 4,
pricing: 'From $79/mo Standard',
pricingTier: 'mid',
flags: ['new'],
blurb: 'Social media management with built-in listening and inbox unification. Mid-tier pricing.',
features: ['Unified social inbox', 'Listening add-on', 'Approval workflows', 'CRM-light contact tracking'],
benefit: 'Cleaner UX than Hootsuite, better for small teams that want one tool for everything.',
feeds: ['Gate 09']
},
{
id: 'brandmentions',
name: 'BrandMentions',
url: 'https://brandmentions.com/',
urlDisplay: 'brandmentions.com',
tier: 4,
pricing: 'From $99/mo Growing Business',
pricingTier: 'mid',
flags: ['new'],
blurb: 'Real-time brand and competitor mention tracking across web and social with sentiment.',
features: ['Web + social mention tracking', 'Competitor monitoring', 'Sentiment analysis', 'Influencer identification'],
benefit: 'Solid mid-tier alternative to Brand24 with similar capabilities.',
feeds: ['Gate 09']
},
{
id: 'youscan',
name: 'YouScan',
url: 'https://youscan.io/',
urlDisplay: 'youscan.io',
tier: 4,
pricing: 'Custom pricing',
pricingTier: 'enterprise',
flags: ['new', 'enterprise'],
blurb: 'Visual + text social listening with AI-powered image recognition. Distinct in that it analyzes images, not just text — useful when your category is visual.',
features: ['Image recognition AI', 'Logo + product detection', 'Text + visual sentiment', 'Audience insights'],
benefit: 'The only tool here that mines images. Essential if your category is visual (fashion, food, consumer goods).',
feeds: ['Gate 01', 'Gate 09']
},
// ============ TIER 5 — ENTERPRISE LISTENING ============
{
id: 'brandwatch',
name: 'Brandwatch',
url: 'https://www.brandwatch.com/',
urlDisplay: 'brandwatch.com',
tier: 5,
pricing: 'Custom enterprise pricing (typically $1,000+/mo)',
pricingTier: 'enterprise',
flags: ['enterprise'],
blurb: 'Consumer intelligence and social listening at enterprise scale. Strong sentiment, segment, and trend analysis across thousands of sources.',
features: ['Consumer intelligence at scale', 'Cross-platform sentiment', 'Segmentation + audience profiling', 'Custom dashboards', 'Historical data depth'],
benefit: 'Industry leader. Earn its keep at high scale where the depth pays back. Overkill below that.',
feeds: ['Gate 09']
},
{
id: 'sproutsocial',
name: 'Sprout Social',
url: 'https://sproutsocial.com/',
urlDisplay: 'sproutsocial.com',
tier: 5,
pricing: 'From $199/seat/mo · Listening tier higher',
pricingTier: 'enterprise',
flags: ['enterprise'],
blurb: 'Social listening, analytics, and engagement platform.',
features: ['Listening + engagement + publishing unified', 'CRM integrations', 'Reporting + analytics', 'Approval workflows'],
benefit: 'When you need listening + management in one tool and have the budget.',
feeds: ['Gate 09']
},
{
id: 'sprinklr',
name: 'Sprinklr',
url: 'https://www.sprinklr.com/',
urlDisplay: 'sprinklr.com',
tier: 5,
pricing: 'Custom enterprise pricing (typically $1,000+/mo)',
pricingTier: 'enterprise',
flags: ['enterprise'],
blurb: 'Unified CXM platform with social sentiment and enterprise CX insights.',
features: ['Unified CXM platform', 'Cross-channel sentiment', 'AI-powered insights', 'Customer service integration'],
benefit: 'Only justifiable for large orgs running coordinated CX across many channels.',
feeds: ['Gate 09']
},
{
id: 'talkwalker',
name: 'Talkwalker',
url: 'https://www.talkwalker.com/',
urlDisplay: 'talkwalker.com',
tier: 5,
pricing: 'Custom enterprise pricing',
pricingTier: 'enterprise',
flags: ['enterprise'],
blurb: 'Consumer intelligence platform with broad language and source coverage.',
features: ['187+ languages supported', 'Image + video recognition', 'Trend detection', 'Crisis monitoring'],
benefit: 'Strongest in non-English markets. Enterprise pricing limits applicability.',
feeds: ['Gate 09']
},
// ============ TIER 6 — VALIDATION ============
{
id: 'ideaproof',
name: 'IdeaProof',
url: 'https://ideaproof.io/',
urlDisplay: 'ideaproof.io',
tier: 6,
pricing: 'Free tier · Paid available',
pricingTier: 'free',
flags: ['new', 'free'],
blurb: 'AI startup validator with market analysis, competitor insights, and structured reports. ~120-second turnaround.',
features: ['120-second AI validation', 'Market analysis', 'Competitor insights', 'Investor-ready reports'],
benefit: 'Fast first-pass sanity check on Gate 02 before committing time.',
feeds: ['Gate 02']
},
{
id: 'dimeadozen',
name: 'DimeADozen',
url: 'https://www.dimeadozen.ai/',
urlDisplay: 'dimeadozen.ai',
tier: 6,
pricing: 'Free trial · Paid plans available',
pricingTier: 'cheap',
flags: ['new'],
blurb: 'AI-generated 40+ page validation reports covering market viability, monetization, competitor analysis, MVP planning, and risk assessment.',
features: ['40+ page reports in <20s', 'Market viability + competitive analysis', 'MVP planning', 'Pivot suggestions', 'Risk assessment'],
benefit: 'Replaces weeks of desk research with a structured first-draft report.',
feeds: ['Gate 02']
},
{
id: 'validatorai',
name: 'ValidatorAI',
url: 'https://validatorai.com/',
urlDisplay: 'validatorai.com',
tier: 6,
pricing: 'Free + custom pricing',
pricingTier: 'free',
flags: ['new', 'free'],
blurb: 'AI advisor that scores ideas, simulates customer feedback, and suggests next steps. Used by 300,000+ founders.',
features: ['Idea scoring + grading', 'Simulated customer feedback', 'Launch-readiness guidance', '24/7 AI mentor chatbot'],
benefit: 'The "talk to an AI advisor" version of validation — useful for the question-answer interaction style.',
feeds: ['Gate 02']
},
{
id: 'wynter',
name: 'Wynter',
url: 'https://wynter.com/',
urlDisplay: 'wynter.com',
tier: 6,
pricing: 'From ~$540/test',
pricingTier: 'mid',
flags: ['new'],
blurb: 'On-demand B2B message testing. Get 12–48 hour feedback from verified ICPs (job-title and industry filtered). The closest tool to "test your Gate 06 copy with real buyers before launching."',
features: ['Verified ICP audience (60K+ B2B professionals)', 'Job-title + industry targeting', '12–48 hour turnaround', 'Message testing + brand research', 'Persona research'],
benefit: 'Stops you from launching copy that\'s convincing only to yourself. Brutal but accurate.',
feeds: ['Gate 04', 'Gate 06', 'Gate 06½']
},
{
id: 'prelaunch',
name: 'Prelaunch',
url: 'https://www.prelaunch.com/',
urlDisplay: 'prelaunch.com',
tier: 6,
pricing: 'Custom pricing',
pricingTier: 'mid',
flags: ['new'],
blurb: 'Measures actual market reaction (pre-orders, landing-page conversion) before product release. Real-money signal beats hypothetical interest.',
features: ['Pre-order capture + measurement', 'Landing-page conversion testing', 'Concept validation surveys', 'Price-sensitivity testing'],
benefit: 'The most rigorous Gate 02 / Gate 04 validation — buyer money on the line, not just stated intent.',
feeds: ['Gate 02', 'Gate 04', 'Gate 07']
},
// ============ TIER 7 — QUANTITATIVE VALIDATION ============
{
id: 'typeform',
name: 'Typeform',
url: 'https://www.typeform.com/',
urlDisplay: 'typeform.com',
tier: 7,
pricing: 'Free tier · Basic from $25/mo',
pricingTier: 'free',
flags: ['free'],
blurb: 'Conversational surveys with high completion rates. Best for follow-up validation surveys to refund interviewees and Dream 100.',
features: ['One-question-at-a-time format', 'Logic jumps + conditional flows', 'Integrations (Zapier, etc.)', 'Free tier with 10 responses/mo'],
benefit: 'Higher completion rates than form-style surveys. Worth the premium for that alone.',
feeds: ['Gate 03', 'Gate 05½', 'Gate 08']
},
{
id: 'hotjar',
name: 'Hotjar',
url: 'https://www.hotjar.com/',
urlDisplay: 'hotjar.com',
tier: 7,
pricing: 'Free tier · Plus from $39/mo',
pricingTier: 'free',
flags: ['free'],
blurb: 'Heatmaps, session recordings, on-page feedback polls. The diagnostic input for Gate 09\'s hook/audience/offer triage.',
features: ['Heatmaps (clicks, scroll, attention)', 'Session recordings', 'On-page feedback polls', 'Conversion-funnel analysis'],
benefit: 'Tells you where users actually drop off — Gate 09 hook vs. audience vs. offer diagnostic.',
feeds: ['Gate 03', 'Gate 09']
}
];
// ============================================================================
// TIER METADATA
// ============================================================================
const TIERS = [
{ num: 1, id: 'tier-1', name: 'Reddit Pain Mining & Direct Alternatives', purpose: 'Reddit-mining + pain-point scoring. The closest substitutes if PainOnSocial is unavailable. Output feeds <span class="gate-ref">Gate 00½ Pain Discovery</span>.' },
{ num: 2, id: 'tier-2', name: 'Audience Intelligence', purpose: 'Where does the avatar gather, who do they follow, what language do they use? Feeds <span class="gate-ref">Gate 01 Hungry Avatar</span> and <span class="gate-ref">Gate 05½ Dream 100</span>.' },
{ num: 3, id: 'tier-3', name: 'Voice-of-Customer Synthesis', purpose: 'Cluster, transcribe, and structure raw quotes from interviews and feedback. Feeds the <span class="gate-ref">VOC Vault</span> and <span class="gate-ref">Gate 08 Iterate</span>.' },
{ num: 4, id: 'tier-4', name: 'Listening & Monitoring', purpose: 'Real-time signal of where customers voice pain. Feeds <span class="gate-ref">Gate 08</span> refund-interview discipline and <span class="gate-ref">Gate 09 Pivot or Hold</span>.' },
{ num: 5, id: 'tier-5', name: 'Enterprise Listening (★)', purpose: 'Same workflows as Tier 4, executed at platform scale. <strong>Pricing $500–$5,000+/mo.</strong> Most operators the widget serves should not buy these. They earn keep only past Gate 11 at multi-channel scale.' },
{ num: 6, id: 'tier-6', name: 'Idea & Offer Validation', purpose: 'Not pain discovery — adjacent. Validates the <em>offer</em> once the pain is identified. Feeds <span class="gate-ref">Gate 02 Idea/No Idea</span> and <span class="gate-ref">Gate 04 Grand Slam Offer</span>.' },
{ num: 7, id: 'tier-7', name: 'Quantitative Validation', purpose: 'After qualitative pain, validate with structured surveys and behavioral data. Feeds <span class="gate-ref">Gate 03</span> and <span class="gate-ref">Gate 09</span>.' }
];
// ============================================================================
// RENDER
// ============================================================================
function renderCatalog() {
const main = document.getElementById('catalog');
let html = '';
TIERS.forEach(tier => {
const tierTools = TOOLS.filter(t => t.tier === tier.num);
html += `
<section class="tier-section" id="${tier.id}" data-tier="${tier.num}">
<div class="tier-header">
<div class="tier-num">TIER ${tier.num}</div>
<h2 class="tier-name">${tier.name}</h2>
<div class="tier-count">${tierTools.length} TOOLS</div>
</div>
<p class="tier-purpose">${tier.purpose}</p>
<div class="tool-grid">
${tierTools.map((t, i) => renderToolCard(t, i)).join('')}
</div>
</section>
`;
});
main.innerHTML = html;
}
function renderToolCard(t, idx) {
const flagsHtml = (t.flags || []).map(f => {
const map = {
'new': { cls: 'flag-new', label: '⊕ NEW' },
'enterprise': { cls: 'flag-enterprise', label: '★ ENTERPRISE' },
'free': { cls: 'flag-free', label: 'FREE TIER' }
};
const m = map[f];
return m ? `<span class="flag ${m.cls}">${m.label}</span>` : '';
}).join('');
const tierClass = t.pricingTier === 'enterprise' ? 'tier-enterprise' : '';
const featuresHtml = (t.features || []).map(f => `<li>${f}</li>`).join('');
return `
<article class="tool-card ${tierClass}"
data-id="${t.id}"
data-tier="${t.tier}"
data-budget="${t.pricingTier}"
data-search="${(t.name + ' ' + t.blurb + ' ' + (t.features || []).join(' ') + ' ' + (t.benefit || '')).toLowerCase()}"
style="animation-delay: ${idx * 0.04}s">
<div class="tool-header">
<h3 class="tool-name"><a href="${t.url}" target="_blank" rel="noopener">${t.name}</a></h3>
<div class="tool-flags">${flagsHtml}</div>
</div>
<div class="tool-url">${t.urlDisplay}</div>
<div class="tool-pricing">
<span class="pricing-label">Cost</span>
<span class="pricing-value">${t.pricing}</span>
</div>
<p class="tool-description">${t.blurb}</p>
${t.features && t.features.length ? `
<div class="tool-section">
<h4>Key features</h4>
<ul>${featuresHtml}</ul>
</div>
` : ''}
${t.benefit ? `
<div class="tool-section">
<h4>Why it matters</h4>
<p>${t.benefit}</p>
</div>
` : ''}
${t.notes ? `
<div class="tool-section">
<h4>Notes</h4>
<p>${t.notes}</p>
</div>
` : ''}
<div class="tool-footer">
${(t.feeds || []).map(g => `<span class="gate-tag">${g}</span>`).join('')}
</div>
</article>
`;
}
// ============================================================================
// FILTERING & SEARCH
// ============================================================================
let activeFilters = { tier: 'all', budget: 'all', search: '' };
function applyFilters() {
const cards = document.querySelectorAll('.tool-card');
const tierSections = document.querySelectorAll('.tier-section');
let visibleCount = 0;
const visiblePerTier = {};
cards.forEach(card => {
const tier = card.dataset.tier;
const budget = card.dataset.budget;
const search = card.dataset.search;
const tierMatch = activeFilters.tier === 'all' || tier === activeFilters.tier;
const budgetMatch = activeFilters.budget === 'all' || budget === activeFilters.budget;
const searchMatch = !activeFilters.search || search.includes(activeFilters.search);
const show = tierMatch && budgetMatch && searchMatch;
card.classList.toggle('hidden', !show);
if (show) {
visibleCount++;
visiblePerTier[tier] = (visiblePerTier[tier] || 0) + 1;
}
});
tierSections.forEach(section => {
const tier = section.dataset.tier;
section.classList.toggle('hidden', !visiblePerTier[tier]);
});
document.getElementById('resultCount').textContent = visibleCount;
document.getElementById('noResults').classList.toggle('visible', visibleCount === 0);
}
document.querySelectorAll('.filter-btn').forEach(btn => {
btn.addEventListener('click', () => {
const type = btn.dataset.filterType;
const value = btn.dataset.filter;
activeFilters[type] = value;
document.querySelectorAll(`.filter-btn[data-filter-type="${type}"]`).forEach(b => {
b.classList.toggle('active', b === btn);
});
applyFilters();
});
});
document.getElementById('searchInput').addEventListener('input', e => {
activeFilters.search = e.target.value.trim().toLowerCase();
applyFilters();
});
// Smooth scroll for TOC
document.querySelectorAll('.toc a').forEach(a => {
a.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(a.getAttribute('href'));
if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });
});
});
// Initial render
renderCatalog();
applyFilters();
// Sanity check the count
console.log('Total tools loaded:', TOOLS.length);
</script>
</body>
</html>
Original asset: RISER-Widget-Pain-Discovery-Tools-Merged.md
# Pain Discovery & VOC Tool Catalog — Merged Edition
**Verified April 2026.** This is the merged catalog: my original 20 + every valuable, verifiable source from three additional AI responses. All links confirmed live.
Total tools: **34**.
Tools each tool feeds. Tools organized by integration point with the RISER MVO Widget (not alphabetical) — the order tells you *where in the workflow they belong.*
---
## What I rejected and why
Three AI responses contributed candidates. Before reading the catalog, know what got cut:
- **GummySearch** — claimed by Response 3 to be "transitioning, scheduled to shut down by late 2026." That is wrong. **GummySearch shut down November 30, 2025** after Reddit denied API access. Confirmed via multiple independent 2026 sources. Excluded.
- **DemandDrop** (`demanddrop.com`), **MarketScope** (`marketscope.cc`) — Could not independently verify these as live operating products in 2026. Excluded rather than passing through unverified links.
- **Brandwatch's three separate URLs** (Responses 1+2 listed `/use-cases/consumer-research`, `/product/consumer-intelligence`, and the root) — Same product, three landing pages. Counted once.
- **Sprout Social's two URLs** and **Sprinklr's two URLs** — Same products, deep-linked feature pages. Counted once each.
- **Productboard listed twice** (root + `/pulse`) — Counted once.
- **Talkwalker listed twice** — Counted once.
## What I'm keeping from my original list
All 20 from my prior catalog stayed in. Notable reversals from prior position:
- **Enterprise tools** (Brandwatch, Sprout Social, Sprinklr, Talkwalker, Productboard) were previously excluded for budget mismatch. I'm adding them now per your "all valuable sources" directive, but I'm marking them clearly — a $50/month operator should not accidentally sign up for a $999/month tool.
---
## Tier 1 — Direct PainOnSocial Alternatives
Reddit-mining + pain-point scoring. Closest substitutes if PainOnSocial is unavailable. Output: scored pain points + verbatim quotes → feeds **Gate 00½**.
1. **PainOnSocial** — [www.painonsocial.com](https://www.painonsocial.com/) — AI Reddit scanner with 0–100 pain scoring across 30+ curated communities. Evidence quotes, AI solution seeds. The reference tool for the widget.
2. **Reddily** — [reddily.io](https://reddily.io/) — Chrome extension + dashboard. Uses Google Gemini to extract sentiment, pain points, feature requests, and quotes from any Reddit thread. Pay-per-analysis pricing.
3. **PainPointy** — [painpointy.com](https://painpointy.com/) — Surfaces pain points, content ideas, reply opportunities, brand mentions from Reddit. Smaller indie tool.
4. **BuzzAbout** — [buzzabout.ai](https://buzzabout.ai/) — Market research agent for Reddit and other social platforms. Broader coverage than Reddit-only tools.
5. **Syften** — [syften.com](https://syften.com/) — Tracks keywords across Reddit, Hacker News, and 10+ platforms. Real-time alerts. Closest like-for-like to discontinued GummySearch.
6. **Subreddit Signals** ⊕ — [subredditsignals.com](https://subredditsignals.com/) — AI-scored Reddit lead detection with 7-dimension intent classification (PURCHASE_READY, switching intent, budget questions). Built more for high-intent buyers than for raw pain mining, but produces structured pain-context data.
7. **Redreach** ⊕ — [reddireach.com](https://www.reddireach.com/) — AI-powered Reddit conversation discovery and reply assist. Volume-oriented (unlimited monitoring, no token caps) at ~$29/month. Pair with intent scoring from another tool to filter noise.
8. **Apify Reddit Pain Finder** ⊕ — [apify.com/solutionssmart/reddit-pain-finder](https://apify.com/solutionssmart/reddit-pain-finder) — Scraper that classifies posts into pain types (pricing, missing features, workflow friction, integration needs, switching) and ranks by priority. Works without API keys via RSS, or with Reddit OAuth at scale. The DIY/automation-friendly option.
---
## Tier 2 — Audience Intelligence
Where does the avatar gather, who do they follow, what language do they use about themselves? Feeds **Gate 01** and **Gate 05½ (Dream 100)**.
9. **SparkToro** — [sparktoro.com](https://sparktoro.com/) — The audience research standard. Search by keyword, hashtag, or natural-language description; get the websites, podcasts, YouTube channels, subreddits, and social accounts your audience actually engages with.
10. **AnswerThePublic** — [answerthepublic.com](https://answerthepublic.com/en) — Visualizes the questions people ask in autocomplete data. The "wh-" outputs are raw avatar pain language.
11. **AlsoAsked** — [alsoasked.com](https://alsoasked.com/) — Real-time "People Also Ask" data from Google in tree structure. The next question after the first one — high-leverage input for Gate 06½ (false belief audit).
12. **BuzzSumo** — [buzzsumo.com](https://buzzsumo.com/) — Question Analyzer searches forum posts across Amazon, Reddit, Quora, Q&A sites. Content Analyzer shows what's actually getting shared.
13. **Exploding Topics** — [explodingtopics.com](https://explodingtopics.com/) — Categories with rising search trajectory before saturation. Feeds Gate 01's market trajectory scale directly.
14. **Glimpse** ⊕ — [meetglimpse.com](https://meetglimpse.com/) — Trend discovery built on Google Trends data with absolute search volume, 12-month forecasts, and TikTok/Reddit/Instagram channel breakdowns. Closest competitor to Exploding Topics with more granular keyword tracking.
---
## Tier 3 — Voice-of-Customer Synthesis
Cluster, transcribe, and structure raw quotes. Feeds the **VOC vault** and **Gate 08 (Iterate)**.
15. **Dovetail** — [dovetail.com](https://dovetail.com/) — Customer intelligence platform. Centralize calls, tickets, surveys, interviews, reviews; AI auto-classifies into themes. The repository standard.
16. **Insight7** — [insight7.io](https://insight7.io/) — Auto-ingests recordings from Zoom, Google Meet, Teams; extracts themes by semantic meaning; generates branded reports with embedded evidence. Stronger automation than Dovetail at high session volumes.
17. **Conveo** — [conveo.ai](https://conveo.ai/) — AI-moderated video interviews with adaptive probing in 50+ languages. Built-in participant recruitment.
18. **User Interviews** — [www.userinterviews.com](https://www.userinterviews.com/) — Recruits participants from a panel of 6 million vetted consumers and professionals. Feeds Dovetail or Insight7.
19. **Productboard / Pulse** ⊕ — [www.productboard.com](https://www.productboard.com/) — Customer feedback aggregator and pain-point analyzer for product teams. Pulse module surfaces VOC pain points specifically. Mid-to-enterprise tier.
20. **Revuze** ⊕ — [revuze.it](https://www.revuze.it/) — Ingests unstructured customer language (reviews, support tickets, surveys) and converts it to structured market intelligence. Strongest for product/e-com VOC at scale.
21. **SentiSum** ⊕ — [sentisum.com](https://www.sentisum.com/) — Root-cause analysis on customer support complaints. Surfaces systemic problems worth solving — useful for Gate 08 when you have live customer data and want to know what's *actually* breaking.
---
## Tier 4 — Listening & Monitoring
Real-time signal of where customers voice pain. Feeds **Gate 08** refund-interview discipline and **Gate 09** pivot diagnostic.
22. **F5Bot** — [f5bot.com](https://f5bot.com/) — Free email alerts for Reddit, Hacker News, Lobsters keywords. Zero cost, no analytics. Baseline tool.
23. **Brand24** — [brand24.com](https://brand24.com/) — Cross-platform mention monitoring with sentiment analysis. Mid-tier pricing, broader than Reddit-only.
24. **Mention** — [mention.com](https://mention.com/) — Real-time alerts across web and social. Useful for tracking how customers describe competitors — the complaints become Gate 06 hooks.
25. **Awario** — [awario.com](https://awario.com/) — Brand monitoring with Reddit coverage and Boolean search at accessible price.
26. **Social Searcher** ⊕ — [social-searcher.com](https://www.social-searcher.com/) — Real-time multi-platform social monitoring with sentiment analysis. Has a generous free tier — useful before committing to paid tools.
27. **Hootsuite** ⊕ ★ — [www.hootsuite.com](https://www.hootsuite.com/) — Social media management suite with listening capabilities. Stronger for scheduling than for pain mining; included for completeness. **Mid-to-enterprise pricing.**
28. **Agorapulse** ⊕ — [www.agorapulse.com](https://www.agorapulse.com/) — Social media management with built-in listening and inbox unification. Mid-tier pricing.
29. **BrandMentions** ⊕ — [brandmentions.com](https://brandmentions.com/) — Real-time brand and competitor mention tracking across web and social with sentiment.
30. **YouScan** ⊕ — [youscan.io](https://youscan.io/) — Visual + text social listening with AI-powered image recognition. Distinct in that it analyzes images, not just text — useful when your category is visual (consumer goods, fashion, food).
---
## Tier 5 — Enterprise Listening & Consumer Intelligence ★
**Pricing: $500–$5,000+/month.** Listed for completeness because Responses 1/2 included them and they are real, capable platforms. Operationally: you do not need these to walk the widget. Most operators the widget serves should not buy these. They earn their cost only past Gate 11 when you're running at a scale that justifies enterprise spend.
31. **Brandwatch** ★ — [www.brandwatch.com](https://www.brandwatch.com/) — Consumer intelligence and social listening at enterprise scale. Strong sentiment, segment, and trend analysis across thousands of sources. **Custom enterprise pricing.**
32. **Sprout Social** ★ — [sproutsocial.com](https://sproutsocial.com/) — Social listening, analytics, and engagement platform. **Pricing starts ~$199/seat/month.**
33. **Sprinklr** ★ — [www.sprinklr.com](https://www.sprinklr.com/) — Unified CXM platform with social sentiment and enterprise CX insights. **Custom enterprise pricing, typically $1,000+/month.**
34. **Talkwalker** ★ — [www.talkwalker.com](https://www.talkwalker.com/) — Consumer intelligence platform with broad language and source coverage. **Custom enterprise pricing.**
---
## Tier 6 — Idea & Offer Validation (Adjacent)
Not pain discovery per se, but adjacent: validate the *offer* once the pain is identified. Feeds **Gate 02** (Idea/No Idea) and **Gate 04** (Grand Slam Offer).
35. **IdeaProof** ⊕ — [ideaproof.io](https://ideaproof.io/) — AI startup validator with market analysis, competitor insights, and structured reports. Free tier, ~120-second turnaround.
36. **DimeADozen** ⊕ — [dimeadozen.ai](https://www.dimeadozen.ai/) — AI-generated 40+ page validation reports covering market viability, monetization, competitor analysis, MVP planning, risk assessment.
37. **ValidatorAI** ⊕ — [validatorai.com](https://validatorai.com/) — AI advisor that scores ideas, simulates customer feedback, and suggests next steps. Used by 300,000+ founders.
38. **Wynter** ⊕ — [wynter.com](https://wynter.com/) — On-demand B2B message testing. Get 12–48 hour feedback from verified ICPs (job-title and industry filtered). The closest tool to "test your Gate 06 copy with real buyers before launching." **Mid-tier pricing (~$540+).**
39. **Prelaunch** ⊕ — [prelaunch.com](https://www.prelaunch.com/) — Measures actual market reaction (pre-orders, landing-page conversion) before product release. Real-money signal beats hypothetical interest.
---
## Tier 7 — Quantitative Validation
After qualitative pain, validate with structured surveys and behavioral data. Feeds **Gate 03** (cost of inaction) and **Gate 09** (funnel diagnostic).
40. **Typeform** — [www.typeform.com](https://www.typeform.com/) — Conversational surveys with high completion rates. Best for follow-up validation surveys to refund interviewees and Dream 100.
41. **Hotjar** — [www.hotjar.com](https://www.hotjar.com/) — Heatmaps, session recordings, on-page feedback polls. The diagnostic input for Gate 09's hook/audience/offer triage.
---
## Legend
- **⊕** — Added in this revision (not in my original 20).
- **★** — Enterprise-tier pricing. Operating-budget mismatch for most operators the widget serves.
- **No mark** — From the original verified list.
---
## Final count by tier
| Tier | Tools | Purpose |
|------|-------|---------|
| 1 — Direct alternatives | 8 | Reddit pain mining, scored output, feeds Gate 00½ |
| 2 — Audience intelligence | 6 | Gate 01 + Gate 05½ |
| 3 — VOC synthesis | 7 | Cluster + structure quotes, feeds VOC vault |
| 4 — Listening & monitoring | 9 | Gate 08 + Gate 09 |
| 5 — Enterprise listening ★ | 4 | Same workflows at scale, premium pricing |
| 6 — Idea & offer validation | 5 | Gate 02 + Gate 04 (adjacent to pain discovery) |
| 7 — Quantitative validation | 2 | Gate 03 + Gate 09 |
| **Total** | **41** | |
**Note on the count:** I aimed for ~34 unique tools after dedup but ended up at 41 because I split out tools that genuinely serve different gates (Tier 6 emerged from Response 3's contributions). If you want a strict 34, drop the four enterprise-tier (★) entries and Productboard, since you can already cover those workflows with Tier 1–4 tools.
---
## How to use this catalog
**Minimum viable stack for a new operator:** one Tier 1 + one Tier 2 + Typeform. ~$60–100/month total. Walks every gate.
**Scale-up stack (post-Gate 08):** add one Tier 3 tool (Dovetail or Insight7) once you have 10+ customers to interview, plus one Tier 4 listening tool for ongoing market signal.
**Enterprise stack (post-Gate 11):** Tier 5 tools start to earn their keep when you're running multi-channel campaigns and need cross-platform sentiment intelligence at scale.
**Avoid stack:** anything you sign up for before talking to 5 real customers. The widget's Gate 00½ skip-path exists because operator hypothesis can carry you to Gate 03 without paying anyone. Don't shop tools to avoid talking to humans.
Original Word reference table
Exact extracted catalog and gate data
{
"RISER-Tool-Catalog": {
"TOOLS": [
{
"id": "painonsocial",
"name": "PainOnSocial",
"url": "https://www.painonsocial.com/",
"urlDisplay": "painonsocial.com",
"tier": 1,
"pricing": "Starter $19/mo · Pro $49/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "AI Reddit scanner with 0–100 pain scoring across 30+ curated communities. Evidence quotes, AI-generated solution ideas, audience analysis. The reference tool for the widget.",
"features": [
"0–100 pain score per opportunity",
"Real Reddit quotes + permalinks",
"AI solution ideas with monetization",
"Curated 30+ subreddit catalog",
"Audience demographics analysis"
],
"benefit": "Compresses weeks of manual subreddit reading into a single scan with structured, verifiable output.",
"feeds": [
"Gate 00½"
],
"notes": "7-day free trial on Starter. Pro adds 15 scans/day, 5 subreddits, 90-day timeframes."
},
{
"id": "reddily",
"name": "Reddily",
"url": "https://reddily.io/",
"urlDisplay": "reddily.io",
"tier": 1,
"pricing": "Pay-per-analysis · 5 free credits",
"pricingTier": "cheap",
"flags": [],
"blurb": "Chrome extension + dashboard. Uses Google Gemini to extract sentiment, pain points, feature requests, and quotes from any Reddit thread. Pay-per-analysis pricing.",
"features": [
"One-click thread analysis",
"Batch processing up to 25 threads",
"Sentiment + pain extraction",
"Feature-request detection",
"Chrome extension"
],
"benefit": "Best for ad-hoc research where you don't want a recurring subscription.",
"feeds": [
"Gate 00½"
],
"notes": "Pay-per-analysis model means you only pay for what you scan."
},
{
"id": "painpointy",
"name": "PainPointy",
"url": "https://painpointy.com/",
"urlDisplay": "painpointy.com",
"tier": 1,
"pricing": "Pricing on site",
"pricingTier": "cheap",
"flags": [],
"blurb": "Surfaces pain points, content ideas, reply opportunities, and brand mentions from Reddit. Smaller indie tool with a similar shape to PainOnSocial.",
"features": [
"60-second subreddit scans",
"Daily agency reports",
"Reply opportunity detection",
"Content idea surfacing"
],
"benefit": "Lighter-weight alternative if PainOnSocial pricing or interface doesn't fit.",
"feeds": [
"Gate 00½",
"Gate 06"
]
},
{
"id": "buzzabout",
"name": "BuzzAbout",
"url": "https://buzzabout.ai/",
"urlDisplay": "buzzabout.ai",
"tier": 1,
"pricing": "Pricing on site",
"pricingTier": "cheap",
"flags": [],
"blurb": "Market research agent for Reddit and other social platforms. Broader source coverage than Reddit-only tools.",
"features": [
"Multi-platform coverage",
"AI agent workflow",
"Market trend tracking"
],
"benefit": "Useful when your audience lives on more than just Reddit.",
"feeds": [
"Gate 00½",
"Gate 01"
]
},
{
"id": "syften",
"name": "Syften",
"url": "https://syften.com/",
"urlDisplay": "syften.com",
"tier": 1,
"pricing": "~$39.95/mo Standard",
"pricingTier": "cheap",
"flags": [],
"blurb": "Tracks keywords across Reddit, Hacker News, and 10+ platforms. Real-time alerts. Closest like-for-like replacement for the discontinued GummySearch monitoring workflow.",
"features": [
"Reddit + HN + 10+ platforms",
"Boolean search support",
"Slack alerts",
"20 filters on Standard"
],
"benefit": "The tool to use if you specifically miss GummySearch's alert-and-monitor workflow.",
"feeds": [
"Gate 00½",
"Gate 09"
]
},
{
"id": "subredditsignals",
"name": "Subreddit Signals",
"url": "https://subredditsignals.com/",
"urlDisplay": "subredditsignals.com",
"tier": 1,
"pricing": "Starter $19.99/mo",
"pricingTier": "cheap",
"flags": [
"new"
],
"blurb": "AI-scored Reddit lead detection with 7-dimension intent classification (PURCHASE_READY, switching intent, budget questions). Built more for high-intent buyers than for raw pain mining.",
"features": [
"7-dimension intent scoring",
"PURCHASE_READY classification",
"15 weekly lead tokens (Starter)",
"AI comment templates",
"Switching-intent detection"
],
"benefit": "Best when you want leads, not just pain points — already-qualified buyers actively searching.",
"feeds": [
"Gate 00½",
"Gate 05"
]
},
{
"id": "redreach",
"name": "Redreach",
"url": "https://www.reddireach.com/",
"urlDisplay": "reddireach.com",
"tier": 1,
"pricing": "~$29/mo unlimited",
"pricingTier": "cheap",
"flags": [
"new"
],
"blurb": "AI-powered Reddit conversation discovery and reply assist. Volume-oriented (unlimited monitoring, no token caps). Pair with intent scoring from another tool to filter noise.",
"features": [
"Unlimited monitoring",
"No token caps",
"AI reply assist",
"Google-ranking post detection",
"Bulk DM workflow"
],
"benefit": "Volume play if you have time to filter manually and want broad coverage.",
"feeds": [
"Gate 00½",
"Gate 05"
]
},
{
"id": "apify-reddit",
"name": "Apify Reddit Pain Finder",
"url": "https://apify.com/solutionssmart/reddit-pain-finder",
"urlDisplay": "apify.com/solutionssmart/reddit-pain-finder",
"tier": 1,
"pricing": "Pay-per-result",
"pricingTier": "cheap",
"flags": [
"new"
],
"blurb": "Scraper that classifies posts into pain types (pricing, missing features, workflow friction, integration needs, switching) and ranks by priority. Works without API keys via RSS, or with Reddit OAuth at scale.",
"features": [
"Pain-type classification",
"Priority scoring",
"Promo-post filtering",
"Webhooks + n8n + Make + Zapier",
"No API key required"
],
"benefit": "The DIY/automation-friendly option. Ideal if you want to pipe Reddit pain data into your own workflow.",
"feeds": [
"Gate 00½"
],
"notes": "Built on Apify platform — supports scheduling, monitoring, integrations."
},
{
"id": "sparktoro",
"name": "SparkToro",
"url": "https://sparktoro.com/",
"urlDisplay": "sparktoro.com",
"tier": 2,
"pricing": "Personal $38/mo · Business $112/mo · Free 5 searches/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "The audience research standard. Search by keyword, hashtag, or natural-language description; get the websites, podcasts, YouTube channels, subreddits, and social accounts your audience actually engages with.",
"features": [
"Audience clickstream + Google + social",
"\"Describe Your Audience\" natural language",
"Email-list audience analysis",
"Podcast + YouTube + subreddit data",
"Compare Audiences feature"
],
"benefit": "Tells you exactly where the avatar gathers — feeds Gate 01 and Gate 05½ Dream 100.",
"feeds": [
"Gate 01",
"Gate 05½"
]
},
{
"id": "answerthepublic",
"name": "AnswerThePublic",
"url": "https://answerthepublic.com/en",
"urlDisplay": "answerthepublic.com",
"tier": 2,
"pricing": "Free 3 searches/day · Paid from ~$11/mo",
"pricingTier": "cheap",
"flags": [
"free"
],
"blurb": "Visualizes the questions people ask in autocomplete data. The \"wh-\" outputs are raw avatar pain language, ready to drop into copy.",
"features": [
"Google + Bing autocomplete data",
"Question wheel visualization",
"CSV export",
"New AI Dashboard"
],
"benefit": "Instant raw customer language. The questions are the pain in their own words.",
"feeds": [
"Gate 01",
"Gate 06"
]
},
{
"id": "alsoasked",
"name": "AlsoAsked",
"url": "https://alsoasked.com/",
"urlDisplay": "alsoasked.com",
"tier": 2,
"pricing": "Free 3 searches/day · Paid $15–59/mo",
"pricingTier": "cheap",
"flags": [
"free"
],
"blurb": "Real-time \"People Also Ask\" data from Google in tree structure. Shows the next question your prospect is going to ask after the first one.",
"features": [
"Real-time PAA scraping",
"Tree-structured question hierarchy",
"CSV export",
"Visual question mapping"
],
"benefit": "High-leverage for Gate 06½ false belief audit — Google has already clustered the next objection for you.",
"feeds": [
"Gate 06",
"Gate 06½"
]
},
{
"id": "buzzsumo",
"name": "BuzzSumo",
"url": "https://buzzsumo.com/",
"urlDisplay": "buzzsumo.com",
"tier": 2,
"pricing": "From ~$199/mo",
"pricingTier": "mid",
"flags": [],
"blurb": "Question Analyzer searches forum posts across Amazon, Reddit, Quora, Q&A sites. Content Analyzer shows what's actually getting shared.",
"features": [
"Question Analyzer (Amazon, Reddit, Quora)",
"Content trend tracking",
"Trending feeds 24h windows",
"Media database & journalist outreach",
"Slack integration"
],
"benefit": "Combines pain mining with content performance — what gets shared is what gets clicked.",
"feeds": [
"Gate 01",
"Gate 06"
]
},
{
"id": "explodingtopics",
"name": "Exploding Topics",
"url": "https://explodingtopics.com/",
"urlDisplay": "explodingtopics.com",
"tier": 2,
"pricing": "Pro from ~$39/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "Categories with rising search trajectory before saturation. Feeds Gate 01's market trajectory scale directly.",
"features": [
"Trend categorization",
"Long-term momentum scoring",
"Category browsing (food, fitness, fintech, etc.)",
"Trend reports"
],
"benefit": "Validates Gate 01 market trajectory with hard search data before you commit.",
"feeds": [
"Gate 01"
]
},
{
"id": "glimpse",
"name": "Glimpse",
"url": "https://meetglimpse.com/",
"urlDisplay": "meetglimpse.com",
"tier": 2,
"pricing": "Free 10 searches/mo · Paid from $99/mo",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "Trend discovery built on Google Trends with absolute search volume, 12-month forecasts, and TikTok/Reddit/Instagram channel breakdowns.",
"features": [
"Absolute search volume (vs Google Trends 0–100 scale)",
"12-month forecast (95%+ backtested accuracy)",
"TikTok/Reddit/Instagram channel data",
"Chrome extension",
"Real-time alerts"
],
"benefit": "Closest competitor to Exploding Topics with more granular keyword tracking and forecasting.",
"feeds": [
"Gate 01",
"Gate 02"
]
},
{
"id": "dovetail",
"name": "Dovetail",
"url": "https://dovetail.com/",
"urlDisplay": "dovetail.com",
"tier": 3,
"pricing": "Free plan · Paid from $29/mo per user",
"pricingTier": "cheap",
"flags": [
"free"
],
"blurb": "Customer intelligence platform. Centralize calls, tickets, surveys, interviews, reviews; AI auto-classifies into themes. The repository standard.",
"features": [
"Auto-import calls, tickets, surveys, interviews, reviews",
"AI theme classification",
"Searchable insight repository",
"Cross-project synthesis",
"Atomic UX research method"
],
"benefit": "The default choice for customer-research teams who want everything in one place.",
"feeds": [
"VOC Vault",
"Gate 08"
]
},
{
"id": "insight7",
"name": "Insight7",
"url": "https://insight7.io/",
"urlDisplay": "insight7.io",
"tier": 3,
"pricing": "Custom pricing",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "Auto-ingests recordings from Zoom, Google Meet, Teams; extracts themes by semantic meaning; generates branded reports with embedded evidence. Stronger automation than Dovetail at high session volumes.",
"features": [
"Auto-ingest Zoom/Meet/Teams",
"Semantic theme extraction (no manual tagging)",
"Branded reports with frequency data",
"Cross-session synthesis",
"Dropbox + Drive integration"
],
"benefit": "Built for teams running 50+ interviews per month who need automation, not manual tagging.",
"feeds": [
"VOC Vault",
"Gate 08"
]
},
{
"id": "conveo",
"name": "Conveo",
"url": "https://conveo.ai/",
"urlDisplay": "conveo.ai",
"tier": 3,
"pricing": "Custom enterprise pricing",
"pricingTier": "enterprise",
"flags": [
"new"
],
"blurb": "AI-moderated video interviews with adaptive probing in 50+ languages. Built-in participant recruitment.",
"features": [
"Async AI-moderated video interviews",
"50+ languages with adaptive follow-ups",
"Built-in participant panel",
"Multimodal analysis (speech + tone + visual)",
"Cross-study insight library"
],
"benefit": "Use when you need fresh interview data, not just analysis of existing conversations.",
"feeds": [
"VOC Vault"
]
},
{
"id": "userinterviews",
"name": "User Interviews",
"url": "https://www.userinterviews.com/",
"urlDisplay": "userinterviews.com",
"tier": 3,
"pricing": "Pay per recruit (~$25–100/participant)",
"pricingTier": "mid",
"flags": [],
"blurb": "Recruits participants from a panel of 6 million vetted consumers and professionals. Now part of UserTesting.",
"features": [
"6M+ vetted participants",
"Bring-your-own-audience option",
"Scheduling + incentive management",
"Demographic + behavioral targeting"
],
"benefit": "The fastest way to get interviews scheduled when you don't have your own audience yet.",
"feeds": [
"VOC Vault"
]
},
{
"id": "productboard",
"name": "Productboard / Pulse",
"url": "https://www.productboard.com/",
"urlDisplay": "productboard.com",
"tier": 3,
"pricing": "Essentials from $19/maker/mo · Pulse enterprise",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "Customer feedback aggregator and pain-point analyzer for product teams. Pulse module surfaces VOC pain points specifically.",
"features": [
"Centralized customer feedback",
"Feature prioritization",
"Pulse VOC module",
"Roadmap integration"
],
"benefit": "Best when feedback needs to feed into product decisions, not just live in a research repository.",
"feeds": [
"VOC Vault",
"Gate 08"
]
},
{
"id": "revuze",
"name": "Revuze",
"url": "https://www.revuze.it/",
"urlDisplay": "revuze.it",
"tier": 3,
"pricing": "Custom enterprise pricing",
"pricingTier": "enterprise",
"flags": [
"new"
],
"blurb": "Ingests unstructured customer language (reviews, support tickets, surveys) and converts it to structured market intelligence. Strongest for product/e-com VOC at scale.",
"features": [
"Unstructured-to-structured AI conversion",
"Multi-source ingestion",
"Sentiment + topic clustering",
"Trend forecasting"
],
"benefit": "Built for e-commerce or product orgs swimming in review data.",
"feeds": [
"VOC Vault"
]
},
{
"id": "sentisum",
"name": "SentiSum",
"url": "https://www.sentisum.com/",
"urlDisplay": "sentisum.com",
"tier": 3,
"pricing": "Custom pricing",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "Root-cause analysis on customer support complaints. Surfaces systemic problems worth solving.",
"features": [
"Support-ticket auto-tagging",
"Root-cause clustering",
"Sentiment + intent detection",
"CRM integrations"
],
"benefit": "Use when you have live customer data and want to know what's actually breaking.",
"feeds": [
"Gate 08",
"Gate 09"
]
},
{
"id": "f5bot",
"name": "F5Bot",
"url": "https://f5bot.com/",
"urlDisplay": "f5bot.com",
"tier": 4,
"pricing": "Free",
"pricingTier": "free",
"flags": [
"free"
],
"blurb": "Free email alerts for Reddit, Hacker News, Lobsters keywords. Zero cost, no analytics. The baseline tool.",
"features": [
"Email alerts on keyword mentions",
"Reddit + Hacker News + Lobsters",
"No account complexity"
],
"benefit": "Free, dependable, gets out of the way. The first tool to install when you start.",
"feeds": [
"Gate 08",
"Gate 09"
]
},
{
"id": "brand24",
"name": "Brand24",
"url": "https://brand24.com/",
"urlDisplay": "brand24.com",
"tier": 4,
"pricing": "From $99/mo",
"pricingTier": "mid",
"flags": [],
"blurb": "Cross-platform mention monitoring with sentiment analysis. Mid-tier pricing, broader than Reddit-only.",
"features": [
"Cross-platform mention tracking",
"Sentiment analysis",
"Influencer detection",
"Reddit + web + social"
],
"benefit": "The mid-tier choice when F5Bot isn't enough but Brandwatch is overkill.",
"feeds": [
"Gate 09"
]
},
{
"id": "mention",
"name": "Mention",
"url": "https://mention.com/",
"urlDisplay": "mention.com",
"tier": 4,
"pricing": "From $41/mo Solo",
"pricingTier": "mid",
"flags": [],
"blurb": "Real-time alerts across web and social. Useful for tracking how customers describe competitors — the complaints become Gate 06 hooks.",
"features": [
"Real-time alerts",
"Boolean search",
"Web + social coverage",
"Sentiment scoring"
],
"benefit": "Watch competitors get complained about in real time, then write a hook against the complaint.",
"feeds": [
"Gate 06",
"Gate 09"
]
},
{
"id": "awario",
"name": "Awario",
"url": "https://awario.com/",
"urlDisplay": "awario.com",
"tier": 4,
"pricing": "From $29/mo Starter",
"pricingTier": "cheap",
"flags": [],
"blurb": "Brand monitoring with Reddit coverage and Boolean search at accessible price.",
"features": [
"Boolean search",
"Reddit + web + social",
"Lead detection",
"Sentiment analysis"
],
"benefit": "The most accessible price point in the listening category for a real product.",
"feeds": [
"Gate 09"
]
},
{
"id": "social-searcher",
"name": "Social Searcher",
"url": "https://www.social-searcher.com/",
"urlDisplay": "social-searcher.com",
"tier": 4,
"pricing": "Free tier · Paid from $4.50/mo",
"pricingTier": "free",
"flags": [
"new",
"free"
],
"blurb": "Real-time multi-platform social monitoring with sentiment analysis. Generous free tier — useful before committing to paid tools.",
"features": [
"Multi-platform free search",
"Sentiment analysis",
"Real-time monitoring",
"Email alerts"
],
"benefit": "The cheapest paid plan in the catalog. Worth trying before paying for Brand24 or Mention.",
"feeds": [
"Gate 09"
]
},
{
"id": "hootsuite",
"name": "Hootsuite",
"url": "https://www.hootsuite.com/",
"urlDisplay": "hootsuite.com",
"tier": 4,
"pricing": "Professional $99/mo · Insights ~$600–1200/mo",
"pricingTier": "enterprise",
"flags": [
"new",
"enterprise"
],
"blurb": "Social media management suite with listening capabilities. Stronger for scheduling than for pain mining; included for completeness.",
"features": [
"Multi-account scheduling",
"Insights add-on for listening",
"Sentiment analysis (paid tiers)",
"Team collaboration"
],
"benefit": "Use only if you already need a scheduler. Don't buy this for pain mining alone.",
"feeds": [
"Gate 09"
]
},
{
"id": "agorapulse",
"name": "Agorapulse",
"url": "https://www.agorapulse.com/",
"urlDisplay": "agorapulse.com",
"tier": 4,
"pricing": "From $79/mo Standard",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "Social media management with built-in listening and inbox unification. Mid-tier pricing.",
"features": [
"Unified social inbox",
"Listening add-on",
"Approval workflows",
"CRM-light contact tracking"
],
"benefit": "Cleaner UX than Hootsuite, better for small teams that want one tool for everything.",
"feeds": [
"Gate 09"
]
},
{
"id": "brandmentions",
"name": "BrandMentions",
"url": "https://brandmentions.com/",
"urlDisplay": "brandmentions.com",
"tier": 4,
"pricing": "From $99/mo Growing Business",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "Real-time brand and competitor mention tracking across web and social with sentiment.",
"features": [
"Web + social mention tracking",
"Competitor monitoring",
"Sentiment analysis",
"Influencer identification"
],
"benefit": "Solid mid-tier alternative to Brand24 with similar capabilities.",
"feeds": [
"Gate 09"
]
},
{
"id": "youscan",
"name": "YouScan",
"url": "https://youscan.io/",
"urlDisplay": "youscan.io",
"tier": 4,
"pricing": "Custom pricing",
"pricingTier": "enterprise",
"flags": [
"new",
"enterprise"
],
"blurb": "Visual + text social listening with AI-powered image recognition. Distinct in that it analyzes images, not just text — useful when your category is visual.",
"features": [
"Image recognition AI",
"Logo + product detection",
"Text + visual sentiment",
"Audience insights"
],
"benefit": "The only tool here that mines images. Essential if your category is visual (fashion, food, consumer goods).",
"feeds": [
"Gate 01",
"Gate 09"
]
},
{
"id": "brandwatch",
"name": "Brandwatch",
"url": "https://www.brandwatch.com/",
"urlDisplay": "brandwatch.com",
"tier": 5,
"pricing": "Custom enterprise pricing (typically $1,000+/mo)",
"pricingTier": "enterprise",
"flags": [
"enterprise"
],
"blurb": "Consumer intelligence and social listening at enterprise scale. Strong sentiment, segment, and trend analysis across thousands of sources.",
"features": [
"Consumer intelligence at scale",
"Cross-platform sentiment",
"Segmentation + audience profiling",
"Custom dashboards",
"Historical data depth"
],
"benefit": "Industry leader. Earn its keep at high scale where the depth pays back. Overkill below that.",
"feeds": [
"Gate 09"
]
},
{
"id": "sproutsocial",
"name": "Sprout Social",
"url": "https://sproutsocial.com/",
"urlDisplay": "sproutsocial.com",
"tier": 5,
"pricing": "From $199/seat/mo · Listening tier higher",
"pricingTier": "enterprise",
"flags": [
"enterprise"
],
"blurb": "Social listening, analytics, and engagement platform.",
"features": [
"Listening + engagement + publishing unified",
"CRM integrations",
"Reporting + analytics",
"Approval workflows"
],
"benefit": "When you need listening + management in one tool and have the budget.",
"feeds": [
"Gate 09"
]
},
{
"id": "sprinklr",
"name": "Sprinklr",
"url": "https://www.sprinklr.com/",
"urlDisplay": "sprinklr.com",
"tier": 5,
"pricing": "Custom enterprise pricing (typically $1,000+/mo)",
"pricingTier": "enterprise",
"flags": [
"enterprise"
],
"blurb": "Unified CXM platform with social sentiment and enterprise CX insights.",
"features": [
"Unified CXM platform",
"Cross-channel sentiment",
"AI-powered insights",
"Customer service integration"
],
"benefit": "Only justifiable for large orgs running coordinated CX across many channels.",
"feeds": [
"Gate 09"
]
},
{
"id": "talkwalker",
"name": "Talkwalker",
"url": "https://www.talkwalker.com/",
"urlDisplay": "talkwalker.com",
"tier": 5,
"pricing": "Custom enterprise pricing",
"pricingTier": "enterprise",
"flags": [
"enterprise"
],
"blurb": "Consumer intelligence platform with broad language and source coverage.",
"features": [
"187+ languages supported",
"Image + video recognition",
"Trend detection",
"Crisis monitoring"
],
"benefit": "Strongest in non-English markets. Enterprise pricing limits applicability.",
"feeds": [
"Gate 09"
]
},
{
"id": "ideaproof",
"name": "IdeaProof",
"url": "https://ideaproof.io/",
"urlDisplay": "ideaproof.io",
"tier": 6,
"pricing": "Free tier · Paid available",
"pricingTier": "free",
"flags": [
"new",
"free"
],
"blurb": "AI startup validator with market analysis, competitor insights, and structured reports. ~120-second turnaround.",
"features": [
"120-second AI validation",
"Market analysis",
"Competitor insights",
"Investor-ready reports"
],
"benefit": "Fast first-pass sanity check on Gate 02 before committing time.",
"feeds": [
"Gate 02"
]
},
{
"id": "dimeadozen",
"name": "DimeADozen",
"url": "https://www.dimeadozen.ai/",
"urlDisplay": "dimeadozen.ai",
"tier": 6,
"pricing": "Free trial · Paid plans available",
"pricingTier": "cheap",
"flags": [
"new"
],
"blurb": "AI-generated 40+ page validation reports covering market viability, monetization, competitor analysis, MVP planning, and risk assessment.",
"features": [
"40+ page reports in <20s",
"Market viability + competitive analysis",
"MVP planning",
"Pivot suggestions",
"Risk assessment"
],
"benefit": "Replaces weeks of desk research with a structured first-draft report.",
"feeds": [
"Gate 02"
]
},
{
"id": "validatorai",
"name": "ValidatorAI",
"url": "https://validatorai.com/",
"urlDisplay": "validatorai.com",
"tier": 6,
"pricing": "Free + custom pricing",
"pricingTier": "free",
"flags": [
"new",
"free"
],
"blurb": "AI advisor that scores ideas, simulates customer feedback, and suggests next steps. Used by 300,000+ founders.",
"features": [
"Idea scoring + grading",
"Simulated customer feedback",
"Launch-readiness guidance",
"24/7 AI mentor chatbot"
],
"benefit": "The \"talk to an AI advisor\" version of validation — useful for the question-answer interaction style.",
"feeds": [
"Gate 02"
]
},
{
"id": "wynter",
"name": "Wynter",
"url": "https://wynter.com/",
"urlDisplay": "wynter.com",
"tier": 6,
"pricing": "From ~$540/test",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "On-demand B2B message testing. Get 12–48 hour feedback from verified ICPs (job-title and industry filtered). The closest tool to \"test your Gate 06 copy with real buyers before launching.\"",
"features": [
"Verified ICP audience (60K+ B2B professionals)",
"Job-title + industry targeting",
"12–48 hour turnaround",
"Message testing + brand research",
"Persona research"
],
"benefit": "Stops you from launching copy that's convincing only to yourself. Brutal but accurate.",
"feeds": [
"Gate 04",
"Gate 06",
"Gate 06½"
]
},
{
"id": "prelaunch",
"name": "Prelaunch",
"url": "https://www.prelaunch.com/",
"urlDisplay": "prelaunch.com",
"tier": 6,
"pricing": "Custom pricing",
"pricingTier": "mid",
"flags": [
"new"
],
"blurb": "Measures actual market reaction (pre-orders, landing-page conversion) before product release. Real-money signal beats hypothetical interest.",
"features": [
"Pre-order capture + measurement",
"Landing-page conversion testing",
"Concept validation surveys",
"Price-sensitivity testing"
],
"benefit": "The most rigorous Gate 02 / Gate 04 validation — buyer money on the line, not just stated intent.",
"feeds": [
"Gate 02",
"Gate 04",
"Gate 07"
]
},
{
"id": "typeform",
"name": "Typeform",
"url": "https://www.typeform.com/",
"urlDisplay": "typeform.com",
"tier": 7,
"pricing": "Free tier · Basic from $25/mo",
"pricingTier": "free",
"flags": [
"free"
],
"blurb": "Conversational surveys with high completion rates. Best for follow-up validation surveys to refund interviewees and Dream 100.",
"features": [
"One-question-at-a-time format",
"Logic jumps + conditional flows",
"Integrations (Zapier, etc.)",
"Free tier with 10 responses/mo"
],
"benefit": "Higher completion rates than form-style surveys. Worth the premium for that alone.",
"feeds": [
"Gate 03",
"Gate 05½",
"Gate 08"
]
},
{
"id": "hotjar",
"name": "Hotjar",
"url": "https://www.hotjar.com/",
"urlDisplay": "hotjar.com",
"tier": 7,
"pricing": "Free tier · Plus from $39/mo",
"pricingTier": "free",
"flags": [
"free"
],
"blurb": "Heatmaps, session recordings, on-page feedback polls. The diagnostic input for Gate 09's hook/audience/offer triage.",
"features": [
"Heatmaps (clicks, scroll, attention)",
"Session recordings",
"On-page feedback polls",
"Conversion-funnel analysis"
],
"benefit": "Tells you where users actually drop off — Gate 09 hook vs. audience vs. offer diagnostic.",
"feeds": [
"Gate 03",
"Gate 09"
]
}
],
"TIERS": [
{
"num": 1,
"id": "tier-1",
"name": "Reddit Pain Mining & Direct Alternatives",
"purpose": "Reddit-mining + pain-point scoring. The closest substitutes if PainOnSocial is unavailable. Output feeds <span class=\"gate-ref\">Gate 00½ Pain Discovery</span>."
},
{
"num": 2,
"id": "tier-2",
"name": "Audience Intelligence",
"purpose": "Where does the avatar gather, who do they follow, what language do they use? Feeds <span class=\"gate-ref\">Gate 01 Hungry Avatar</span> and <span class=\"gate-ref\">Gate 05½ Dream 100</span>."
},
{
"num": 3,
"id": "tier-3",
"name": "Voice-of-Customer Synthesis",
"purpose": "Cluster, transcribe, and structure raw quotes from interviews and feedback. Feeds the <span class=\"gate-ref\">VOC Vault</span> and <span class=\"gate-ref\">Gate 08 Iterate</span>."
},
{
"num": 4,
"id": "tier-4",
"name": "Listening & Monitoring",
"purpose": "Real-time signal of where customers voice pain. Feeds <span class=\"gate-ref\">Gate 08</span> refund-interview discipline and <span class=\"gate-ref\">Gate 09 Pivot or Hold</span>."
},
{
"num": 5,
"id": "tier-5",
"name": "Enterprise Listening (★)",
"purpose": "Same workflows as Tier 4, executed at platform scale. <strong>Pricing $500–$5,000+/mo.</strong> Most operators the widget serves should not buy these. They earn keep only past Gate 11 at multi-channel scale."
},
{
"num": 6,
"id": "tier-6",
"name": "Idea & Offer Validation",
"purpose": "Not pain discovery — adjacent. Validates the <em>offer</em> once the pain is identified. Feeds <span class=\"gate-ref\">Gate 02 Idea/No Idea</span> and <span class=\"gate-ref\">Gate 04 Grand Slam Offer</span>."
},
{
"num": 7,
"id": "tier-7",
"name": "Quantitative Validation",
"purpose": "After qualitative pain, validate with structured surveys and behavioral data. Feeds <span class=\"gate-ref\">Gate 03</span> and <span class=\"gate-ref\">Gate 09</span>."
}
]
},
"RISER-Client-Acquisition-Catalog": {
"TOOLS": [
{
"id": "leadinfo",
"name": "Leadinfo",
"url": "https://www.leadinfo.com/",
"urlDisplay": "leadinfo.com",
"tier": 1,
"pricing": "From €69/mo Starter · 14-day free trial",
"pricingTier": "cheap",
"flags": [
"essential"
],
"blurb": "Cookieless visitor identification. Tells you which law firms and insurance carriers visit your site, what pages they read, and how long they stayed — without requiring a cookie banner.",
"features": [
"IP-to-company matching against 220M+ companies",
"35–40% identification rate (high end of industry)",
"Cookieless tracking (GDPR-friendly)",
"ISO 27001 certified",
"70+ integrations (CRMs, Slack, etc.)"
],
"benefit": "For a niche specialist, the buyers researching you are already on your site. This tool tells you who they are before they reach out — turning silent visits into actionable warm leads.",
"feeds": [
"Step 4 Capture Intent"
]
},
{
"id": "leadfeeder",
"name": "Leadfeeder (Dealfront)",
"url": "https://www.leadfeeder.com/",
"urlDisplay": "leadfeeder.com",
"tier": 1,
"pricing": "Free 100 leads/mo · Paid from €99/mo",
"pricingTier": "cheap",
"flags": [
"essential",
"free"
],
"blurb": "The original visitor-ID tool. Now part of Dealfront. Slightly higher friction than Leadinfo (cookies, lower match rate), but the free tier is genuinely useful for testing the channel before committing.",
"features": [
"Free tier: 100 identified companies/mo, 7-day history",
"Google Analytics integration",
"CRM sync (HubSpot, Salesforce, Pipedrive)",
"Slack alerts on company visits",
"Echobot prospecting database"
],
"benefit": "The free tier is the test. If it produces 5+ named law firms in your first month, you have signal — pay to upgrade. If not, save the money.",
"feeds": [
"Step 4 Capture Intent"
]
},
{
"id": "rb2b",
"name": "RB2B",
"url": "https://www.rb2b.com/",
"urlDisplay": "rb2b.com",
"tier": 1,
"pricing": "Free 250 contacts/mo · Paid from $99/mo",
"pricingTier": "cheap",
"flags": [
"free",
"essential"
],
"blurb": "Person-level visitor identification (not just company). For US traffic, identifies individuals visiting your site — name, LinkedIn, email — when matched to their database.",
"features": [
"Person-level identification (US only)",
"Real-time Slack notifications",
"LinkedIn profile match",
"Free 250 contacts/month forever",
"Direct CRM push"
],
"benefit": "When a partner at a defense firm visits your VRF Forensic Audit page at 10pm Tuesday, you find out about it Wednesday morning by name. That changes your follow-up entirely.",
"feeds": [
"Step 4 Capture Intent"
]
},
{
"id": "warmly",
"name": "Warmly",
"url": "https://www.warmly.ai/",
"urlDisplay": "warmly.ai",
"tier": 1,
"pricing": "Free 500 visitors · Micro from $499/mo",
"pricingTier": "mid",
"flags": [
"free"
],
"blurb": "Live visitor identification with intent signals + ICP filters. Reveals current website visitors in real-time so reps can engage via chat or video while they're still reading.",
"features": [
"Real-time visitor reveal",
"First-party intent signals",
"ICP filtering + lead routing",
"Live video/chat engagement",
"CRM-integrated workflows"
],
"benefit": "For a small consulting practice, the free tier (500 visitors/mo) is often enough. Upgrade only when scale demands it.",
"feeds": [
"Step 4 Capture Intent"
]
},
{
"id": "seak",
"name": "SEAK Expert Witness Directory",
"url": "https://www.seakexperts.com/",
"urlDisplay": "seakexperts.com",
"tier": 2,
"pricing": "$545/yr basic listing",
"pricingTier": "cheap",
"flags": [
"essential"
],
"blurb": "The #1 rated expert witness directory in the industry. Free for attorneys to search. 2,000+ listed experts. Used by both plaintiff and defense counsel for credentialed expert searches.",
"features": [
"No middleman — attorneys contact you directly",
"Free attorney search",
"Money-back guarantee on listings",
"SEAK also offers expert witness training",
"Strong reputation among litigators"
],
"benefit": "Best single directory choice if you can only pick one. Highest credibility signal, attorneys actually search it.",
"feeds": [
"Step 2 Get Listed"
]
},
{
"id": "jurispro",
"name": "JurisPro Expert Witness Directory",
"url": "https://www.jurispro.com/",
"urlDisplay": "jurispro.com",
"tier": 2,
"pricing": "$399/yr (multi-year discounts)",
"pricingTier": "cheap",
"flags": [
"essential"
],
"blurb": "Long-standing directory founded by attorneys in 1999. Searchable by specialty, location, experience. Also indexed in LexisNexis. Volume play — moderate-quality leads but high name-recognition impact.",
"features": [
"Profiles include CV, photos, articles, audio/video",
"LexisNexis indexed (massive attorney reach)",
"Multi-year discounts",
"Lower-cost than SEAK or ALM",
"25+ year reputation"
],
"benefit": "Pair with SEAK for double coverage. The LexisNexis indexing means your name appears in the workflow attorneys are already using.",
"feeds": [
"Step 2 Get Listed"
]
},
{
"id": "experts-com",
"name": "Experts.com (ALM)",
"url": "https://www.experts.com/",
"urlDisplay": "experts.com",
"tier": 2,
"pricing": "$500–$1,000+/yr depending on tier",
"pricingTier": "cheap",
"flags": [],
"blurb": "Broader-reach directory part of the ALM legal media network. Higher cost than JurisPro, frequently used by larger firms doing complex litigation searches.",
"features": [
"ALM legal network distribution",
"15,000+ experts indexed",
"Court reporter + investigator + litigation support listings",
"Strong with AmLaw 200 firms"
],
"benefit": "Higher cost but stronger value if your case complexity matches the firms searching here.",
"feeds": [
"Step 2 Get Listed"
]
},
{
"id": "forensisgroup",
"name": "ForensisGroup",
"url": "https://www.forensisgroup.com/",
"urlDisplay": "forensisgroup.com",
"tier": 2,
"pricing": "Free to apply · % of fees on engagement",
"pricingTier": "free",
"flags": [
"free"
],
"blurb": "Expert-matching service rather than directory. Attorneys submit case details; ForensisGroup matches with vetted experts. They take a markup (typically 30–40%) on retained engagements.",
"features": [
"No upfront cost",
"Pre-vetted expert pool",
"Active case-matching (not passive listing)",
"Speed-focused workflow"
],
"benefit": "Zero downside to apply. They send you cases; you pay only when retained. Useful as a passive lead channel alongside direct directories.",
"feeds": [
"Step 2 Get Listed"
]
},
{
"id": "expert-institute",
"name": "The Expert Institute",
"url": "https://www.expertinstitute.com/",
"urlDisplay": "expertinstitute.com",
"tier": 2,
"pricing": "Free to apply · Case-matched referral fees",
"pricingTier": "free",
"flags": [
"free"
],
"blurb": "Case-matched referral service rather than open directory. Has researchers who pair attorneys with experts for specific cases. Strong technology and concierge-level service.",
"features": [
"Specialized researcher matchmaking",
"No upfront listing fee",
"Custom expert searches",
"Vetting + credential verification"
],
"benefit": "Particularly strong for complex technical cases where attorneys want curation over self-search.",
"feeds": [
"Step 2 Get Listed"
]
},
{
"id": "hgexperts",
"name": "HG Experts",
"url": "https://www.hgexperts.com/",
"urlDisplay": "hgexperts.com",
"tier": 2,
"pricing": "Listing fees vary",
"pricingTier": "cheap",
"flags": [],
"blurb": "Mid-tier directory with moderate traffic and lower price point. Useful as a third or fourth directory listing for SEO surface area and name-recognition compounding.",
"features": [
"Specialty-categorized listings",
"Lower-cost listing tier",
"Geographic search support"
],
"benefit": "The \"diminishing returns\" directory — adds incremental visibility without major investment.",
"feeds": [
"Step 2 Get Listed"
]
},
{
"id": "tasa",
"name": "TASA (Technical Advisory Service)",
"url": "https://www.tasanet.com/",
"urlDisplay": "tasanet.com",
"tier": 2,
"pricing": "Application-based · Referral model",
"pricingTier": "free",
"flags": [],
"blurb": "Long-running expert referral service (since 1956). Application-based admission. Active case-matching rather than passive directory.",
"features": [
"65+ year track record",
"Active case-matching workflow",
"Quality vetting",
"Technical specialty depth"
],
"benefit": "Old-school, attorney-trusted referral source. Worth applying for if your specialty fits their roster.",
"feeds": [
"Step 2 Get Listed"
]
},
{
"id": "linkedin-free",
"name": "LinkedIn (Free)",
"url": "https://www.linkedin.com/",
"urlDisplay": "linkedin.com",
"tier": 3,
"pricing": "Free",
"pricingTier": "free",
"flags": [
"essential",
"free"
],
"blurb": "According to forensic-marketing veterans, LinkedIn produces more high-quality referrals than most paid directories. Free. Requires consistent posting of redacted case studies and technical insights.",
"features": [
"Direct attorney + adjuster reach",
"Case-study post format works exceptionally well",
"Free unlimited posting",
"Connection-based credibility",
"No platform fee"
],
"benefit": "One veteran of 25+ years: \"The best cases come from LinkedIn. Free.\" If you publish one redacted case study per week and engage with attorneys in your specialty, this outproduces $5K of directory listings.",
"feeds": [
"Step 3 Reciprocity",
"Step 5 Convert",
"Step 6 Compound"
]
},
{
"id": "linkedin-sales-nav",
"name": "LinkedIn Sales Navigator",
"url": "https://business.linkedin.com/sales-solutions/sales-navigator",
"urlDisplay": "linkedin.com/sales-solutions",
"tier": 3,
"pricing": "Core $99/mo · Advanced $159/mo",
"pricingTier": "cheap",
"flags": [
"essential"
],
"blurb": "The single highest-ROI tool for most professional-services solos. Search by job title (Claims Adjuster, Director of Claims, Subrogation Specialist), firm size, geography. Save searches, get alerts when new people fill those roles.",
"features": [
"Advanced filters (title, firm, geography, function)",
"Saved-search alerts (new hires in target roles)",
"Lead lists with CRM sync",
"50 InMails/month on Core, 150 on Advanced",
"Account intelligence updates"
],
"benefit": "Builds and works your Dream 100 with surgical precision. If you only buy one paid acquisition tool, this is it.",
"feeds": [
"Step 1 Identify",
"Step 5 Convert"
]
},
{
"id": "linkedin-recruiter-lite",
"name": "LinkedIn Recruiter Lite",
"url": "https://business.linkedin.com/talent-solutions/recruiter-lite",
"urlDisplay": "linkedin.com/talent-solutions",
"tier": 3,
"pricing": "$170/mo",
"pricingTier": "mid",
"flags": [
"niche"
],
"blurb": "Sometimes overlooked alternative to Sales Navigator. Stronger boolean search, better hidden-profile access. Useful if you're also occasionally hiring associate engineers for your practice.",
"features": [
"Boolean + advanced search",
"30 InMails/month",
"Profile insights beyond standard view",
"Talent pool analytics"
],
"benefit": "Worth it only if you have dual use (research AND hiring). For pure prospecting, Sales Nav is cheaper and better-suited.",
"feeds": [
"Step 1 Identify"
]
},
{
"id": "apollo",
"name": "Apollo.io",
"url": "https://www.apollo.io/",
"urlDisplay": "apollo.io",
"tier": 4,
"pricing": "Free tier · Basic from $59/mo",
"pricingTier": "cheap",
"flags": [
"essential",
"free"
],
"blurb": "B2B contact database with 275M+ contacts. Build targeted lists of insurance adjusters, defense attorneys, claims managers by title + firm + geography. Email + phone + LinkedIn on each.",
"features": [
"275M+ contact database",
"Filter by title, firm, geography, employee count",
"Email + phone + LinkedIn URLs",
"Built-in email sequencer",
"Free tier with 50 mobile credits/mo"
],
"benefit": "The cheapest credible way to build a Dream 100 list with verified contact data. The free tier is enough to test the channel.",
"feeds": [
"Step 1 Identify",
"Step 5 Convert"
]
},
{
"id": "zoominfo",
"name": "ZoomInfo",
"url": "https://www.zoominfo.com/",
"urlDisplay": "zoominfo.com",
"tier": 4,
"pricing": "Custom enterprise pricing (typically $15K+/yr)",
"pricingTier": "enterprise",
"flags": [
"enterprise"
],
"blurb": "The B2B contact-data gold standard. Largest verified database, deepest firmographic detail, intent data layer. Pricing makes it overkill for solo practice.",
"features": [
"Deepest verified contact data",
"Firmographic + technographic filters",
"Intent data layer (who's researching what)",
"CRM integrations",
"Org chart visibility"
],
"benefit": "For a multi-engineer firm with a sales function. Solos should use Apollo first.",
"feeds": [
"Step 1 Identify"
]
},
{
"id": "cognism",
"name": "Cognism",
"url": "https://www.cognism.com/",
"urlDisplay": "cognism.com",
"tier": 4,
"pricing": "Custom pricing (typically $1,000+/mo)",
"pricingTier": "enterprise",
"flags": [
"enterprise"
],
"blurb": "European-strong B2B data with phone-verified contacts and GDPR-compliance focus. Better than ZoomInfo for European data, weaker for US-only.",
"features": [
"Phone-verified mobile numbers",
"GDPR + CCPA compliance",
"Strong European coverage",
"Diamond-verified contact tier"
],
"benefit": "Use only if you have European case work or specific phone-outreach intensity.",
"feeds": [
"Step 1 Identify"
]
},
{
"id": "clay",
"name": "Clay",
"url": "https://www.clay.com/",
"urlDisplay": "clay.com",
"tier": 4,
"pricing": "Free tier · Starter from $149/mo",
"pricingTier": "mid",
"flags": [
"niche"
],
"blurb": "Data-enrichment + workflow automation. Aggregates 75+ data providers. Power-user tool for building hyper-targeted Dream 100 workflows with AI-driven personalization.",
"features": [
"75+ data providers in one platform",
"AI-powered personalization at scale",
"Workflow automation",
"Spreadsheet-style interface",
"Steep learning curve"
],
"benefit": "Overkill for most solo practices. Worth it for firms running systematic high-volume outreach.",
"feeds": [
"Step 1 Identify",
"Step 5 Convert"
]
},
{
"id": "pacer",
"name": "PACER",
"url": "https://pacer.uscourts.gov/",
"urlDisplay": "pacer.uscourts.gov",
"tier": 5,
"pricing": "$0.10/page · No subscription",
"pricingTier": "free",
"flags": [
"essential",
"free"
],
"blurb": "Federal court records, public access. Search filings by case type, attorney, firm, jurisdiction. Identify which firms handle the case types your specialty serves.",
"features": [
"Public Access to Court Electronic Records",
"$0.10/page (capped at $3/document)",
"No subscription required",
"Search by attorney, firm, case type",
"PACER Service Center direct access"
],
"benefit": "Tells you exactly which attorneys filed which kinds of cases in your jurisdiction. The Dream 100 research foundation. Free until $30/quarter usage.",
"feeds": [
"Step 1 Identify"
]
},
{
"id": "justia",
"name": "Justia",
"url": "https://www.justia.com/",
"urlDisplay": "justia.com",
"tier": 5,
"pricing": "Free",
"pricingTier": "free",
"flags": [
"free"
],
"blurb": "Free legal research portal. Searchable case law, attorney directories, court dockets. Useful for identifying attorneys at specific firms handling specific case types.",
"features": [
"Case law search",
"Attorney + firm directory",
"Free dockets and decisions",
"No registration required for most features"
],
"benefit": "Zero-cost first pass on identifying attorneys handling your case-type. Pair with LinkedIn to find them.",
"feeds": [
"Step 1 Identify"
]
},
{
"id": "westlaw",
"name": "Westlaw",
"url": "https://legal.thomsonreuters.com/en/products/westlaw",
"urlDisplay": "thomsonreuters.com/westlaw",
"tier": 5,
"pricing": "Custom (typically $100–500+/mo)",
"pricingTier": "mid",
"flags": [],
"blurb": "The professional legal research standard. Westlaw Profiler shows expert testimony history including who has cross-examined you, who has hired you, and outcomes.",
"features": [
"Expert Witness Profiler",
"Case-law + statutory research",
"Litigation history search",
"Daubert challenge tracker",
"Brief Bank"
],
"benefit": "Worth subscribing once your testimony record is substantial. Lets you research opposing experts and identify firms with case-type fit.",
"feeds": [
"Step 1 Identify",
"Step 6 Compound"
]
},
{
"id": "casetext",
"name": "Casetext (CoCounsel)",
"url": "https://casetext.com/",
"urlDisplay": "casetext.com",
"tier": 5,
"pricing": "CoCounsel from $400/mo",
"pricingTier": "mid",
"flags": [],
"blurb": "AI-powered legal research now part of Thomson Reuters. CoCounsel handles complex queries about case law, expert challenges, and Daubert history.",
"features": [
"AI-powered legal queries",
"Brief drafting assistance",
"Case law search",
"Daubert/Frye history search"
],
"benefit": "For practices that bill enough hours to justify research time. Solo experts can usually skip this for Justia + occasional Westlaw.",
"feeds": [
"Step 6 Compound"
]
},
{
"id": "lex-machina",
"name": "Lex Machina",
"url": "https://lexmachina.com/",
"urlDisplay": "lexmachina.com",
"tier": 5,
"pricing": "Custom enterprise pricing",
"pricingTier": "enterprise",
"flags": [
"enterprise",
"niche"
],
"blurb": "Litigation analytics platform. Shows which firms litigate which case types, win rates, judge tendencies. Useful for premium-tier Dream 100 targeting.",
"features": [
"Litigation outcome analytics",
"Firm-by-case-type analytics",
"Judge analytics",
"Patent + commercial + IP focus"
],
"benefit": "Niche tool. Worth it if you have specific litigation-analytics needs and the budget. Most experts can skip.",
"feeds": [
"Step 1 Identify"
]
},
{
"id": "docket-alarm",
"name": "Docket Alarm",
"url": "https://www.docketalarm.com/",
"urlDisplay": "docketalarm.com",
"tier": 5,
"pricing": "From $99/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "Court docket monitoring. Get alerts when new cases of your case-type are filed in your jurisdiction. Approach the firm before they've hired an expert.",
"features": [
"New-case alerts by keyword + jurisdiction",
"Federal + state court coverage",
"API access",
"Cheaper than PACER for high-volume monitoring"
],
"benefit": "For specialists in narrow case types (e.g., balcony collapse, VRF litigation), this turns case filings into outreach signals.",
"feeds": [
"Step 1 Identify"
]
},
{
"id": "hubspot-free",
"name": "HubSpot CRM (Free)",
"url": "https://www.hubspot.com/products/crm",
"urlDisplay": "hubspot.com/crm",
"tier": 6,
"pricing": "Free forever",
"pricingTier": "free",
"flags": [
"essential",
"free"
],
"blurb": "The free CRM that actually works for solo practices. Track every attorney contact, every case inquiry, every follow-up. Email integration, deal pipeline, no time limit.",
"features": [
"Truly free (not a trial)",
"Unlimited contacts",
"Email + Gmail integration",
"Deal pipeline visualization",
"Automatic activity logging"
],
"benefit": "You need a CRM. This one is free, capable, and pre-integrated with Apollo, LinkedIn Sales Nav, and visitor-ID tools. Start here.",
"feeds": [
"Step 5 Convert",
"Step 6 Compound"
]
},
{
"id": "pipedrive",
"name": "Pipedrive",
"url": "https://www.pipedrive.com/",
"urlDisplay": "pipedrive.com",
"tier": 6,
"pricing": "Essential $25/seat/mo · Advanced $49/seat/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "Pipeline-focused CRM. More opinionated than HubSpot — pushes you toward closing deals through stages. Good fit for the case-driven sales cycle of forensic engineering.",
"features": [
"Visual pipeline (drag-drop deal stages)",
"Email tracking + templates",
"Activity reminders",
"Mobile app polish",
"Fewer features than HubSpot but cleaner UX"
],
"benefit": "Pick this over HubSpot if you prefer clean over feature-rich. Either is fine; pick one and use it.",
"feeds": [
"Step 5 Convert"
]
},
{
"id": "folk",
"name": "Folk CRM",
"url": "https://www.folk.app/",
"urlDisplay": "folk.app",
"tier": 6,
"pricing": "Standard $20/seat/mo · Premium $40/seat/mo",
"pricingTier": "cheap",
"flags": [
"niche"
],
"blurb": "Modern, relationship-focused CRM. Designed for people who think of contacts as relationships, not pipeline. Excellent LinkedIn + Gmail integration.",
"features": [
"Magic Email enrichment",
"LinkedIn Chrome extension",
"Relationship intelligence",
"Smart fields + automation",
"Notion-style flexibility"
],
"benefit": "Best fit for an expert-witness practice where relationships compound across many cases over many years.",
"feeds": [
"Step 5 Convert",
"Step 6 Compound"
]
},
{
"id": "smartlead",
"name": "Smartlead",
"url": "https://www.smartlead.ai/",
"urlDisplay": "smartlead.ai",
"tier": 6,
"pricing": "Basic $39/mo · Pro $94/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "Cold-email infrastructure. Multi-mailbox sending, deliverability optimization, AI personalization. The tool to use when sending Dream 100 outreach at meaningful volume.",
"features": [
"Unlimited email accounts (no per-mailbox fees)",
"Deliverability optimization (warm-up, throttling)",
"AI subject + body personalization",
"Reply detection + auto-pause",
"Built-in sequence editor"
],
"benefit": "Cheaper than Lemlist or Instantly at scale. Better deliverability than HubSpot Sequences for cold outreach to attorneys.",
"feeds": [
"Step 5 Convert"
]
},
{
"id": "instantly",
"name": "Instantly",
"url": "https://instantly.ai/",
"urlDisplay": "instantly.ai",
"tier": 6,
"pricing": "Hyper-Growth $97/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "Cold-email outreach platform with strong deliverability and AI features. Direct competitor to Smartlead. Pick whichever you can get a discount on.",
"features": [
"Unlimited email accounts on paid plans",
"Inbox warmup (Email Deliverability Network)",
"CRM-lite functionality",
"Sequence builder + AI personalization",
"B2B lead database (paid add-on)"
],
"benefit": "Functionally equivalent to Smartlead. Pick based on UX preference and current promo pricing.",
"feeds": [
"Step 5 Convert"
]
},
{
"id": "lemlist",
"name": "Lemlist",
"url": "https://www.lemlist.com/",
"urlDisplay": "lemlist.com",
"tier": 6,
"pricing": "Email Outreach $59/mo · Sales Engagement $99/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "Cold outreach with hyper-personalization (custom images, video, dynamic landing pages). Higher reply rates if you use the personalization features; otherwise overpriced.",
"features": [
"Custom image + video personalization",
"Liquid syntax dynamic content",
"AI campaign generator",
"Built-in 450M lead database",
"Strong deliverability tools"
],
"benefit": "Worth premium only if you actually use the personalization. Otherwise Smartlead or Instantly is cheaper for the same outcome.",
"feeds": [
"Step 5 Convert"
]
},
{
"id": "nafe",
"name": "NAFE Membership",
"url": "https://www.nafe.org/",
"urlDisplay": "nafe.org",
"tier": 7,
"pricing": "~$300–500/yr (membership tiers vary)",
"pricingTier": "cheap",
"flags": [
"essential"
],
"blurb": "National Academy of Forensic Engineers. The professional society for forensic engineering. Member directory, journal publication opportunities, conferences attended by attorneys.",
"features": [
"Peer-reviewed journal (J. NAFE)",
"Member directory used by attorneys",
"Annual + regional conferences",
"Continuing education + certification",
"Strong credibility signal on CV"
],
"benefit": "For a forensic engineer, NAFE is not optional. It's a credentialing baseline. Attorneys searching for \"credentialed forensic engineer\" will look here.",
"feeds": [
"Step 2 Get Listed",
"Step 7 Reputation"
]
},
{
"id": "ashrae",
"name": "ASHRAE Membership",
"url": "https://www.ashrae.org/",
"urlDisplay": "ashrae.org",
"tier": 7,
"pricing": "Member $263/yr",
"pricingTier": "cheap",
"flags": [
"niche"
],
"blurb": "For HVAC/VRF/mechanical specialists. Technical committee work and standards development create unmatched authority signal. Conference speaking lands directly in front of buyers.",
"features": [
"Technical committee membership",
"Standards-development authorship",
"Annual + winter conferences",
"Specialty certifications (BCxP, OPMP, etc.)",
"Member directory"
],
"benefit": "For VRF litigation specifically, ASHRAE involvement is the single highest-trust signal a court will see. Worth the time investment.",
"feeds": [
"Step 7 Reputation"
]
},
{
"id": "nfpa",
"name": "NFPA Membership",
"url": "https://www.nfpa.org/",
"urlDisplay": "nfpa.org",
"tier": 7,
"pricing": "Member ~$175/yr",
"pricingTier": "cheap",
"flags": [
"niche"
],
"blurb": "National Fire Protection Association. Essential for fire-investigation specialists. NFPA 921 is the gold-standard methodology referenced in fire forensics testimony.",
"features": [
"NFPA 921 access + interpretation",
"Standards committees",
"Conference + training programs",
"Specialty journals",
"CFEI / CFI certifications path"
],
"benefit": "For fire forensic engineering, NFPA is non-optional. Without NFPA 921 fluency, your testimony gets picked apart on cross.",
"feeds": [
"Step 7 Reputation"
]
},
{
"id": "asce",
"name": "ASCE Membership",
"url": "https://www.asce.org/",
"urlDisplay": "asce.org",
"tier": 7,
"pricing": "Member $310/yr",
"pricingTier": "cheap",
"flags": [
"niche"
],
"blurb": "American Society of Civil Engineers. Essential for structural / civil specialists. Forensic Engineering Division within ASCE is specifically attorney-facing.",
"features": [
"Forensic Engineering Division",
"Technical journal publishing",
"Continuing education",
"Specialty certifications (PE-related)",
"Standards documents"
],
"benefit": "For structural failure work, ASCE FED visibility is direct attorney-facing reputation building.",
"feeds": [
"Step 7 Reputation"
]
},
{
"id": "sparktoro-pro",
"name": "SparkToro",
"url": "https://sparktoro.com/",
"urlDisplay": "sparktoro.com",
"tier": 7,
"pricing": "Personal $38/mo · Business $112/mo",
"pricingTier": "cheap",
"flags": [],
"blurb": "Audience research. Type \"insurance defense attorney\" and SparkToro tells you which podcasts they listen to, what publications they read, who they follow on LinkedIn. Your earned-media targeting list.",
"features": [
"Audience clickstream analysis",
"Podcast / publication / social account discovery",
"Natural-language audience description",
"Podcast guest opportunities",
"Email newsletter analysis"
],
"benefit": "Tells you exactly where to publish, where to guest-podcast, and who to connect with on LinkedIn. The Dream 100 amplifier.",
"feeds": [
"Step 5 Convert",
"Step 7 Reputation"
]
},
{
"id": "ali-cle",
"name": "ALI CLE",
"url": "https://www.ali-cle.org/",
"urlDisplay": "ali-cle.org",
"tier": 7,
"pricing": "Speaker — variable; Attendee from $300/course",
"pricingTier": "mid",
"flags": [
"niche"
],
"blurb": "American Law Institute Continuing Legal Education. Speak at one of their programs and you're directly in front of 100–500 practicing attorneys earning their CLE credits.",
"features": [
"Direct audience: practicing attorneys",
"CLE-credit-eligible content",
"Recorded distribution beyond live talk",
"High-credibility signal",
"Often paid speaker honoraria"
],
"benefit": "A single ALI CLE talk on \"Forensic Engineering for VRF Litigation\" produces inbound case inquiries for years afterward.",
"feeds": [
"Step 7 Reputation"
]
},
{
"id": "state-bar-cle",
"name": "State Bar CLE Programs",
"url": "https://www.americanbar.org/cle/",
"urlDisplay": "americanbar.org/cle",
"tier": 7,
"pricing": "Variable · Often free for speakers",
"pricingTier": "free",
"flags": [
"free",
"niche"
],
"blurb": "State and local bar associations run CLE programs constantly. They need expert speakers; they pay either honoraria or just visibility. Direct path to the local Dream 100.",
"features": [
"Direct local-attorney audience",
"Often unpaid (visibility-based)",
"Attendee list available post-event",
"CLE-credit eligibility",
"Recurring speaking opportunities"
],
"benefit": "Highest ROI per hour invested for local Dream 100 cultivation. Apply to every state bar in your geography.",
"feeds": [
"Step 7 Reputation"
]
},
{
"id": "wynter",
"name": "Wynter (Message Testing)",
"url": "https://wynter.com/",
"urlDisplay": "wynter.com",
"tier": 7,
"pricing": "From ~$540/test",
"pricingTier": "mid",
"flags": [
"niche"
],
"blurb": "On-demand B2B message testing. Get 12–48 hour feedback from a panel including legal/insurance professionals. Test your service-page copy against actual buyers before launching.",
"features": [
"Verified ICP panel (60K+ B2B professionals)",
"Job-title + industry targeting",
"12–48 hour turnaround",
"Service-page + email message testing",
"Persona research"
],
"benefit": "Most forensic engineers wouldn't think to test their service-page copy with actual attorneys. The ones who do convert better.",
"feeds": [
"Step 3 Reciprocity"
]
},
{
"id": "expertcommunications",
"name": "Expert Communications",
"url": "https://expertcommunications.com/",
"urlDisplay": "expertcommunications.com",
"tier": 7,
"pricing": "Coaching packages from $1,000+",
"pricingTier": "mid",
"flags": [
"niche"
],
"blurb": "Marketing consultancy specifically for expert witnesses. Resume + CV positioning, fee-setting strategy, deposition prep. Niche but proven for the practitioner who wants done-with-you positioning help.",
"features": [
"Expert-specific marketing strategy",
"CV positioning + rewriting",
"Fee-schedule strategy",
"Deposition + testimony prep",
"Referral-network introductions"
],
"benefit": "Worth considering if you're past the technical excellence stage but stuck on positioning + fee-setting.",
"feeds": [
"Step 6 Compound"
]
}
],
"TIERS": [
{
"num": 1,
"id": "tier-1",
"name": "Website Visitor Identification",
"purpose": "Tells you which firms are reading your service pages but haven't yet contacted you. <strong>This is the highest-leverage tool category for niche specialists</strong> — buyers research before they call. Feeds <span class=\"gate-ref\">Step 4 Capture Intent</span>."
},
{
"num": 2,
"id": "tier-2",
"name": "Expert Witness Directories",
"purpose": "Where attorneys actually search at 11pm before depositions. Listing fees range from $399–$1,000/yr. The directories below are the ones attorneys verify and use. Feeds <span class=\"gate-ref\">Step 2 Get Listed</span>."
},
{
"num": 3,
"id": "tier-3",
"name": "LinkedIn — Free + Paid",
"purpose": "According to one 25-year veteran of expert-witness consulting, \"the best cases come from LinkedIn. Free.\" Sales Navigator amplifies this from organic to systematic. Feeds <span class=\"gate-ref\">Step 1 Identify</span>, <span class=\"gate-ref\">Step 5 Convert</span>."
},
{
"num": 4,
"id": "tier-4",
"name": "B2B Contact Data",
"purpose": "Build a Dream 100 list of named adjusters, attorneys, and claims managers with verified emails and phones. Apollo is the budget winner; ZoomInfo is the gold standard. Feeds <span class=\"gate-ref\">Step 1 Identify</span>."
},
{
"num": 5,
"id": "tier-5",
"name": "Legal & Case Intelligence",
"purpose": "Court records and legal-research tools that tell you which firms handle which case types — so your outreach is targeted. PACER is functionally free. Feeds <span class=\"gate-ref\">Step 1 Identify</span>."
},
{
"num": 6,
"id": "tier-6",
"name": "Outreach + CRM",
"purpose": "Once you have a Dream 100 list, work it. CRM tracks every attorney contact and follow-up. Cold email tools deliver outreach at meaningful volume without burning your domain. Feeds <span class=\"gate-ref\">Step 5 Convert</span>."
},
{
"num": 7,
"id": "tier-7",
"name": "Reputation, Content & Associations",
"purpose": "The compounding layer. Association membership, CLE speaking, technical-committee work, message testing. None of these produce leads next week. All of them produce leads in 2027 and onward. Feeds <span class=\"gate-ref\">Step 7 Reputation</span>."
}
]
},
"RISER-MVO-Widget-Direct": {
"GATES": [
{
"id": "intro",
"num": "00",
"name": "Start",
"title": "Welcome to the <em>MVO Engine</em>",
"rubric": "How this works",
"isIntro": true
},
{
"id": "paindiscovery",
"num": "00½",
"name": "Pain Discovery",
"title": "Import the <em>voice of the customer</em>",
"rubric": "Gate 00½ · Pain Import",
"principle": {
"text": "\"Operators who guess at pain build for themselves. Operators who import pain build for the market. The most expensive line in any business is the one that begins, 'I think the customer wants...' If you have run a PainOnSocial scan, a customer interview series, or any structured voice-of-customer research, paste the cards here. Every gate downstream gets sharper.\"",
"source": "RISER Captain's Logic · The Voice-of-Customer Manifest"
},
"isPainDiscovery": true
},
{
"id": "avatar",
"num": "01",
"name": "Hungry Avatar",
"title": "Is there a <em>starving crowd?</em>",
"rubric": "Gate 01 · Avatar",
"principle": {
"text": "\"The most important thing you sell is not your product — it is the market you sell it into. A starving crowd is the difference between selling steak and selling sand. Get the market right and a mediocre offer wins. Get it wrong and the best offer in the world dies.\"",
"source": "RISER Captain's Logic · The Hungry Harbor Doctrine"
},
"inputs": [
{
"id": "avatar_who",
"type": "textarea",
"label": "Who exactly is the avatar?",
"help": "Specific. \"Marketing managers at SaaS companies between $5M–$20M ARR who are personally accountable for pipeline\" — not \"small business owners.\"",
"placeholder": "e.g., Solo accountants in their first year of practice, age 28-40, post-MBA, billing under $5K/month...",
"aiSharpen": true,
"examples": {
"good": [
"Solo CPAs in their first 24 months of practice, billing under $7K/month, ages 32–45, who got their license post-Big-4 and now work from home offices in suburban metros.",
"In-house marketing leads at Series-B SaaS companies ($10M–$30M ARR), 2–4 years in role, personally accountable for pipeline, no SDR team yet, reporting to a CRO."
],
"bad": [
"Small business owners who want to grow.",
"Coaches and consultants looking for more clients."
]
},
"sharpen": [
"Can you describe what this person did last Tuesday between 9am and noon?",
"What is the difference between this avatar and the avatar one tier below them in income or experience?",
"If you walked into a room of 50 of them, what would they have in common that a stranger would notice in 30 seconds?"
],
"verify": [
{
"source": "reddit",
"label": "Search Reddit for this avatar"
},
{
"source": "google_site_reddit",
"label": "Google → Reddit posts about this niche"
},
{
"source": "youtube",
"label": "YouTube — see who already serves them"
},
{
"source": "twitter",
"label": "Twitter/X search — recent conversations"
},
{
"source": "google_trends",
"label": "Google Trends — keyword trajectory"
},
{
"source": "indeed",
"label": "Indeed — job postings (B2B avatars)"
}
]
},
{
"id": "avatar_pain",
"type": "textarea",
"label": "What is the specific pain — in their words, not yours?",
"help": "Quote them. If you cannot quote them, you have not talked to them. Generic pain (\"I want more clients\") is not pain. Specific pain (\"I lose 3 hours every Friday reconciling Stripe\") is pain.",
"placeholder": "e.g., \"I keep losing deals at the proposal stage and I do not know why\"...",
"aiSharpen": true,
"vocPull": true,
"examples": {
"good": [
"\"I send proposals on Monday and by Friday I get ghosted. I never know if it was the price, the scope, or that they just went with someone else.\"",
"\"My pipeline looks fine on paper but I have not closed a deal in six weeks and I am starting to panic about payroll.\""
],
"bad": [
"They struggle with sales and need more leads.",
"They feel overwhelmed by the marketing landscape."
]
},
"sharpen": [
"Did you copy this pain from a real conversation, post, or interview — or did you write it yourself?",
"If yes, paste the source link or the conversation date. If no, that is the homework.",
"Does the pain include a specific time, place, or trigger? \"Every Monday morning\" beats \"in general.\""
],
"verify": [
{
"source": "reddit_pain",
"label": "Reddit — search this niche + pain words"
},
{
"source": "google_site_reddit",
"label": "Google → real complaints on Reddit"
},
{
"source": "twitter_complaint",
"label": "Twitter/X — \"I hate\" / \"I cannot\" rants"
},
{
"source": "youtube_howto",
"label": "YouTube — \"how do I\" + this niche, read comments"
},
{
"source": "quora",
"label": "Quora — search the active questions"
}
]
},
{
"id": "avatar_size_purchasing",
"type": "scale",
"label": "Purchasing power — can they actually pay?",
"help": "Operating rule: target markets where buyers have demonstrated willingness to spend $1,000+ on similar problems already. 1 = broke audience, 10 = active buyers spending now.",
"examples": {
"good": [
"I see the avatar paying $200–$500/mo for similar SaaS tools, $2K–$5K for one-time courses, and $5K–$15K for done-with-you programs. Three competitors at this price point are profitable.",
"The category supports $497–$2,000 offers consistently — Skool groups in this niche have 50–200 paying members at $39–$99/mo."
],
"bad": [
"I think they would pay because the value is there.",
"My friend said he would pay for this."
]
},
"sharpen": [
"Name three real competitors charging $1,000+ on similar problems. Live URLs.",
"What is the average spend the avatar already makes on adjacent tools or services per month?",
"Have you seen at least one case study or income claim from a competitor in this category?"
],
"verify": [
{
"source": "google_pricing",
"label": "Google → competitor pricing pages"
},
{
"source": "youtube_course",
"label": "YouTube — search niche + \"course\""
},
{
"source": "reddit_pricing",
"label": "Reddit — niche + \"how much do you charge\""
},
{
"source": "flippa",
"label": "Flippa — actual transaction prices"
},
{
"source": "indiehackers",
"label": "Indie Hackers — operator revenue stories"
}
]
},
{
"id": "avatar_size_growing",
"type": "scale",
"label": "Market trajectory — growing, flat, or shrinking?",
"help": "Growing markets forgive errors. Shrinking markets punish even great offers. 1 = dying category, 10 = exploding category.",
"examples": {
"good": [
"Google Trends shows 60% YoY increase on the category terms. Three new competitors entered the space in the last 18 months. Industry reports project 25–40% CAGR through 2028.",
"The category is mature/flat but with significant operator turnover — older incumbents losing share to newer operators with better positioning. Net opportunity is real."
],
"bad": [
"I feel like this market is growing.",
"AI is going to make this category bigger."
]
},
"sharpen": [
"What does Google Trends show for the top 3 keywords in this category, 5-year view?",
"How many new competitors entered the space in the last 24 months?",
"Is funding flowing into this category (VC deals, accelerator focus, M&A activity)?"
],
"verify": [
{
"source": "google_trends",
"label": "Google Trends — 5-year keyword trajectory"
},
{
"source": "youtube",
"label": "YouTube — channel growth in this niche"
},
{
"source": "tiktok",
"label": "TikTok — short-form trend in this niche"
},
{
"source": "google_news",
"label": "Google News — funding + launches"
},
{
"source": "reddit_growth",
"label": "Reddit — niche subreddit growth signals"
}
]
},
{
"id": "avatar_size_easy",
"type": "scale",
"label": "Easy to reach — can you find them and message them?",
"help": "A perfect avatar you cannot reach is worthless. Pick avatars who hang out somewhere you can pay or post into. 1 = invisible, 10 = obvious channel.",
"examples": {
"good": [
"They aggregate in three subreddits with 50K+ members each, two private Slack groups, and one well-known LinkedIn hashtag with 100+ daily posts. I can reach 10K of them via Meta ads at $1.20 CPM.",
"There is a specific industry conference 2x/year, a trade publication with 30K subscribers, and a Telegram group of ~3,000 active members. Three reachable channels, no gatekeeper."
],
"bad": [
"I will reach them through SEO and content marketing.",
"I think LinkedIn would work."
]
},
"sharpen": [
"Name the top 3 specific places (URL/group/event) where this avatar gathers.",
"For each, what is the audience size and engagement level?",
"What does it cost (in dollars OR hours) to reach 100 of them per week?"
],
"verify": [
{
"source": "reddit_communities",
"label": "Reddit — find subreddits in this niche"
},
{
"source": "google_site_reddit",
"label": "Google → Reddit communities for this niche"
},
{
"source": "youtube_channels",
"label": "YouTube — channels serving this niche"
},
{
"source": "twitter",
"label": "Twitter/X — see who posts in this niche"
},
{
"source": "facebook_groups",
"label": "Google → public Facebook groups"
}
]
},
{
"id": "avatar_pain_intensity",
"type": "scale",
"label": "Pain intensity — is this a top-3 problem for them right now?",
"help": "Top-3 pain = budget exists. Bottom-10 pain = nice-to-have, infinite sales cycle. 1 = mild annoyance, 10 = crisis.",
"examples": {
"good": [
"Customers describe this pain in their first 90 seconds of a sales call without prompting. 3 of last 5 prospects said this is the #1 reason they reached out.",
"I see this complaint in the top 5 posts every week in their primary subreddit. People say things like \"I cannot keep doing this\" and \"I will pay anyone to fix this.\""
],
"bad": [
"It is a real problem and they need a solution.",
"I know it is painful because I felt it myself."
]
},
"sharpen": [
"Have you watched 3+ real prospects describe this pain unprompted?",
"Have they used emotional language (\"I hate,\" \"I cannot keep doing,\" \"I am desperate\") or transactional language (\"it would be nice\")?",
"Is the pain felt regularly (daily/weekly) or only in specific moments?"
],
"verify": [
{
"source": "reddit_pain_intensity",
"label": "Reddit — emotional pain language search"
},
{
"source": "youtube_howto",
"label": "YouTube — \"how do I\" + niche, read top comments"
},
{
"source": "twitter_complaint",
"label": "Twitter/X — frustrated rants in this niche"
},
{
"source": "quora",
"label": "Quora — desperate questions in this niche"
},
{
"source": "reddit_top",
"label": "Reddit — sort top posts by month, this niche"
}
]
}
]
},
{
"id": "idea",
"num": "02",
"name": "Idea / No Idea",
"title": "Does the <em>idea earn the slot?</em>",
"rubric": "Gate 02 · Filter",
"principle": {
"text": "\"There are four things that determine whether a market is worth attacking: massive pain, purchasing power, easy to target, and growing. If three of four are true, you have a great market. If two, you have a hard road. If one, you have a hobby. Most people pick markets based on what they know, not on whether the market deserves their next twelve months.\"",
"source": "RISER Captain's Logic · The Four-Quadrant Territory Test"
},
"inputs": [
{
"id": "idea_one_sentence",
"type": "textarea",
"label": "State the offer in one sentence — for whom, what outcome, by when.",
"help": "Format: \"I help [avatar] get [outcome] in [timeframe] without [common objection].\" If you cannot fit it in one sentence, the offer is unclear.",
"placeholder": "e.g., I help solo accountants land their first 10 retainer clients in 90 days without cold outreach."
},
{
"id": "idea_competition",
"type": "choice",
"label": "What is the competitive reality?",
"help": "RISER doctrine: \"If no one is doing it, that is usually a sign no one wants it.\" Competition validates demand. Absence of competition is rarely a moat — it is usually a graveyard.",
"cols": 1,
"options": [
{
"value": "busy",
"label": "Crowded market with successful operators",
"sub": "Best signal. Demand is proven. You differentiate, not invent."
},
{
"value": "mid",
"label": "Some competitors, mostly mediocre",
"sub": "Strong signal. Real demand, weak supply. Most opportunities live here."
},
{
"value": "thin",
"label": "Almost no competition",
"sub": "Caution. Either you found gold OR no one wants this. Default to second."
},
{
"value": "none",
"label": "I will be first",
"sub": "Almost always wrong. \"First mover\" usually means \"first to die.\""
}
]
},
{
"id": "idea_money_now",
"type": "choice",
"label": "The $100 today test — would 10 of these people pay $100 right now for a janky v1?",
"help": "From the Profitable Widget Playbook (and the \"presell before build\" doctrine). If you cannot picture 10 specific names paying $100 today, the idea is theoretical.",
"cols": 1,
"options": [
{
"value": "named",
"label": "Yes — I can name the 10 people right now",
"sub": "GO signal. You have proximity to demand."
},
{
"value": "maybe",
"label": "Probably — but I would have to find them",
"sub": "REWORK. Until you can name them, you do not have an avatar — you have a hypothesis."
},
{
"value": "no",
"label": "No — this would take weeks of marketing first",
"sub": "NO. The marketing required to find them IS the validation. Do that before building."
}
]
}
]
},
{
"id": "problem",
"num": "03",
"name": "Profitable Problem",
"title": "Is this a <em>painful, urgent, recurring</em> problem?",
"rubric": "Gate 03 · Problem",
"principle": {
"text": "\"Every problem is not a profitable problem. Profitable problems share three features: high pain, high frequency, high cost-of-not-solving. If the problem only happens once and the cost of ignoring it is low, you are not in a business — you are in charity. The best businesses solve problems the customer pays you to keep solving.\"",
"source": "RISER Captain's Logic · The Profitable-Pain Calibration"
},
"inputs": [
{
"id": "problem_specific",
"type": "textarea",
"label": "State the exact problem in one sentence.",
"help": "Use the customer's words. \"They cannot get to inbox zero\" is a problem. \"Productivity\" is a category.",
"placeholder": "e.g., They spend 8+ hours/week on manual invoice reconciliation and miss billing.",
"vocPull": true
},
{
"id": "problem_frequency",
"type": "choice",
"label": "How often does the problem recur?",
"help": "Recurring pain = recurring revenue. One-and-done pain = transactional revenue with high re-acquisition cost.",
"cols": 1,
"options": [
{
"value": "daily",
"label": "Daily or weekly",
"sub": "Best. Continuity offer fits naturally. LTV compounds."
},
{
"value": "monthly",
"label": "Monthly",
"sub": "Strong. Subscription rhythm available."
},
{
"value": "quarterly",
"label": "Quarterly or seasonal",
"sub": "Moderate. Service-based or annual offer fits."
},
{
"value": "once",
"label": "Once-in-a-lifetime / project-based",
"sub": "Weakest. Every customer is a re-acquisition."
}
]
},
{
"id": "problem_cost",
"type": "choice",
"label": "What is the cost of NOT solving the problem?",
"help": "RISER doctrine: \"Price is set by the cost of the problem, not the cost of the solution.\" High cost of inaction = pricing power.",
"cols": 1,
"options": [
{
"value": "high",
"label": "High — losing money, customers, or status",
"sub": "Premium pricing available. Sell against the loss."
},
{
"value": "moderate",
"label": "Moderate — friction and frustration",
"sub": "Mid-tier pricing. Sell against the time-drain."
},
{
"value": "low",
"label": "Low — minor inconvenience",
"sub": "Hard to monetize. Reframe to find higher-cost angle, or pick different problem."
}
]
},
{
"id": "problem_existing_solutions",
"type": "textarea",
"label": "What do they currently do to solve it (or fail to)?",
"help": "Name competitors AND non-consumption alternatives (\"they just suffer\", \"they ask their CPA\", \"they Google it\"). The status quo IS the competition.",
"placeholder": "e.g., They use spreadsheets, hire a part-time bookkeeper, or just get behind and panic at tax time."
}
]
},
{
"id": "offer",
"num": "04",
"name": "Grand Slam Offer",
"title": "Score the offer on <em>the Value Equation</em>",
"rubric": "Gate 04 · Offer",
"principle": {
"text": "\"Value = (Dream Outcome × Perceived Likelihood) ÷ (Time Delay × Effort & Sacrifice). To make any offer better, do one of four things: increase the dream outcome, increase perceived likelihood, decrease time delay, or decrease effort. The numerator is what they want. The denominator is what they pay in pain. Move both.\"",
"source": "RISER Captain's Logic · The Cargo Value Equation"
},
"inputs": [
{
"id": "offer_dream",
"type": "textarea",
"label": "Dream Outcome — what is the explicit transformation?",
"help": "Specific, vivid, measurable. \"10 paying clients in 90 days, working from home, charging $2K/mo retainers.\" NOT \"more freedom.\"",
"placeholder": "e.g., Land 10 retainer clients at $2K/mo within 90 days, working under 25 hrs/week.",
"vocPull": true
},
{
"id": "offer_dream_score",
"type": "scale",
"label": "Dream Outcome strength (1-10)",
"help": "How emotionally compelling is the outcome? Would the avatar pay 10× to skip 5 years of pain to get there? 1 = mild benefit, 10 = life-changing."
},
{
"id": "offer_likelihood",
"type": "textarea",
"label": "Perceived Likelihood — what is your proof that this works?",
"help": "RISER doctrine: \"Stack proof until it gets ridiculous.\" Case studies, screenshots, testimonials, your own results, third-party validation. List what you have right now.",
"placeholder": "e.g., 3 case studies with named results, my own $0-$50K journey, 47 customer testimonials..."
},
{
"id": "offer_likelihood_score",
"type": "scale",
"label": "Perceived Likelihood (1-10)",
"help": "Looking at the proof above through skeptical buyer eyes — how believable is the promise? 1 = vapor, 10 = undeniable."
},
{
"id": "offer_time_delay",
"type": "choice",
"label": "Time Delay — how fast does the customer feel results?",
"help": "Speed beats almost every other lever in mid-market offers. The faster the first win, the higher the conversion AND retention.",
"cols": 1,
"options": [
{
"value": "instant",
"label": "Within 24 hours of purchase",
"sub": "Premium pricing power. Speed is the moat."
},
{
"value": "week",
"label": "Within first week",
"sub": "Strong. Engineer a Day-1 quick win."
},
{
"value": "month",
"label": "Within first 30 days",
"sub": "Acceptable. Add interim wins to maintain momentum."
},
{
"value": "months",
"label": "Months to first measurable result",
"sub": "Hard. Refund risk high. Add quick wins or refund-and-pivot."
}
]
},
{
"id": "offer_effort",
"type": "choice",
"label": "Effort & Sacrifice — what does the customer have to DO?",
"help": "Done-with-you beats DIY. Done-for-you beats both. Every step you remove from the customer's plate raises perceived value.",
"cols": 1,
"options": [
{
"value": "dfy",
"label": "Done-for-you — they barely lift a finger",
"sub": "Highest pricing tier ($5K-$50K+). Limited delivery capacity."
},
{
"value": "dwy",
"label": "Done-with-you — guided implementation",
"sub": "Mid-tier sweet spot ($1K-$5K). Best price-to-effort ratio."
},
{
"value": "diy",
"label": "DIY with templates and support",
"sub": "Lower tier ($97-$997). Higher volume possible."
},
{
"value": "self",
"label": "Self-paced with no human contact",
"sub": "Lowest tier ($7-$297). Highest churn. Compete on volume only."
}
]
},
{
"id": "offer_mechanism",
"type": "textarea",
"label": "Named Mechanism — what is your proprietary process called, and why does it work differently?",
"help": "RISER doctrine: \"A named mechanism is the difference between a $97 product and a $4,997 program containing the same content.\" Give your method a name (The Retainer Method®, The 90-Day Pulse™, The 4-Lane Framework). Then in one sentence explain why it works when generic approaches fail.",
"placeholder": "e.g., The Retainer Method™ — a 4-week sprint that replaces hourly billing with outcome-based packages by pre-selling 90 days of work in a single 30-minute conversation. Works because it inverts the proposal cycle: outcome first, scope second."
}
]
},
{
"id": "stack",
"num": "04½",
"name": "Offer Stack",
"title": "Build the <em>Grand Slam Stack</em>",
"rubric": "Gate 04½ · Stack",
"principle": {
"text": "\"The naked core offer is never the offer. The offer is the core PLUS the stack: bonuses that solve the next three problems before they happen, a guarantee that flips the risk to you, scarcity that creates a real reason to act now, and a name that makes it sound like a thing rather than a thing-you-do. Every component you remove costs you 10% of conversion.\"",
"source": "RISER Captain's Logic · The Grand Slam Stack Doctrine"
},
"inputs": [
{
"id": "stack_offer_name",
"type": "text",
"label": "Offer name — what do you call this thing?",
"help": "A named offer is a thing. An unnamed offer is a description. \"The 90-Day Retainer Sprint\" beats \"my coaching program\" by 30% on conversion. Use a number, an outcome word, or both.",
"placeholder": "e.g., The 90-Day Retainer Sprint · The First-10-Clients Accelerator · Founding Pulse Cohort"
},
{
"id": "stack_bonuses",
"type": "textarea",
"label": "Bonuses — name 3 to 5 bonuses, each solving the NEXT problem the customer will hit.",
"help": "Operating rule: bonuses are not \"extras\" — they are pre-emptive solutions to the objections the buyer has not yet voiced. Format: \"Bonus 1: [Name] — [Outcome] — [Standalone value $X].\" Each bonus needs a name, a result, and a price-anchor.",
"placeholder": "Bonus 1: The First-Client Script Library — 7 sales scripts that closed real deals — $497 value\nBonus 2: The Retainer Pricing Calculator — 3 pricing tiers with anchor logic — $297 value\nBonus 3: The 30-Day Onboarding SOP — copy-paste client-onboarding system — $997 value"
},
{
"id": "stack_guarantee_type",
"type": "choice",
"label": "Guarantee type — what risk are you absorbing?",
"help": "RISER doctrine: \"If you will not stand behind your offer with a guarantee, neither will they.\" Hormozi's ladder: implied < unconditional < conditional < anti-guarantee. Pick the strongest your unit economics can absorb.",
"cols": 1,
"options": [
{
"value": "anti",
"label": "Anti-guarantee — \"no refunds, here is why\"",
"sub": "Boldest. Requires extreme trust + filtering. Not for first launch."
},
{
"value": "conditional",
"label": "Conditional — \"do X, Y, Z and if no result, double your money back\"",
"sub": "Best for most operators. Forces customer accountability + dramatic risk reversal."
},
{
"value": "unconditional",
"label": "Unconditional — \"30-day no-questions-asked refund\"",
"sub": "Standard. Lowest friction, highest refund risk. Use if delivery is bulletproof."
},
{
"value": "implied",
"label": "Implied — \"we are confident you will love it\"",
"sub": "Weakest. Not really a guarantee. Will halve conversion vs. any explicit guarantee."
},
{
"value": "none",
"label": "No guarantee",
"sub": "Almost always wrong. The buyer absorbs the risk and your conversion craters."
}
]
},
{
"id": "stack_guarantee_text",
"type": "textarea",
"label": "Write the guarantee — exact words you will use on the page.",
"help": "Specificity wins. \"30-day money-back\" beats \"guaranteed.\" \"If you don't land 3 retainer clients in 60 days, I work with you free until you do\" beats \"30-day money-back.\"",
"placeholder": "e.g., Land 3 retainer clients in 60 days or I work with you free until you do — and you keep all the bonuses."
},
{
"id": "stack_scarcity",
"type": "choice",
"label": "Scarcity mechanism — what makes \"buy now\" real, not theatrical?",
"help": "Cialdini: scarcity drives action only when it is REAL. Fake countdown timers train your audience to ignore you. Pick a scarcity that is structurally true.",
"cols": 1,
"options": [
{
"value": "cohort",
"label": "Cohort cap — \"12 founding members, then closed for 90 days\"",
"sub": "Best for service/cohort offers. Real, defensible, repeatable."
},
{
"value": "price",
"label": "Founding price — \"locked at $497 for first 25, then $1,497\"",
"sub": "Strong. Real reason to act now. Price ladder must be enforced."
},
{
"value": "bonus",
"label": "Bonus expiration — \"Bonus 3 disappears after Friday\"",
"sub": "Workable. The bonus must actually go away or trust dies."
},
{
"value": "window",
"label": "Launch window — \"open Monday, closed Friday\"",
"sub": "Strong if true. Brunson's preferred mechanism. Requires real close."
},
{
"value": "fake",
"label": "Fake countdown / inflated urgency",
"sub": "NEVER. One discovery and you lose the audience permanently."
},
{
"value": "none",
"label": "No scarcity",
"sub": "Wrong. The buyer has no structural reason to decide today."
}
]
},
{
"id": "stack_total_value",
"type": "text",
"label": "Stack total value — sum of core + all bonuses (anchor price)",
"help": "Cialdini contrast principle: a $497 price next to no anchor looks expensive. A $497 price next to a $5,991 stack value looks like a steal. Add up your core + bonus prices honestly.",
"placeholder": "e.g., 5991"
},
{
"id": "stack_actual_price",
"type": "text",
"label": "Actual offer price (USD)",
"help": "The price the customer pays. Should be a fraction (typically 1/5 to 1/10) of the stack total above. If the ratio is less than 3:1, your stack is too thin or your price is too high.",
"placeholder": "e.g., 497"
}
]
},
{
"id": "distribution",
"num": "05",
"name": "Core Four",
"title": "Pick <em>one</em> of the four ways to get leads",
"rubric": "Gate 05 · Distribution",
"principle": {
"text": "\"There are four ways to get a stranger to know about you: warm outreach, cold outreach, warm content, paid ads. That is it. Every business runs one or more of these. The mistake is picking three at the start. Pick ONE. Get to 100 customers from that one. Then add the next.\"",
"source": "RISER Captain's Logic · The Core Four Shipping Lanes"
},
"inputs": [
{
"id": "dist_primary",
"type": "choice",
"label": "Pick your primary channel (one only).",
"help": "Operating rule: master one before adding another. The operator who runs LinkedIn cold outreach 5 days a week for 12 weeks beats the operator who tries 4 channels.",
"cols": 2,
"options": [
{
"value": "warm_outreach",
"label": "Warm outreach",
"sub": "DM/email people who already know you. Best for first 10 customers. Free. Low volume."
},
{
"value": "cold_outreach",
"label": "Cold outreach",
"sub": "DM/email strangers at scale. Best when avatar is identifiable + reachable. Cheap. Skill-intensive."
},
{
"value": "warm_content",
"label": "Warm content",
"sub": "Post valuable content to your audience. Compounds over time. Slow start."
},
{
"value": "paid_ads",
"label": "Paid ads",
"sub": "Pay platforms to put your offer in front of strangers. Requires unit economics first. Fastest scaling."
}
]
},
{
"id": "dist_volume",
"type": "textarea",
"label": "Volume math — how many touches per day to hit your numbers?",
"help": "RISER doctrine: \"More is the answer. Always more.\" If you need 10 customers in 90 days at 1% conversion, you need 1,000 conversations = ~12/day. Do the math now.",
"placeholder": "e.g., 50 cold DMs/day × 5 days/week × 12 weeks = 3,000 conversations. At 1% close = 30 customers."
},
{
"id": "dist_unit_econ",
"type": "choice",
"label": "Do you know your unit economics?",
"help": "Required before paid ads. Optional but useful for organic.",
"cols": 1,
"options": [
{
"value": "yes",
"label": "Yes — I know CAC, LTV, payback period",
"sub": "GO. Paid ads viable when CAC < 1/3 of 12-month LTV."
},
{
"value": "partial",
"label": "Partially — rough estimates only",
"sub": "Use organic until estimates become real numbers."
},
{
"value": "no",
"label": "No — pre-revenue",
"sub": "Stay organic. Paid ads will burn cash with no feedback loop."
}
]
}
]
},
{
"id": "dream100",
"num": "05½",
"name": "Dream 100",
"title": "Name the <em>100 people who own your audience</em>",
"rubric": "Gate 05½ · Dream 100",
"principle": {
"text": "\"You do not need to find a million strangers. You need to find the 100 people who already gathered them. Every audience you want to reach has been pre-built by 100 specific operators — podcasters, newsletter writers, YouTubers, Skool group owners, association heads, top affiliates. Borrow their boats. Do not build your own dock from scratch.\"",
"source": "RISER Captain's Logic · The Dream 100 Convoy"
},
"inputs": [
{
"id": "dream100_list",
"type": "textarea",
"label": "List 25 specific people, podcasts, newsletters, or groups your avatar already follows.",
"help": "Named handles. Real URLs. Not \"fitness influencers\" — but \"@HybridAthlete\", \"ATG for Life YouTube\", \"Knees Over Toes Skool group\", \"Ben Patrick Substack\". The first 25 take 2 hours of research. Skip this and you build distribution from zero.",
"placeholder": "e.g.,\n1. @hormozi (Twitter, 2.1M followers)\n2. The My First Million podcast\n3. Indie Hackers community (newsletter)\n4. SaaStr Skool group\n5. ...continue to 25"
},
{
"id": "dream100_strategy",
"type": "choice",
"label": "Primary Dream 100 strategy",
"help": "Brunson's framing: there are only three ways in. Pick one. Working two strategies on the same Dream 100 person at the same time = burned bridge.",
"cols": 1,
"options": [
{
"value": "work_in",
"label": "Work your way in — provide value first, become known",
"sub": "Slowest, most durable. Comment, share, send wins. 90 days to first invitation."
},
{
"value": "buy_in",
"label": "Buy your way in — sponsor, advertise, run paid promo",
"sub": "Fastest. Costs money. Use when you have unit economics."
},
{
"value": "partner",
"label": "Partner — co-create, joint venture, revenue share",
"sub": "Highest leverage. Requires you bring something they need."
}
]
},
{
"id": "dream100_first_outreach",
"type": "textarea",
"label": "First-touch script — what you will send to the first 10.",
"help": "No pitch. No ask. The first message is gift-only. Quote them, share a result, send a resource. Reciprocity is built before the ask is made. Cialdini's rule: the gift comes first or the ask is dead.",
"placeholder": "e.g., \"Hey [Name] — just used your retainer-pricing framework with 3 clients. Closed 2 at $4K/mo. Wanted to send a thank-you and the case study screenshots. No ask, just gratitude.\""
},
{
"id": "dream100_volume",
"type": "choice",
"label": "Outreach volume — how many Dream 100 contacts per week?",
"help": "Brunson: 100 contacts in a week is not unreasonable. 100 in a year means you do not believe in the strategy. The Dream 100 is a daily action, not a quarterly project.",
"cols": 1,
"options": [
{
"value": "high",
"label": "20+ per week",
"sub": "Best. Compounds fast. By month 3 you are known in the niche."
},
{
"value": "medium",
"label": "5–20 per week",
"sub": "Workable. Slower compound. 6+ months to network density."
},
{
"value": "low",
"label": "<5 per week",
"sub": "Too slow. The Dream 100 stops working below this volume."
},
{
"value": "none",
"label": "Not yet doing it",
"sub": "NO. The Dream 100 is the highest-leverage activity in early growth. Start today."
}
]
}
]
},
{
"id": "copy",
"num": "06",
"name": "Hook / Body",
"title": "Write the <em>hook, headline, and body</em>",
"rubric": "Gate 06 · Copy",
"principle": {
"text": "\"You have three seconds. The hook stops the scroll. The headline promises the dream. The body proves you can deliver. Most copy fails at the hook, blames the product. The hook is not a creative challenge — it is a calling-out exercise. Call out the avatar by their pain, by name, in the words they use about themselves.\"",
"source": "RISER Captain's Logic · The Three-Second Signal Flare"
},
"inputs": [
{
"id": "copy_hook",
"type": "textarea",
"label": "Hook — first 3 seconds. What stops the scroll?",
"help": "Hook formats that work: callout question (\"Solo accountants — are you charging by the hour?\"), pattern interrupt (\"I fired my agency yesterday.\"), specific stat (\"47% of [avatar] do this wrong\"). Avoid clever; choose clear.",
"placeholder": "e.g., Solo accountants under $5K/mo: stop trading hours for dollars by Q2.",
"vocPull": true
},
{
"id": "copy_headline",
"type": "textarea",
"label": "Headline — the promise.",
"help": "Format: [Outcome] in [Timeframe] without [Objection]. Specific outcome, specific timeframe, named objection removed. Use numbers when possible.",
"placeholder": "e.g., Land 10 retainer clients at $2K/mo within 90 days — without cold outreach, paid ads, or a website rebuild.",
"vocPull": true
},
{
"id": "copy_body",
"type": "textarea",
"label": "Body — proof + mechanism + call-to-action.",
"help": "5-line skeleton: Problem · What's working now · How it works (named mechanism) · Proof · Specific CTA. Keep under 100 words for ads, under 250 for landing pages.",
"placeholder": "Most solo accountants are stuck billing by the hour, capping income at 40 hrs × $X. The shift is to retainer-based packages priced on outcomes, not time. The Retainer Method® gets accountants from hourly to $2K/mo retainer in 90 days...",
"vocPull": true
},
{
"id": "copy_cta",
"type": "choice",
"label": "Call-to-action specificity",
"help": "Vague CTAs (\"learn more\") convert at half the rate of specific CTAs (\"get the 5-page retainer template + 90-day guide\").",
"cols": 1,
"options": [
{
"value": "specific",
"label": "Named asset + specific outcome",
"sub": "Best. \"Get the 5-page Retainer Pricing Calculator.\" Concrete object."
},
{
"value": "mid",
"label": "Action verb + topic",
"sub": "OK. \"Apply for a strategy call.\" \"Download the playbook.\""
},
{
"value": "vague",
"label": "Generic (\"learn more\")",
"sub": "Weakest. Rewrite before deploy."
}
]
}
]
},
{
"id": "persuasion",
"num": "06½",
"name": "Persuasion",
"title": "Audit the <em>persuasion architecture</em>",
"rubric": "Gate 06½ · Persuasion",
"principle": {
"text": "\"Copy is downstream of persuasion. Most operators write copy and hope persuasion happens. The reverse is correct: identify the one belief you must break, the seven psychological levers your page activates, and the lead magnet that creates reciprocity before the ask. Copy is the surface; persuasion is the structure underneath.\"",
"source": "RISER Captain's Logic · The Persuasion Architecture"
},
"inputs": [
{
"id": "persuasion_big_domino",
"type": "textarea",
"label": "The Big Domino — what is the ONE belief you must break for the sale to happen?",
"help": "Brunson's One Big Domino: \"If I can make my prospect believe ONE thing is true, all other objections become irrelevant.\" Format: \"If they believe [X], then they will buy.\" Make it specific to your avatar and your offer's mechanism.",
"placeholder": "e.g., If solo accountants believe that retainer pricing is achievable in 90 days without losing their existing hourly clients, the rest of the offer sells itself."
},
{
"id": "persuasion_false_beliefs",
"type": "textarea",
"label": "False Belief Audit — name the 3 false beliefs blocking the sale.",
"help": "Brunson's 3-belief framework: (1) belief about the VEHICLE (\"retainer pricing only works for big firms\"), (2) belief about THEMSELVES (\"I am too new to charge that much\"), (3) belief about EXTERNAL (\"my market is too price-sensitive\"). Name one of each.",
"placeholder": "Vehicle: \"Retainers only work for established firms with reputations.\"\nSelf: \"I do not have the credibility to charge $2K/mo yet.\"\nExternal: \"My local market will not pay retainer rates.\""
},
{
"id": "persuasion_lead_magnet",
"type": "textarea",
"label": "Reciprocity gift — what do you GIVE before you ask?",
"help": "Cialdini's reciprocity rule: the gift comes first or the ask is dead. Brunson's Bait. Hormozi's Lead Magnet. Specific, useful, immediate. Not \"a free guide\" — a named, valuable asset.",
"placeholder": "e.g., The Retainer Pricing Calculator — 3-tier model with anchor logic + 5 sample proposals that closed real $2K-$5K/mo deals. PDF + Notion template. 7 minutes to use.",
"vocPull": true
},
{
"id": "persuasion_reciprocity",
"type": "choice",
"label": "Reciprocity — does your funnel give before it asks?",
"help": "Cialdini's most under-leveraged principle. The lead magnet, the free workshop, the pre-call resource. Without a gift first, the ask sounds like a demand.",
"cols": 1,
"options": [
{
"value": "strong",
"label": "Strong — named, useful asset given freely before any pitch",
"sub": "GO. Reciprocity debt is established."
},
{
"value": "weak",
"label": "Weak — generic \"newsletter\" or \"free webinar\"",
"sub": "REWORK. Generic gifts are not gifts. Make it specific and valuable."
},
{
"value": "none",
"label": "None — direct pitch, no gift",
"sub": "NO. Cold ask without reciprocity converts at 1/3 the rate."
}
]
},
{
"id": "persuasion_social_proof",
"type": "choice",
"label": "Social Proof — what density and similarity?",
"help": "Cialdini: people follow people who look like them. 3 testimonials from people who match the avatar exactly beat 30 generic testimonials. Specificity > volume.",
"cols": 1,
"options": [
{
"value": "high",
"label": "5+ testimonials from avatar-similar customers, with named results",
"sub": "GO. Strong proof density. Names, photos, specific numbers."
},
{
"value": "medium",
"label": "2-4 testimonials, partial similarity",
"sub": "REWORK. Stack more, get exact-avatar matches."
},
{
"value": "low",
"label": "0-1 testimonials OR generic praise",
"sub": "NO. The proof gap is the conversion gap. Get 3 specific testimonials before launch."
}
]
},
{
"id": "persuasion_authority",
"type": "choice",
"label": "Authority — what credentials, results, or associations are visible?",
"help": "Cialdini: people defer to expertise. Specific results > vague credentials. \"Built and sold a $4M agency\" beats \"12 years experience.\" Numbers + names + outcomes.",
"cols": 1,
"options": [
{
"value": "strong",
"label": "Strong — specific track record, results, or recognized association",
"sub": "GO. Authority is unambiguous."
},
{
"value": "borrowed",
"label": "Borrowed — endorsement from named authority figure",
"sub": "Workable. Borrowed authority is real authority if attributed."
},
{
"value": "thin",
"label": "Thin — generic credentials, no specific results",
"sub": "REWORK. Replace credentials with results. Numbers > letters after your name."
}
]
},
{
"id": "persuasion_unity",
"type": "choice",
"label": "Unity — does your copy use shared-identity language?",
"help": "Cialdini's 7th principle (the most overlooked): \"we,\" \"us,\" \"our kind,\" \"people like us.\" Tribe language. The avatar should feel they belong to a group, not a market segment.",
"cols": 1,
"options": [
{
"value": "strong",
"label": "Strong — explicit shared identity, named tribe",
"sub": "Best. \"Solo accountants who refuse to bill by the hour.\""
},
{
"value": "medium",
"label": "Implicit — written for the avatar but no tribe naming",
"sub": "OK. Add explicit identity language for 20% conversion lift."
},
{
"value": "absent",
"label": "Absent — generic \"you\" with no identity layer",
"sub": "REWORK. Name the tribe."
}
]
},
{
"id": "persuasion_consistency",
"type": "choice",
"label": "Consistency — what small \"yes\" do you secure before the big yes?",
"help": "Cialdini: people stay consistent with prior commitments. The micro-yes (download, quiz, opt-in, free call) creates the consistency pressure that makes the macro-yes feel natural.",
"cols": 1,
"options": [
{
"value": "multistep",
"label": "Multi-step funnel — opt-in → engagement → ask",
"sub": "Best. Each step is a small yes."
},
{
"value": "singlestep",
"label": "Single-step — direct ask, no priming",
"sub": "REWORK. Add at least one micro-commitment before the ask."
}
]
}
]
},
{
"id": "deploy",
"num": "07",
"name": "Deploy",
"title": "<em>Ship</em> the minimum viable launch",
"rubric": "Gate 07 · Deploy",
"principle": {
"text": "\"Done beats perfect every single time. The launch you do not run cannot teach you anything. The launch that embarrasses you in 12 months is the right launch — anything you ship today that you would still be proud of in a year was over-engineered. Ship in 30 days. The market is the editor.\"",
"source": "RISER Captain's Logic · The Launch-Ugly Doctrine"
},
"inputs": [
{
"id": "deploy_date",
"type": "text",
"label": "Beta launch date (specific calendar date, ≤ 30 days out)",
"help": "A date is not a commitment until it is signed. Pick a Friday. Tell another operator. Make it expensive to slip.",
"placeholder": "e.g., 2026-05-23"
},
{
"id": "deploy_size",
"type": "choice",
"label": "Beta cohort size",
"help": "Captain's rule for first launch: smaller is better. 10 over-served founding members produce 10× the testimonial density of 50 mediocre members. 0 is too few; 50 is too many.",
"cols": 1,
"options": [
{
"value": "tiny",
"label": "5–10 founding members",
"sub": "Best for first-time launch. Over-serve. 10× testimonial density."
},
{
"value": "small",
"label": "10–25 members",
"sub": "Strong. Workable delivery capacity."
},
{
"value": "medium",
"label": "25–50 members",
"sub": "Risky on first launch. Delivery quality slips."
},
{
"value": "big",
"label": "50+ members",
"sub": "Almost always wrong on first launch."
}
]
},
{
"id": "deploy_price",
"type": "text",
"label": "Beta price (single number, USD)",
"help": "Founding rate, locked. Avoid the \"Muddled Middle\" ($500–$900). Default for service/coaching: $497–$997 founding rate, future $1497–$1997. For productized: $97–$297 founding, future $297–$497.",
"placeholder": "e.g., 497"
},
{
"id": "deploy_kill_rule",
"type": "choice",
"label": "Kill rule — what happens if you do not hit the number?",
"help": "RISER doctrine: \"If you cannot say what failure looks like in advance, you cannot tell the difference between a struggling launch and a dead launch.\" Kill rules protect from sunk-cost grinding.",
"cols": 1,
"options": [
{
"value": "tight",
"label": "< 5 paid in 14 days = pivot offer angle",
"sub": "Best. Forces a decision before sunk cost compounds."
},
{
"value": "medium",
"label": "< 3 paid in 21 days = pivot",
"sub": "Acceptable. Slightly slower trigger."
},
{
"value": "loose",
"label": "I will keep going regardless",
"sub": "Wrong answer. Define failure or it will define you."
}
]
},
{
"id": "deploy_4_tools",
"type": "choice",
"label": "Are the 4 minimum tools live?",
"help": "RISER minimum: a way to capture leads, a way to take payment, a way to deliver, a way to measure. Everything else is optional pre-launch.",
"cols": 1,
"options": [
{
"value": "all",
"label": "All 4 live and tested",
"sub": "GO."
},
{
"value": "three",
"label": "3 of 4 live",
"sub": "REWORK. Name the missing one and ship it this week."
},
{
"value": "fewer",
"label": "Fewer than 3",
"sub": "NO. Tools are not the problem. Build the missing tools FIRST in the next 7 days."
}
]
}
]
},
{
"id": "iterate",
"num": "08",
"name": "Iterate",
"title": "<em>Iterate</em> on real customer data",
"rubric": "Gate 08 · Iterate",
"principle": {
"text": "\"Volume forgives mistakes. The operator who has 100 sales conversations in a month learns more than the operator who has 5 perfect ones. Iterate on data, not opinions. Talk to every customer. Ask the same five questions. After 30 conversations, the pattern is undeniable.\"",
"source": "RISER Captain's Logic · The Voyage Log Iteration Cycle"
},
"inputs": [
{
"id": "iter_at_bats",
"type": "choice",
"label": "How many at-bats before iterating?",
"help": "Iterating after 3 calls = noise. Iterating after 30 calls = signal. Iterating after 300 = late.",
"cols": 1,
"options": [
{
"value": "enough",
"label": "20–30 sales conversations or 30+ users",
"sub": "GO. Sample size large enough to see patterns."
},
{
"value": "partial",
"label": "10–20 conversations",
"sub": "REWORK. Pattern unclear. Run 10 more before changing anything."
},
{
"value": "tiny",
"label": "Fewer than 10",
"sub": "NO. Iteration is premature. Get to 30 first."
}
]
},
{
"id": "iter_signal",
"type": "textarea",
"label": "What is the dominant pattern from real customers?",
"help": "RISER doctrine: \"Customers tell you exactly what is wrong. Most operators do not believe them.\" What objection comes up most? What feature do they ignore? What outcome do they actually celebrate?",
"placeholder": "e.g., 7 of 10 customers say the templates worked but the live calls were too long. 3 dropped at week 4 because of pacing."
},
{
"id": "iter_lever",
"type": "choice",
"label": "Which Value Equation lever do you adjust?",
"help": "Pick one. Changing all four at once is rebuild, not iterate. Iterate is one lever per cycle.",
"cols": 2,
"options": [
{
"value": "dream",
"label": "Strengthen Dream Outcome",
"sub": "Reframe transformation, raise specificity."
},
{
"value": "likelihood",
"label": "Increase Perceived Likelihood",
"sub": "Add proof, case studies, guarantees."
},
{
"value": "time",
"label": "Decrease Time Delay",
"sub": "Engineer faster first win, add quick wins."
},
{
"value": "effort",
"label": "Decrease Effort & Sacrifice",
"sub": "Remove DIY steps, add templates, raise tier to DWY/DFY."
}
]
},
{
"id": "iter_awareness",
"type": "choice",
"label": "Awareness stage — where is the market relative to the solution?",
"help": "Eugene Schwartz's 5 stages (used by Hormozi + Brunson): the right copy depends on what the market already knows. A Stage 1 audience needs the problem named. A Stage 5 audience needs a new mechanism. Most copy fails because it is written for the wrong stage.",
"cols": 1,
"options": [
{
"value": "unaware",
"label": "Stage 1 — Unaware: do not know they have the problem",
"sub": "Lead with a story or stat that names the pain. Direct claims fall flat here."
},
{
"value": "problem",
"label": "Stage 2 — Problem-Aware: feel the pain, do not know solutions exist",
"sub": "Lead with the pain in their words. Promise the category of relief."
},
{
"value": "solution",
"label": "Stage 3 — Solution-Aware: know solutions exist, comparing options",
"sub": "Lead with your unique mechanism. Differentiate, do not invent."
},
{
"value": "product",
"label": "Stage 4 — Product-Aware: know your product, weighing it",
"sub": "Lead with proof + risk reversal. They need permission to act."
},
{
"value": "most",
"label": "Stage 5 — Most Aware: know your product, just need a reason now",
"sub": "Lead with offer + scarcity. Direct ask. Brevity wins."
}
]
},
{
"id": "iter_sophistication",
"type": "choice",
"label": "Market sophistication — how worn-out are the claims in this niche?",
"help": "Schwartz's sophistication ladder: every claim works once, weakens with repetition, dies when the market has heard it 1,000 times. The fix is a NEW MECHANISM that resets the claim. Your market sophistication tells you how hard the new-mechanism work has to be.",
"cols": 1,
"options": [
{
"value": "s1",
"label": "Stage 1 — first to make the claim",
"sub": "Direct claims work. Rare in 2026; usually means the niche is small."
},
{
"value": "s2",
"label": "Stage 2 — claim works, you must make it bigger",
"sub": "\"Lose 30 lbs\" → \"Lose 30 lbs in 30 days.\" Amplify."
},
{
"value": "s3",
"label": "Stage 3 — claims worn, need a unique mechanism",
"sub": "Most niches in 2026 live here. Named mechanism is mandatory."
},
{
"value": "s4",
"label": "Stage 4 — mechanisms saturated, need a NEW mechanism",
"sub": "\"Not keto, not fasting — the metabolic-window method.\" Reset the category."
},
{
"value": "s5",
"label": "Stage 5 — every mechanism heard, must lead with identity / story",
"sub": "Tribe + identity wins. The mechanism is a side-effect of who you are."
}
]
},
{
"id": "iter_refund_interviews",
"type": "choice",
"label": "Refund interview discipline — are you running them?",
"help": "Hormozi: \"The refund call is the single most valuable sales call you will ever take.\" 5 questions: (1) What did you hope this would do for you? (2) What part of the experience caused you to step back? (3) Was the issue hook, audience, offer, onboarding, or delivery? (4) What would have changed your mind? (5) Would you refer someone else? The pattern is in the answers.",
"cols": 1,
"options": [
{
"value": "always",
"label": "Yes — every refund triggers a structured 5-question call",
"sub": "GO. You are mining the highest-signal data in the business."
},
{
"value": "sometimes",
"label": "Sometimes — informal refund conversations",
"sub": "REWORK. Formalize the 5 questions. Track the pattern across 10 refunds."
},
{
"value": "never",
"label": "Never — refunds are processed silently",
"sub": "NO. You are throwing away your best diagnostic data. Start tomorrow."
}
]
}
]
},
{
"id": "pivot",
"num": "09",
"name": "Pivot or Hold",
"title": "Is the offer dead, the audience wrong, or the hook off?",
"rubric": "Gate 09 · Diagnostic",
"principle": {
"text": "\"Three things can be wrong: the offer, the audience, or the hook. They look identical from the outside — both produce zero sales. The diagnostic is in the data. Hook problem: low click-through. Audience problem: high click-through, no conversion. Offer problem: high conversion, fast refund. Stop guessing. Read the funnel.\"",
"source": "RISER Captain's Logic · The Three-Failure-Mode Diagnostic"
},
"inputs": [
{
"id": "pivot_metric_ctr",
"type": "choice",
"label": "Are people clicking through your hooks?",
"help": "Cold ad CTR baseline: 1-2%. Organic post engagement baseline: 1-3% of followers. Below = hook problem.",
"cols": 1,
"options": [
{
"value": "yes",
"label": "Yes — CTR / engagement is normal or above",
"sub": "Hook is fine. Look elsewhere."
},
{
"value": "no",
"label": "No — barely anyone clicks or engages",
"sub": "HOOK problem. Rewrite hooks before changing offer or audience."
}
]
},
{
"id": "pivot_metric_optin",
"type": "choice",
"label": "Of clicks, what % opt-in / start the buying conversation?",
"help": "Cold landing page baseline: 20-40%. Sales page to purchase baseline: 1-3%. Application/booking baseline: 5-15%.",
"cols": 1,
"options": [
{
"value": "high",
"label": "Above baseline (great)",
"sub": "Audience is right and offer is interesting."
},
{
"value": "mid",
"label": "At baseline",
"sub": "OK. Look at conversion deeper in funnel."
},
{
"value": "low",
"label": "Below baseline (people click, do not opt-in)",
"sub": "AUDIENCE problem. Wrong people are showing up. Refine targeting."
}
]
},
{
"id": "pivot_metric_close",
"type": "choice",
"label": "Of buyers, what % stay, refer, or upsell?",
"help": "Refund rate >10% in first 30 days = offer problem. Refund rate <5% = offer is at minimum acceptable.",
"cols": 1,
"options": [
{
"value": "good",
"label": "Refund rate <5%, NPS positive",
"sub": "Offer works. Scale."
},
{
"value": "mid",
"label": "Refund rate 5-10%",
"sub": "REWORK. Offer is borderline. Improve delivery before scaling."
},
{
"value": "bad",
"label": "Refund rate >10% OR negative NPS",
"sub": "OFFER problem. Do not scale. Fix the delivery or the promise."
}
]
}
]
},
{
"id": "scale",
"num": "10",
"name": "Scale",
"title": "<em>Scale</em> what is working",
"rubric": "Gate 10 · Scale",
"principle": {
"text": "\"You scale what works. You do not scale what might work. The signal you can scale: same offer, same audience, same channel, repeatedly producing customers at known unit economics. Scaling before this signal is gambling. Scaling after is math.\"",
"source": "RISER Captain's Logic · The Scale Signal Doctrine"
},
"inputs": [
{
"id": "scale_signal",
"type": "choice",
"label": "Do you have the scale signal?",
"help": "Operating rule: 10 customers from one channel at known CAC and 6+ months of retention data = scale signal. Anything less = volume gambling.",
"cols": 1,
"options": [
{
"value": "yes",
"label": "Yes — 10+ customers from one channel, known unit economics, 6+ months of retention data",
"sub": "GO. Scale begins."
},
{
"value": "partial",
"label": "Some signal, partial data",
"sub": "REWORK. Get to 10 customers + 6 months retention before scaling."
},
{
"value": "no",
"label": "No — early or unstable",
"sub": "NO scale. Stay in iterate loop. Volume is not the answer yet."
}
]
},
{
"id": "scale_lever",
"type": "choice",
"label": "How do you scale? (Pick one)",
"help": "The three scale levers: increase price, increase volume, increase retention. Most operators reach for volume first; that is usually wrong.",
"cols": 1,
"options": [
{
"value": "price",
"label": "Raise price first",
"sub": "Highest leverage. 10% price increase ≈ 50%+ profit increase. Test before raising."
},
{
"value": "retention",
"label": "Increase retention / LTV",
"sub": "Second-highest. Reduce churn 20% ≈ 100% LTV increase."
},
{
"value": "volume",
"label": "Increase volume (more leads, more conversion)",
"sub": "Third lever. Most expensive. Use only when price + retention are maxed."
}
]
},
{
"id": "scale_constraint",
"type": "textarea",
"label": "What is the current bottleneck?",
"help": "Theory of Constraints: there is one bottleneck at a time. Lead gen, sales, delivery, retention. Name it. Fix it. Move to the next.",
"placeholder": "e.g., Delivery — I cannot onboard more than 5 new clients per month without burning out."
}
]
},
{
"id": "repeat",
"num": "11",
"name": "Repeat",
"title": "Find <em>another angle</em> — scale, profit, repeat",
"rubric": "Gate 11 · Compound",
"principle": {
"text": "\"One offer, one audience, one channel — that is a business. Two offers to the same audience — that is a customer base. Three offers to the same audience — that is a moat. Most operators jump to a second business before they have built one. The compound move is to deepen the same audience with the next problem they will pay you to solve.\"",
"source": "RISER Captain's Logic · The Compound Moat Principle"
},
"inputs": [
{
"id": "repeat_next_problem",
"type": "textarea",
"label": "What is the NEXT problem your existing customers will pay you to solve?",
"help": "Operating rule: ask 20 customers \"what is the next thing you would buy from me?\" Build that. Same audience, no new acquisition cost. LTV doubles.",
"placeholder": "e.g., Customers landed retainers but struggle to scale past $20K/mo. Next offer: \"Retainer to Agency\" coaching at $4,997."
},
{
"id": "repeat_decision",
"type": "choice",
"label": "What is the right next move?",
"help": "Most operators get this wrong. The temptation is \"another business.\" The right answer is almost always \"another offer to the same audience.\"",
"cols": 1,
"options": [
{
"value": "deepen",
"label": "New offer, SAME audience, SAME channel",
"sub": "Best. Compound the moat. 5x LTV from existing customers."
},
{
"value": "expand",
"label": "Same offer, new adjacent audience",
"sub": "Second-best. Tested offer reduces risk."
},
{
"value": "channel",
"label": "Same offer, same audience, NEW channel",
"sub": "Third option. Channel diversification reduces platform risk."
},
{
"value": "new",
"label": "New business entirely",
"sub": "Almost always wrong. You are leaving compound returns on the table."
}
]
},
{
"id": "repeat_constraint_check",
"type": "choice",
"label": "Have you maxed out the current offer first?",
"help": "RISER doctrine: \"Do not start a second business until the first is at the limit of what one operator can extract from it.\" Most operators are at 30% of that limit when they get bored and pivot.",
"cols": 1,
"options": [
{
"value": "maxed",
"label": "Yes — same offer at $X-million ARR with healthy retention",
"sub": "GO compound."
},
{
"value": "midway",
"label": "No — still room in the current offer",
"sub": "REWORK. Stay focused. Maximize before adding."
},
{
"value": "bored",
"label": "I am bored / want something new",
"sub": "NO. Boredom is not strategy. Re-engage the current business."
}
]
},
{
"id": "repeat_ladder_bait",
"type": "text",
"label": "Value Ladder Rung 1 — BAIT (free lead magnet, name + format)",
"help": "Brunson's ladder starts here. Free, named, valuable. The first rung exists to create reciprocity and build the list. If you have no bait, you have no ladder.",
"placeholder": "e.g., The Retainer Pricing Calculator (PDF + Notion template)"
},
{
"id": "repeat_ladder_tripwire",
"type": "text",
"label": "Rung 2 — TRIPWIRE ($7-$97 entry offer, name + price)",
"help": "Low-ticket entry point. Converts a lead to a buyer for the price of a coffee. Buyers behave fundamentally differently from leads — this is the rung that creates the buyer-list segment.",
"placeholder": "e.g., The 7-Day Retainer Email Course — $27"
},
{
"id": "repeat_ladder_core",
"type": "text",
"label": "Rung 3 — CORE OFFER ($297-$1,997, name + price)",
"help": "Your main offer. The Grand Slam. Most operators only have this rung and wonder why they cannot scale.",
"placeholder": "e.g., The 90-Day Retainer Sprint — $497"
},
{
"id": "repeat_ladder_continuity",
"type": "text",
"label": "Rung 4 — CONTINUITY (recurring offer, name + monthly price)",
"help": "Hormozi: \"The single highest LTV-per-dollar move is continuity.\" Skool community, software subscription, monthly coaching, certification renewal. If you have no continuity, you are leaving 60% of LTV on the table.",
"placeholder": "e.g., The Retainer Captains Skool — $97/mo"
},
{
"id": "repeat_ladder_high",
"type": "text",
"label": "Rung 5 — HIGH-TICKET / BACK-END ($5K-$50K+, name + price)",
"help": "The premium DFY tier. 80% of operator profit lives here. Often \"Done-with-me\" or \"Done-for-you\" implementation of the core offer's outcome.",
"placeholder": "e.g., The Agency Architect — $9,997 12-week 1:1 build"
},
{
"id": "repeat_continuity_status",
"type": "choice",
"label": "Continuity health — what % of customers are on a recurring offer?",
"help": "The single highest-leverage metric for compound LTV. Below 20% = you have not built the continuity offer yet. Above 60% = you have a real moat.",
"cols": 1,
"options": [
{
"value": "strong",
"label": "60%+ on continuity",
"sub": "GO. Real LTV. Real moat."
},
{
"value": "mid",
"label": "20-60% on continuity",
"sub": "Workable. Improve the continuity offer or migration path."
},
{
"value": "low",
"label": "<20% on continuity",
"sub": "REWORK. Build the continuity offer. Highest-leverage gap in your business."
},
{
"value": "none",
"label": "No continuity offer exists",
"sub": "NO. Build it before scaling acquisition further."
}
]
},
{
"id": "repeat_dream100_affiliate",
"type": "choice",
"label": "Affiliate / partner activation — have you turned customers into affiliates?",
"help": "Brunson: the second wave of growth comes from your customers selling for you. 10 customer-affiliates each bringing 5 clients = 50 clients with zero acquisition cost.",
"cols": 1,
"options": [
{
"value": "active",
"label": "Yes — formal program with named affiliates already producing",
"sub": "GO. Compound is engaged."
},
{
"value": "informal",
"label": "Informal referrals, no program",
"sub": "REWORK. Formalize. A 30%-commission affiliate program turns your customer list into a sales force."
},
{
"value": "none",
"label": "No referral or affiliate motion",
"sub": "NO. You are paying for every customer when half of them would pay to bring others."
}
]
}
]
},
{
"id": "summary",
"num": "12",
"name": "Brief",
"title": "Your <em>One-Page Brief</em>",
"rubric": "Decision Document",
"isSummary": true
}
]
}
}