Troubleshooting
Common symptoms in plain terms: what the message means, what caused it, and where the fix lives. Each entry links to the doc that owns the detail.
Most of what follows is a setting, a wait, or one follow-up prompt — not a support ticket.
Credits and quota
Out of credits in the middle of a plan
A red toast reads Out of credits, with your usage and the date your allowance resets. The plan card turns amber, names how many steps finished, and offers Add credits and Retry. On a paid plan a second button, Top-up, appears beside them. Steps that already ran are finished and stay that way — add credits, press Retry on the stopped step, and the chain carries on from there. See How credits work.
A top-up is refused
Three refusals, three different causes:
- Top-up credits are available on paid plans. Upgrade to buy credits. — buying is limited to paid plans. Credits already in your wallet still spend normally on any plan.
- That would pass this month's top-up limit. — the monthly ceiling on card purchases, which counts payments still settling. Converting Showcase balance is not affected by it.
- Enter a whole number of credits to buy. — credits are bought whole; drop the decimals.
A fourth, Not enough account balance for this purchase., comes from converting Showcase balance rather than buying with a card: only withdrawable balance counts, so earnings still inside their 14-day hold cannot be converted yet.
"Too many requests" or "Too many suspicious prompts"
Too many requests. Wait a moment and try again. is a rate limit on one action — publishing, exporting, adding a domain — not a lock on your account. Wait, then repeat it; nothing was lost. A different toast, Too many suspicious prompts detected. Try again later., means several prompts in a row read as attempts to extract the platform's own instructions rather than build something — rephrase around what you want built. Per-action limits are in Limits at a glance.
Runs and plans
A run ends in "Build issues"
The badge reads Build issues and an amber panel names each finding and its file. The panel's first line tells you which kind of problem it is: the code will not compile yet, a page returned a server error when it was opened, or a check the step promised did not pass. One finding is not a breakage at all — an AI token reachable from the browser means the app works perfectly and is also handing a credential to every visitor. Move the model call into a route handler, and rotate the token in Settings → AI; see AI.
On an ordinary run there is no retry button — the code was written and saved, so re-running the same prompt would only redo work that already exists. Recover with a follow-up prompt describing the fix, or open the preview and use Resolve with AI. Both are new runs and both are charged. See Understanding AI runs.
On a step inside a plan it works the other way round: that step does get Retry, because a follow-up prompt cannot restart the steps waiting behind it. See the next section.
A plan stopped part-way through
The plan card says the phase failed or has build issues — phase is the label for a group you reviewed — and the remaining steps sit at Pending. A plan runs its steps in order and refuses to build on top of a broken one, so nothing after it started. The stopped step opens by itself; read the reason there, then press Retry on it: it re-runs in place, and when it passes the rest of the plan carries on by itself. See Plans for big prompts.
Previews
The web preview will not start, or crashed
A first start installs dependencies and takes 30–60 seconds; later starts are quicker. If the panel shows Dev server crashed, your app's own code failed to boot, and the error output is printed underneath. Press Restart once the cause is fixed; if it repeats, send a follow-up prompt or use Resolve with AI. See Live preview.
The status badge stopped updating
After three minutes the panel stops polling and leaves the badge wherever it was. That is a deadline on the tracking, not a crash — a slow first build may still come up. Reload the page or send a prompt and tracking resumes.
The phone preview stopped on its own
The phone preview stops after 30 minutes idle, and always after 4 hours. Idle counts from your last action — starting it, checking its status, reloading — not from the app running on the handset, so a phone left open all afternoon still goes idle. Press Start preview and rescan the QR code. A crash reads The bundler stopped. instead; see Preview on your phone.
Mobile builds
"Publish the web app first"
The build is refused with Publish the web app first — the mobile build needs its live URL as the API base. A store build runs outside your workspace, so it can never reach a preview — it needs a real public address to call. Publish the web app once, then build. See Publish & deploy.
A store build sits in the queue
A row can sit at Sent to Expo or Building on Expo for a long time. Most of that is the build service's own queue — other customers' traffic, not work on your project — and it can pass an hour. We stop tracking after two hours; the build keeps running and Build log still reaches it. No duration is promised. See Store builds.
Android says the app was not installed
The install dialog warns it in advance: Android will ask you to allow installs from this source. If an older copy is already installed, uninstall it first. Android refuses an install signed with a different key than the copy already on the phone, and a rebuild under a different account always has a new key. Uninstall the old app, then scan again.
Domains and export
A custom domain stays on "Waiting for DNS"
Three causes, in order of likelihood: the record has not spread yet (minutes to hours, at your registrar), it does not match what the panel shows, or the project is not published — a domain points at a live deployment, and without one there is nothing to point at. Copy the values from the panel rather than retyping them, then press Verify. An unverified claim is deleted after 72 hours, releasing the hostname. That domain is already claimed. for a name that is yours means an earlier claim still holds it, under that same 72 hours. See Custom domains.
Export says the repository already exists
The dialog reports Repo "my-app" already exists on your GitHub account. and offers alternative names. An export never overwrites: a repository of that name is already on your account, whether or not you created it from here. Take one of the suggestions or type your own. See Export your source code.
Data and files
An image I added does not show
Open the image's own address in a new tab — if your app is at myapp.poleved.app, that is myapp.poleved.app/logo.png. What happens next tells you which of three things it is.
If it lands on the sign-in page, the file is fine and your login rule is blocking it. A rule that protects every page also blocks the files in public/ unless it is told to skip them. Ask in a prompt: "my middleware is blocking files in public/ — exclude image and font extensions from the matcher, keep pages protected." This one is worth knowing because it breaks the image for signed-in visitors too, so nothing about being logged in makes it look any better.
If it says 404, the file is not in the running app. Either it was never added to public/, or the version you have published is older than the run that added it — publish again.
If it opens fine but still looks wrong on the page, the file is reaching the browser and the problem is the picture itself: a square app icon with the name written inside it will look like a smudge in a 40-pixel corner, no matter how good the file is. Ask for a plain mark without text, or for a larger slot.
After a run, the platform checks this for you and says so in the amber Build issues panel — see AI runs.
An external database tool cannot connect
Your project has two connection strings and only one works from your machine: the Host URL, under the block headed Connection details (host network — DBeaver / TablePlus / psql). The Container URL resolves only inside the platform's own network, so it fails everywhere else. See Your project database.
An attachment is rejected
Three messages, three causes. Unsupported file type. means the format is outside the allow-list. File too large (max 10 MB). is the per-file cap. Attachment storage is full (10 MB total per project). counts every attachment still held on that project, so the composer can be empty and the project still full — delete old ones, or wait for the 30-day cleanup. See Attaching files to a prompt.
A file uploaded by someone using your app disappears after you publish
Your app is writing files to disk instead of using storage. Every publish starts a fresh container, so anything written to disk goes with the old one — which is why the upload looks like it worked right up until the next deploy. Turn on Settings → Storage and ask the AI to use lib/storage.ts. See File uploads in your app.
An upload from your app is rejected
Storage is full means the project hit its 10 MB total — delete files in Settings → Storage. File too large is the per-file cap, measured after compression. Files of type … are not accepted means the format is outside the allow-list (SVG is excluded on purpose). See File uploads in your app.
An uploaded file saves but does not display
Storage may have no public address connected yet. Settings → Storage says so at the top when that is the case; it is an operator setup step, not something wrong with your code.
Payments
A checkout stays pending, or the payment failed
The Status column under Receipts shows the payment provider's own word: pending while it waits for you to complete the transfer, paid once it clears, failed or expired if it did not. Bank transfers and some e-wallets settle a few minutes after you pay, so a fresh pending is normal — refresh instead of paying twice. A failed or expired row is finished; start a new checkout from Pricing. See Plans & billing.
A promo code will not apply
Four refusals, and each names which limit it hit rather than saying "invalid":
- That promo code is not recognised. — the code does not exist. Casing and surrounding spaces are not the cause; those are normalised before the code is looked up.
- That promo code is no longer valid. — it is outside its window. A code that has not started yet gives the same answer, because from outside there is no difference worth telling you about.
- That promo code does not apply to this plan. — it is scoped to particular plans, to monthly or annual only, or to first-time payments. Switching the cycle toggle is worth trying before assuming the code is dead.
- That promo code has reached its limit. — either its overall limit is reached, or you have already used it as many times as it allows per person. The message does not distinguish the two, because from your side there is nothing different to do about them.
If the field is missing entirely, the pricing service could not be reached; the page falls back to showing the list price, and a code cannot be entered until it recovers.
The price on the card is not the price I was charged
It should be, to the rupiah. What the card shows beside the dollar price is an approximation — the exact rupiah amount is worked out at checkout from the exchange rate in force at that moment, and both figures are stored on the receipt. So a receipt from last month keeps its own rate and does not move when the rate does.
If the checkout window and the card disagree by more than rounding, that is worth reporting.
Still stuck?
Use Send feedback — the floating button in the corner of every page — and include three things: what you were doing, the project name, and roughly when it happened. That is usually enough to find the run.
There is no live chat. Feedback goes to a queue a person reads, so a reply takes hours or days rather than minutes. If you are blocked, say so.