Fast Signup Flow

Mobile brand partnership onboarding wizard with deferred authentication

Overview

The Fast Signup flow (/talent/fast-signup) is a high-conversion mobile wizard designed for creators and talents arriving from external social campaigns.

To maximize conversion, authentication is deliberately deferred until after the creator has already chosen target brands and entered their social handles. Unauthenticated selections are buffered in client storage and seamlessly flushed to their account upon popup or redirect login.

flowchart LR Intro["1. Intro<br/>Value prop"] --> Brands["2-4. Brands<br/>3 categories"] Brands --> Socials["5. Socials<br/>Validate handles"] Socials --> Analyzing["6. Analyzing<br/>AI simulation"] Analyzing --> Signup["7. Signup<br/>Popup / Redirect Auth"] Signup --> Upload["8. Upload<br/>Avatar image"] Upload --> Done["9. Done<br/>markOnboarded"]

7-Step Wizard Flow

Step IndexStep NameComponentWhat Happens
0IntroIntroStep.tsxHero banner explaining representation benefits.
1–3BrandsBrandPickerStep.tsxCreator selects target brands across 3 categories (e.g. fashion, tech, lifestyle). Up to 3 brands per category.
4SocialsSocialsStep.tsxCreator enters Instagram, TikTok, YouTube, and X handles. Validates handles with validateTalentSocials.
5AnalyzingAnalyzingStep.tsxShort animated transition simulating profile and category analysis.
6SignupSignupStep.tsxNon-redirect popup login (Google OAuth or email) via @zooly/auth-client. On completion, flushes draft buffer.
7UploadUploadStep.tsxCreator uploads their profile/avatar image.
8DoneDoneStep.tsxSuccess screen confirming setup; marks markOnboarded: true and clears draft.

Local Draft Buffering & Flush

Draft State (useFastSignupDraft)

While the creator is browsing as a guest, selections are stored in localStorage under the key zooly_fast_signup_draft:

export interface FastSignupDraft {
  step: number;
  selectedByCategory: Record<number, string[]>;
  socials: FastSignupSocials;
  imageFilename: string | null;
  pendingFlush: boolean;
}

Authentication & Flushing (flushFastSignupDraft)

When the creator reaches Step 6 (Signup):

  1. Clicking "Continue with Google" or "Continue with email" triggers loginWithPopup({ authUrl: getAuthUrl() }).
  2. Once authenticated, flushFastSignupDraft sends the buffered choices to the backend in a batch:
    • Updates account display name / image.
    • Saves target brands to account metadata.
    • Saves social links via updateSocialLinks.
  3. If the popup was blocked by the browser, pendingFlush: true triggers a standard redirect flow via Cognito and flushes automatically upon return.
// packages/offers/client/src/app/components/fast-signup/useFastSignupDraft.ts
export async function flushFastSignupDraft(draft: FastSignupDraft) {
  const account = await fetchAccount();
  if (account.status !== "success") {
    return { status: "unauthenticated" };
  }

  // Flush social links
  const links = SOCIAL_FIELDS
    .filter((field) => draft.socials[field.key].trim().length > 0)
    .map((field) => ({
      platform: field.platform,
      url: draft.socials[field.key].trim(),
    }));

  if (links.length > 0) {
    await updateSocialLinks(links);
  }

  return { status: "success" };
}

Social Profile Validation

Before leaving the Socials step, handles are validated via POST /api/social-scraper/validate:

  • Ensures handles exist on Instagram, TikTok, YouTube, and X before advancing.
  • If a profile handle cannot be resolved, inline field errors alert the creator to fix typos.
  • Network or validation outages fail open to prevent blocking legitimate signups.

Key Files

FilePurpose
packages/offers/client/src/app/components/fast-signup/FastSignupPage.tsxMain wizard controller and step state machine
packages/offers/client/src/app/components/fast-signup/useFastSignupDraft.tsLocal storage persistence and draft flush logic
packages/offers/client/src/app/components/fast-signup/constants.tsStep enumerations, brand categories, and validation limits
packages/offers/client/src/app/components/fast-signup/SignupStep.tsxPopup authentication UI component