Skip to main content
This page collects the most common issues you may run into while building with Rocket, organized by category. Each entry includes what you will see, why it happens, and step-by-step instructions to fix it.

Supabase issues

What you see: Your app fails to load, shows a blank screen, or displays database-related errors after connecting Supabase.Why it happens: Migration scripts have not been pushed to the remote Supabase project, the Supabase project is paused due to inactivity, or the redirect URLs for authentication are misconfigured.How to fix it:
  1. Open your project settings and go to the Supabase integration panel
  2. Check the migrations panel and push any pending migration scripts
  3. Log into the Supabase dashboard and verify your project is active (not paused). If paused, click “Restore” to reactivate it
  4. Under Authentication > URL Configuration, confirm your redirect URLs match your app’s URLs
Prompt to paste in Rocket chat:
My app is stuck after connecting Supabase. Check if migration scripts have been pushed successfully. Verify the Supabase client is initialized with correct environment variables. If there are missing migrations, push them. If there are connection errors, show me what's wrong.
See Push Migration Scripts and Redirect URLs.
What you see: Queries return empty results even though data exists, or you see “new row violates row-level security policy” errors.Why it happens: Row Level Security (RLS) is enabled on the table but no policies have been created, or existing policies do not match the current user’s authentication state.How to fix it:
  1. Open the Supabase dashboard and navigate to the table in question
  2. Check the “Policies” tab to see if any RLS policies exist
  3. If no policies exist, create policies that allow authenticated users to read rows and modify only their own rows
  4. If policies exist, verify they match the expected user role and auth state
Prompt to paste in Rocket chat:
The [TABLE_NAME] table has RLS enabled but queries return empty results for authenticated users. Check whether RLS policies exist for this table. If not, create policies that allow authenticated users to read all rows and insert, update, or delete only their own rows (where user_id matches auth.uid()). Explain each policy you create.
See Supabase Integration.
What you see: Errors like “JWT expired”, “invalid JWT”, or “no API key found in request” when making Supabase calls.Why it happens: The Supabase client is not initialized correctly, the anon key is missing or incorrect, or the user’s session token has expired and is not being refreshed.How to fix it:
  1. Open Code View and verify that SUPABASE_URL and SUPABASE_ANON_KEY environment variables are set correctly
  2. Check that the Supabase client is imported and initialized in your code
  3. Make sure your app refreshes the auth session automatically so expired tokens get renewed
  4. If tokens keep expiring, redirect the user to the login page instead of showing a broken state
Prompt to paste in Rocket chat:
Supabase calls are failing with JWT token errors. Check that the Supabase client is initialized with the correct SUPABASE_URL and SUPABASE_ANON_KEY from environment variables. Verify the auth session is being refreshed automatically. If the session expires, redirect the user to the login page instead of showing a broken state.
See Supabase Integration.
What you see: After social login (Google, GitHub), users see a “redirect URL mismatch” error or get stuck on a blank page instead of returning to the app.Why it happens: The redirect URL configured in the Supabase dashboard does not match the URL your app is actually using. This is especially common when switching between localhost and a deployed domain.How to fix it:
  1. Go to the Supabase dashboard > Authentication > URL Configuration > Redirect URLs
  2. Add your app’s callback URL (for example, https://your-app.netlify.app/auth/callback)
  3. For local development, also add http://localhost:[PORT]/auth/callback
  4. Make sure the auth callback handler in your code extracts the session from the URL hash correctly
Prompt to paste in Rocket chat:
Social login is failing with a redirect URL mismatch. Update the auth callback handler to use the correct redirect URL. For development, use http://localhost:[PORT]/auth/callback. Remind me to add this URL to the Supabase dashboard under Authentication > URL Configuration > Redirect URLs. Handle the auth callback properly by extracting the session from the URL hash.
See Redirect URLs.
What you see: Clicking “Sign in with Google” (or another social provider) does nothing, shows an error, or redirects to a broken page.Why it happens: The social auth provider is not configured in the Supabase dashboard, the OAuth client ID and secret are missing, or the callback URL is not registered with the provider.How to fix it:
  1. In the Supabase dashboard, go to Authentication > Providers and enable the social provider you want (e.g., Google, GitHub)
  2. Enter the OAuth client ID and client secret from the provider’s developer console
  3. Copy the callback URL from Supabase and add it to the provider’s authorized redirect URIs
  4. In your Rocket app, verify the login button calls the correct Supabase social auth method
Prompt to paste in Rocket chat:
Social login with [PROVIDER] is not working. Check that the signInWithOAuth call uses the correct provider name. Verify the redirect URL is set properly. Show me what the auth flow looks like and confirm the callback is being handled.
See Social Auth and Google Sign-In.
What you see: File uploads fail with “new row violates row-level security policy” or “Bucket not found” errors.Why it happens: The storage bucket does not exist, its RLS policies are not configured, or the bucket is set to private without the correct access policies.How to fix it:
  1. In the Supabase dashboard, go to Storage and confirm the bucket exists
  2. If the bucket is private, add RLS policies to allow uploads and downloads for authenticated users
  3. If you need public access (e.g., for profile images), set the bucket to public
  4. Verify the file path format in your upload code matches what the policies expect
Prompt to paste in Rocket chat:
File uploads to Supabase Storage are failing. Check that the storage bucket exists and has the correct permissions. If the bucket is private, create RLS policies that allow authenticated users to upload and read files. Show me the upload code and confirm the file path format is correct.
See Storage Buckets.

Stripe issues

What you see: Stripe checkout completes successfully, but your app never updates the order status or subscription because the webhook endpoint is not receiving events.Why it happens: The webhook endpoint URL is incorrect in the Stripe dashboard, the webhook signing secret does not match, or the endpoint is not publicly accessible.How to fix it:
  1. In the Stripe dashboard, go to Developers > Webhooks and verify the endpoint URL points to your deployed app (e.g., https://your-app.netlify.app/api/webhooks/stripe)
  2. Copy the webhook signing secret and add it as an environment variable in your app
  3. Make sure the endpoint parses the raw request body (not JSON-parsed) for signature verification
  4. For local testing, use the Stripe CLI: stripe listen --forward-to localhost:[PORT]/api/webhooks/stripe
Prompt to paste in Rocket chat:
Stripe webhooks are not reaching the app after checkout. Verify the webhook endpoint is correctly set up at /api/webhooks/stripe. Check that the endpoint parses the raw request body for signature verification. Log incoming webhook events for debugging.
See Stripe Integration.
What you see: Payments fail with “No such product” or “Invalid API key” errors. Or test transactions appear in the live dashboard unexpectedly.Why it happens: The app is using test keys (sk_test_...) with live mode products, or live keys (sk_live_...) with test mode products. Test and live environments are completely separate in Stripe.How to fix it:
  1. Check your environment variables: STRIPE_SECRET_KEY and STRIPE_PUBLISHABLE_KEY
  2. For development, make sure both keys start with sk_test_ and pk_test_
  3. Verify that product and price IDs were created in the same environment (test or live) as your keys
  4. When going to production, swap to live keys and recreate products in live mode
Prompt to paste in Rocket chat:
Stripe payments are failing, possibly due to key/environment mismatch. Check that STRIPE_SECRET_KEY and STRIPE_PUBLISHABLE_KEY use test keys (starting with sk_test_ and pk_test_). Verify that product and price IDs match the test environment. Add a visual indicator in development mode showing whether test or live keys are active.
See Stripe Integration.
What you see: After completing Stripe checkout, the user is not redirected back to the app. They stay on the Stripe page or see a broken link.Why it happens: The success_url or cancel_url in the checkout session uses a relative path instead of an absolute URL, or the domain is not configured in Stripe settings.How to fix it:
  1. Open your checkout session creation code and verify success_url and cancel_url use absolute URLs (e.g., https://your-app.netlify.app/success)
  2. For development, use http://localhost:[PORT]/success
  3. Include any required query parameters like session_id={CHECKOUT_SESSION_ID}
  4. Test both the success and cancel flows
Prompt to paste in Rocket chat:
After Stripe checkout, users are not redirected back to the app. Check that the success_url and cancel_url in the checkout session creation use absolute URLs. In development, use http://localhost:[PORT]/success. Make sure the URLs include any required query parameters like session_id. Test both the success and cancel flows.
See Stripe Integration.
What you see: A user completes a subscription checkout but their account still shows as “free” or “inactive”. The subscription status never changes.Why it happens: The webhook handler is not processing the relevant Stripe events (like checkout.session.completed or customer.subscription.updated), or the database is not being updated when the webhook fires.How to fix it:
  1. Verify your webhook endpoint is receiving events (check Stripe dashboard > Developers > Webhooks > Recent events)
  2. Confirm your handler processes these events: checkout.session.completed, customer.subscription.updated, customer.subscription.deleted
  3. Check that the handler updates the user’s subscription status in your database after processing each event
  4. Add logging to your webhook handler to trace what happens when each event arrives
Prompt to paste in Rocket chat:
After Stripe checkout, the user's subscription status is not updating. Check the webhook handler at /api/webhooks/stripe. Make sure it processes checkout.session.completed and customer.subscription.updated events. When these events fire, update the user's subscription status in the database. Add logging so I can see what events are received.
See Stripe Integration.

Email issues (Resend/SendGrid)

What you see: Email sending fails with “unauthorized”, “API key missing”, “authentication failed”, or “sender address not verified” errors.Why it happens: The API key environment variable is not set, is misspelled, or the “from” email address or domain has not been verified in the email provider’s dashboard.How to fix it:
  1. Open Code View and verify your email API key environment variable is set (e.g., RESEND_API_KEY or SENDGRID_API_KEY)
  2. Confirm the API key is only accessed server-side to avoid exposing it
  3. For development with Resend, use onboarding@resend.dev as the sender address
  4. For production, verify your custom domain in the provider’s dashboard by adding the required DNS records
Prompt to paste in Rocket chat:
Email sending fails with an authentication error. Check that the RESEND_API_KEY environment variable is set and accessible server-side. Make sure API calls happen on the server, not the client. For development, use "onboarding@resend.dev" as the sender. Add error handling that logs the specific failure reason.
See Resend Integration and SendGrid Integration.
What you see: Emails are sent successfully (no errors) but recipients find them in their spam or junk folder.Why it happens: The sending domain lacks proper authentication records (SPF, DKIM, DMARC), the email content triggers spam filters, or the sender reputation is low.How to fix it:
  1. In your domain’s DNS settings, add the SPF, DKIM, and DMARC records provided by your email service
  2. Use a recognizable “from” name (e.g., “YourApp Team”) instead of a generic address
  3. Avoid spam trigger words, all-caps, and excessive punctuation in subject lines
  4. Include a plain-text version alongside HTML and add an unsubscribe link
Prompt to paste in Rocket chat:
Emails are landing in spam folders. Review the email template and make these changes: use a clear subject line, include a plain-text version alongside HTML, add an unsubscribe link, and make sure the "from" name is recognizable. Remind me to verify SPF, DKIM, and DMARC records for my domain.
See Resend Integration and SendGrid Integration.
What you see: Authentication emails (confirmation, password reset, magic link) arrive with default Supabase branding instead of your app’s branding, or they come from a generic Supabase email address.Why it happens: Supabase uses its own built-in email service by default. To customize auth emails, you need to configure a custom SMTP provider (like Resend) in the Supabase dashboard.How to fix it:
  1. Set up a Resend account and verify your domain
  2. In the Supabase dashboard, go to Project Settings > Authentication > SMTP Settings
  3. Enable “Custom SMTP” and enter your Resend SMTP credentials (host: smtp.resend.com, port: 465, username: resend, password: your API key)
  4. Customize your email templates under Authentication > Email Templates
Prompt to paste in Rocket chat:
Auth emails are using default Supabase branding. Help me set up custom SMTP with Resend so auth emails (confirmation, password reset, magic link) use my app's branding. Show me what SMTP settings to enter in the Supabase dashboard.
See Resend Integration and Email Templates.

AI integration issues (OpenAI/Anthropic/Gemini)

What you see: AI API calls fail with “429 Too Many Requests” or “rate limit exceeded” errors, especially when multiple users trigger AI features simultaneously.Why it happens: The app is sending too many requests to the AI provider within their rate limit window. Free-tier API keys have stricter limits.How to fix it:
  1. Add a loading state that disables the trigger button while a request is in progress
  2. Debounce user-triggered AI calls so rapid clicks do not send multiple requests
  3. Implement exponential backoff retry on 429 errors (wait 1s, then 2s, then 4s)
  4. Cache recent AI responses to avoid duplicate requests for the same input
  5. If you hit limits frequently, consider upgrading your API plan with the provider
Prompt to paste in Rocket chat:
AI API calls are hitting rate limits. Add these safeguards: debounce user-triggered AI calls, add a loading state that disables the button while a request is in progress, implement exponential backoff retry on 429 errors, show a user-friendly message saying "AI is busy, please try again in a moment", and cache recent AI responses to avoid duplicate requests.
See OpenAI, Anthropic, and Gemini.
What you see: AI responses are cut off mid-sentence or you see “maximum context length exceeded” errors.Why it happens: The input (prompt plus context) exceeds the model’s token limit. This often happens when sending entire pages or large documents as context.How to fix it:
  1. Truncate input text to a reasonable character limit before sending
  2. Show a warning if the user’s input is too long
  3. For long content, split it into chunks, process each chunk, then combine the results
  4. Consider using a model with a larger context window
Prompt to paste in Rocket chat:
AI calls are failing because the input exceeds the token limit. Truncate the input to a maximum of [MAX_CHARS] characters before sending. Show a warning if the user's input is too long. If summarizing long content, split it into chunks, summarize each chunk, then combine the summaries.
See OpenAI, Anthropic, and Gemini.
What you see: The AI feature shows a permanent loading spinner. No response comes back and no error is displayed.Why it happens: The API call has no timeout configured, the API key is invalid, the model name is misspelled, or the AI provider is experiencing an outage.How to fix it:
  1. Verify the API key environment variable is set and correct
  2. Check the model name is spelled correctly (e.g., gpt-4o not gpt4o)
  3. Set a 30-second timeout on the API call
  4. Add a “Cancel” button so users can abort a stuck request
  5. Check the provider’s status page to rule out outages
Prompt to paste in Rocket chat:
The AI feature hangs with a loading spinner and never returns a result. Set a 30-second timeout on the API call. If it times out, show "AI is taking too long to respond. Please try again." Verify the model name is correct and the API key is valid. Add a Cancel button that aborts the request. Log the full error details for debugging.
See OpenAI, Anthropic, and Gemini.
What you see: Instead of seeing the AI response appear word by word, you either get the entire response at once after a long delay, or you see raw stream data like data: {"choices":[...]} in the UI.Why it happens: The response is not being processed as a stream on the client side, or the API call is not configured to use streaming mode.How to fix it:
  1. Verify the API call includes stream: true in the request options
  2. On the server, make sure the response uses a streaming format (e.g., Server-Sent Events or a ReadableStream)
  3. On the client, process the stream incrementally and update the UI as each chunk arrives
  4. Check that no middleware is buffering the entire response before sending it
Prompt to paste in Rocket chat:
AI streaming is not working. The response should appear word by word, but instead it either arrives all at once or shows raw data. Check that the API call uses stream: true. On the server, return the response as a stream. On the client, process each chunk and update the UI incrementally. Make sure no middleware is buffering the response.
See OpenAI, Anthropic, and Gemini.

Deployment issues (Netlify)

What you see: The deployment fails during the build step with errors like “module not found”, “build command failed”, or TypeScript compilation errors.Why it happens: Dependencies are missing from package.json, the build command is incorrect, or there are code errors that only appear during a production build (like unused imports treated as errors).How to fix it:
  1. Check the build logs in the Netlify dashboard for the specific error
  2. Verify the build command matches your project (e.g., npm run build or next build)
  3. Make sure all dependencies are listed in package.json (not just installed locally)
  4. Check for case-sensitive file path issues, as Netlify runs on Linux
  5. Verify the Node.js version in your Netlify settings matches what your project requires
Prompt to paste in Rocket chat:
The deployment build is failing. Check for missing dependencies that might work locally but are not in package.json. Look for TypeScript errors or ESLint warnings treated as errors in production. Verify all imported files and modules exist with correct paths (case-sensitive). List the specific errors and suggest fixes for each.
See Netlify Integration and Launch Web App.
What you see: The app builds and deploys, but features break in production. Database queries fail, payments do not work, or emails do not send.Why it happens: Environment variables that exist in your local .env file were not added to the Netlify dashboard. The app runs without the required API keys and connection strings.How to fix it:
  1. In the Netlify dashboard, go to Site Settings > Environment Variables
  2. Add every variable your app needs: SUPABASE_URL, SUPABASE_ANON_KEY, STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, email API keys, and any others
  3. Trigger a redeploy after adding the variables
  4. Add a startup validation check in your app that logs which required variables are missing
Prompt to paste in Rocket chat:
The deployed app is missing environment variables. Create a .env.example file listing every environment variable the project needs, with placeholder values and comments. Add a startup validation check that logs which required variables are missing.
See Netlify Integration and Connect Custom Domain.
What you see: After setting up a custom domain, visiting it shows “site not found”, a DNS error, or the default Netlify page instead of your app.Why it happens: DNS records are not configured correctly, DNS changes have not propagated yet (this can take up to 48 hours), or the domain is not linked to the correct project in Netlify.How to fix it:
  1. In Netlify, go to Domain Settings and verify your custom domain is listed
  2. Add the correct DNS records at your domain registrar (typically a CNAME pointing to your Netlify subdomain, or an A record for the apex domain)
  3. Wait up to 48 hours for DNS propagation
  4. Check that SSL/HTTPS is provisioned for the custom domain in Netlify’s settings
  5. Use a DNS lookup tool (like dnschecker.org) to verify records are set correctly
Prompt to paste in Rocket chat:
My custom domain is not resolving to the deployed app. Help me check whether I need an A record, CNAME record, or both. Provide the correct DNS record values for Netlify. Verify the domain is linked to the correct project in the Netlify dashboard.
See Connect Custom Domain and Netlify Integration.
What you see: The Rocket preview looks correct, but the deployed site on Netlify shows an older version or behaves differently.Why it happens: The Netlify build cache is serving a stale version, the build settings do not match the Rocket project configuration, or environment variables differ between the two environments.How to fix it:
  1. In the Netlify dashboard, trigger a “Clear cache and deploy site” to force a fresh build
  2. Verify the build command and publish directory match your project type
  3. Compare environment variables between your Rocket project and Netlify settings
  4. Check that the deployed branch matches the branch you are previewing in Rocket
Prompt to paste in Rocket chat:
The deployed site on Netlify does not match my Rocket preview. Check the build settings and verify the build command and publish directory are correct. List all environment variables the app uses so I can compare them with what's set in Netlify.
See Netlify Integration and Launch Web App.

Preview and editor issues

What you see: You made changes in Rocket chat, but the preview panel still shows the old version of your app.Why it happens: The build may not have completed yet, the preview needs a manual refresh, or there was an error during code generation that prevented the change from applying.How to fix it:
  1. Wait 1-2 minutes for the build to complete
  2. Refresh the preview panel
  3. Check the chat history for any error messages during code generation
  4. If the issue persists, use the /fix command or ask Rocket to regenerate the changes
Prompt to paste in Rocket chat:
My changes are not showing in the preview. Check if there were any errors during the last code generation. If there are issues, fix them. If the code looks correct, explain why the preview might not be updating.
See Preview.
What you see: Clicking on elements in the preview does not open the Visual Edit panel, or changes made through Visual Edit do not apply.Why it happens: Visual Edit is a web-only feature (not available on the iOS app). Additionally, some dynamically generated elements or deeply nested components may not be selectable.How to fix it:
  1. Make sure you are using Rocket on a web browser, not the iOS app
  2. Try clicking on a different, simpler element to confirm Visual Edit is active
  3. For elements that are not selectable, use the chat interface instead to describe the change you want
  4. If Visual Edit was working before but stopped, refresh the page
See Visual Edit.
What you see: Figma import fails, generates unexpected results, or you receive “rate limit” or “permission denied” errors.Why it happens: The Figma link may not have view access enabled, you may have exceeded the Figma API rate limit, or the design does not follow Rocket’s recommended design guidelines.How to fix it:
  1. In Figma, click Share and verify that “Anyone with the link” can view the file
  2. If you see a rate limit error, wait a few minutes and try again. See Rate Limit Errors for details
  3. Review the Figma Design Guidelines to ensure your design follows best practices
  4. Common design issues include ungrouped layers, components outside screen boundaries, and invisible components
Prompt to paste in Rocket chat (after a successful but incorrect import):
The Figma import generated code that does not match my design. Review the
generated components and fix the layout, spacing, and styling to match the
original Figma design more closely.
See Figma Overview, Get Your Figma URL, and Design Guidelines.

Still stuck?

If you have tried the solutions above and the problem persists, here are more ways to get help.