Skip to content

persona-loop finding: /try's "no signup required" promise breaks the moment extraction fails #117

Description

@fixlyai

Persona: Dentist office manager (Friday persona), non-technical, skeptical, on her phone, evaluating whether to trust SeldonFrame with her practice's front office.

Funnel step: Homepage hero → "Paste a URL" tab → /try?url=... (the public, unauthenticated "watch it build, no signup required" surface).

Verbatim evidence

Homepage hero form (https://www.seldonframe.com/) offers two tabs: "Paste a URL" and "Describe the business." A realistic version of this persona has a practice whose only real web presence is a Facebook Page (very common for small local-service businesses — plenty of dentists, salons, landscapers never got past that). I exercised the actual paste-a-URL path against a Facebook page (a generic, non-impersonating one — facebook.com root — to avoid touching any real business's identity) directly against the public API the /try page calls:

$ curl -N "https://www.seldonframe.com/api/v1/web/build/stream?url=https://www.facebook.com/"

event: fetching
data: {"url":"https://www.facebook.com/"}

event: error
data: {"code":422,"reason":"extraction_failed","message":"We read that site but couldn't find the basics we need — a business name, location, and phone number. Try a different URL, or describe your business instead."}

The /try page's own headline directly above the paste box reads:

"Watch it build — no signup required."
"We build a real hosted website, CRM, and a working AI chatbot in a few minutes — free to try, nothing to sign up for yet."

But when extraction fails (packages/crm/src/app/(public)/try/try-client.tsx:346-367), the ONLY forward path offered besides retrying a different URL is a button labeled "Describe your business instead," which links straight to /signup?intent=build — an account-creation wall, immediately contradicting the "no signup required" promise the visitor just read.

Root cause

packages/crm/src/app/api/v1/web/build/stream/route.ts (the public, anonymous build route) is URL-only — it has no text/biz parameter. The homepage's "Describe the business" tab has always routed to /signup (packages/crm/src/components/landing/hero-submit-target.ts:9-14), and this was a deliberate, documented scope cut when /try shipped — see try-client.tsx:14-20:

"the public build route this page calls is URL-only... Wiring a description mode here would require a second public anonymous route this task doesn't create, so the biz seed (if present) is shown read-only with a short explanatory note instead of being submittable. Recorded as a deviation in the task report."

So this isn't a latent bug — it's a known, intentional gap that was punted at ship time. The practical effect: any small business without a text-extractable website (Facebook-only presence, a site with the phone number baked into a logo image instead of text, a Yelp/Google-only listing) hits the account-creation wall at the exact moment SeldonFrame is trying to earn trust with a frictionless demo — precisely the persona (non-technical, skeptical, phone-first, low web sophistication) this ungated flow exists to convert.

Why this is a judgment call, not a PR

Per CLAUDE.md, /try's "no signup required" ungated build is core to the locked SeldonFrame vision (§1: "no guest mode, no local:// paths, no claim step, no upfront API key... progressive key disclosure only"). Fixing this honestly means one of:

  1. Building a second public, anonymous, description-based build route (real architectural work — a new pipeline, new rate-limit surface, new abuse considerations for an anonymous free-text LLM endpoint), or
  2. Softening the "no signup required" copy so it doesn't over-promise, or
  3. Investing in extraction robustness (e.g., detect Facebook/social URLs specifically and give a more actionable message, such as suggesting the visitor paste their Google Business Profile URL instead).

Each is a product/positioning decision, not a small isolated bug — exactly the kind of call this loop is instructed to escalate rather than patch. Flagging for Max to prioritize.

Gate verdict: N/A — no code changed, issue-only per the loop's judgment-call path.

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions