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.
| Step Index | Step Name | Component | What Happens |
|---|---|---|---|
| 0 | Intro | IntroStep.tsx | Hero banner explaining representation benefits. |
| 1–3 | Brands | BrandPickerStep.tsx | Creator selects target brands across 3 categories (e.g. fashion, tech, lifestyle). Up to 3 brands per category. |
| 4 | Socials | SocialsStep.tsx | Creator enters Instagram, TikTok, YouTube, and X handles. Validates handles with validateTalentSocials. |
| 5 | Analyzing | AnalyzingStep.tsx | Short animated transition simulating profile and category analysis. |
| 6 | Signup | SignupStep.tsx | Non-redirect popup login (Google OAuth or email) via @zooly/auth-client. On completion, flushes draft buffer. |
| 7 | Upload | UploadStep.tsx | Creator uploads their profile/avatar image. |
| 8 | Done | DoneStep.tsx | Success screen confirming setup; marks markOnboarded: true and clears draft. |
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;
}
flushFastSignupDraft)When the creator reaches Step 6 (Signup):
loginWithPopup({ authUrl: getAuthUrl() }).flushFastSignupDraft sends the buffered choices to the backend in a batch:
updateSocialLinks.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" };
}
Before leaving the Socials step, handles are validated via POST /api/social-scraper/validate:
| File | Purpose |
|---|---|
packages/offers/client/src/app/components/fast-signup/FastSignupPage.tsx | Main wizard controller and step state machine |
packages/offers/client/src/app/components/fast-signup/useFastSignupDraft.ts | Local storage persistence and draft flush logic |
packages/offers/client/src/app/components/fast-signup/constants.ts | Step enumerations, brand categories, and validation limits |
packages/offers/client/src/app/components/fast-signup/SignupStep.tsx | Popup authentication UI component |