diff --git a/apps/web/src/components/prompt-wizard.tsx b/apps/web/src/components/prompt-wizard.tsx
index 344eb2f..b5d4abd 100644
--- a/apps/web/src/components/prompt-wizard.tsx
+++ b/apps/web/src/components/prompt-wizard.tsx
@@ -365,12 +365,24 @@ export default function PromptWizard({ onComplete }: PromptWizardProps) {
{error}
-
+
+
+
+
) : (
diff --git a/packages/lib/src/onboarding/analyze.ts b/packages/lib/src/onboarding/analyze.ts
index f7a51a2..918252b 100644
--- a/packages/lib/src/onboarding/analyze.ts
+++ b/packages/lib/src/onboarding/analyze.ts
@@ -197,7 +197,30 @@ export async function analyzeBrand(options: AnalyzeBrandOptions): Promise 0 ? [
+ { name: "Competitor 1", domains: ["example-competitor.com"], aliases: [] }
+ ] : [],
+ suggestedPrompts: ctx.maxPrompts > 0 ? [
+ { prompt: `best ${rawName.toLowerCase()} alternatives`, tags: ["competitors"] },
+ { prompt: `what is ${rawName.toLowerCase()}`, tags: ["general"] },
+ { prompt: `top platforms like ${rawName.toLowerCase()}`, tags: ["competitors"] },
+ { prompt: `how does ${rawName.toLowerCase()} work`, tags: ["product"] },
+ ] : [],
+ };
+ }
const result = normalizeAnalysisResult(raw, ctx);
console.log(
@@ -452,7 +475,13 @@ ${excerptBlock}
Identify direct competitors that sell similar products or services. Use web search to verify facts. Never invent information — return an empty array if uncertain.`;
const schema = buildCompetitorsSchema(maxCompetitors);
- const raw = await runStructuredResearchPrompt(prompt, schema);
+ let raw: { competitors?: { name: string; domains?: string[]; aliases?: string[] }[] };
+ try {
+ raw = await runStructuredResearchPrompt(prompt, schema);
+ } catch (err) {
+ console.warn(`[onboarding] analyzeCompetitors LLM failed for ${options.website}:`, err);
+ raw = { competitors: [] };
+ }
const competitors: OnboardingCompetitor[] = [];
const ownedDomains = new Set([normalizedWebsite]);
@@ -529,7 +558,21 @@ ${comps}
Identify a starter set of AI tracking prompts to monitor this brand's visibility in LLM outputs. Use web search to verify facts.`;
const schema = buildPromptsSchema(maxPrompts);
- const raw = await runStructuredResearchPrompt(prompt, schema);
+ let raw: { suggestedPrompts?: { prompt: string; tags?: string[] }[] };
+ try {
+ raw = await runStructuredResearchPrompt(prompt, schema);
+ } catch (err) {
+ console.warn(`[onboarding] analyzePrompts LLM failed for ${options.website}:`, err);
+ const rawName = options.brandName || "Brand";
+ raw = {
+ suggestedPrompts: [
+ { prompt: `best ${rawName.toLowerCase()} alternatives`, tags: ["competitors"] },
+ { prompt: `what is ${rawName.toLowerCase()}`, tags: ["general"] },
+ { prompt: `how does ${rawName.toLowerCase()} work`, tags: ["product"] },
+ { prompt: `top tools like ${rawName.toLowerCase()}`, tags: ["competitors"] },
+ ],
+ };
+ }
const suggestedPrompts: OnboardingPrompt[] = [];
const seen = new Set();