Troubleshooting

When a deploy fails or an app misbehaves, start with the logs, then check the usual suspects below. Your assistant can do all of this for you — but here's what it's looking at.

Read the logs first

get_deployment_logs returns recent build and runtime logs for an app and environment. Most deploy failures (a syntax error, a bad import, a failed migration) show up here with a clear message. Ask your assistant to “check the deployment logs” and it'll pull them.

Common issues

  • A route returns 404. The file path must match the URL: /api/foo/bar needs api/foo/bar.js. Confirm the file default-exports an object with a fetch method (see app anatomy).
  • A binding is undefined. env.DB and env.STORAGE are always on — no attach needed. Optional bindings need setup: env.CACHE/env.AI/env.EMAIL via manage_resource (action: attach), and env.PAYMENTS needs STRIPE_SECRET_KEY set (manage_app_env, action: set). See bindings.
  • “No such table” / schema errors. The migration that creates the table hasn't been applied, or you tried to use a reserved _cr_* name. See database.
  • AI calls fail with an “out of credits” error. You're on managed credits and the balance is exhausted — top up, upgrade, or set your own provider key. See AI.
  • Email isn't arriving in a preview. Expected — preview/branch deploys rewrite recipients to you and prefix [PREVIEW]. Real delivery happens on production. See email.
  • Branch behaves differently from production. Each branch uses its own separate playground database, which by default is empty (schema-only) — so missing rows are expected, not a bug. reset_playground (optionally with a branch) rebuilds it from scratch. If you turned on set_preview_data_mode (light/full), the copy can also drift from live data; reset re-seeds it. See branches & PRs.
  • Custom domain not live. DNS can take time to propagate; if your DNS is on Cloudflare, the record must be DNS only (grey cloud). See custom domains.
  • Uploading an image or font from chat “hangs” or the assistant says an approval wasn't received. This is your AI client, not Cloudrizz. Sending a binary file (a font, an image) through chat puts a large encoded blob in the tool call, and Claude/ChatGPT pauses to ask you to approve it — a prompt that appears in the app's interface, not something you can answer by typing “yes” in the message box. Click Allow on that prompt (and “always allow” for the Cloudrizz connector to stop being asked). If it keeps prompting for many files at once, ask your assistant to add them one file at a time. Plain text files (HTML, CSS, code) never trigger this.

Still stuck?

Roll back by deploying an earlier version (list_versions shows the history), or ask your assistant to compare the failing version against the last one that worked.