BetaMaShop is in public beta. We improve it continuously, and your feedback shapes what comes next.

Troubleshooting

HelpEnglish· 7 min read· Updated July 01, 2026

Fix the common failures in MaShop: publishing needs a paid plan (402 UPGRADE_REQUIRED), an expired Supabase connection (412), the Free deploy quota of 3 per day, a missing Netlify connection, and running out of credits mid generation.

How-to guide.

This page maps the errors you hit most often in MaShop to the exact message you see, the real cause, and the fix. Each row quotes the message the code actually returns. Work down the table of contents to the symptom you have, or read the sections in order. Every failure here is recoverable; none of them lose your work.

Two rules make MaShop failures easier to reason about. First, provisioning and deploying are resumable: an interrupted run continues from the last recorded stage instead of starting over. Second, deploying to your own Netlify and Supabase is free on every plan, while publishing (the first full provision) requires a paid plan. Keep those two apart and most of the messages below explain themselves.

Publishing says you need a paid plan

You clicked Publier (Publish) in the deploy modal or ran the first provision, and it stopped immediately. The publish route checks your plan before it touches any infrastructure.

The provision route returns HTTP 402 with this body when your account is not on Pro or Max:

{
 "error": "La publication nécessite un plan payant.",
 "code": "UPGRADE_REQUIRED"
}

Publishing creates real infrastructure on your own GitHub, Supabase, and Netlify accounts, so it is gated to paid plans. Super admin accounts are exempt; every other account must be on Pro or Max.

Publishing and deploying are not the same action

Publishing (Publier) runs the full first-time provision: Supabase project, database schema, GitHub repo, code push, first Netlify build. That is the paid action. A plain redeploy of an already-linked project through Déployer (Deploy) is free on every plan, subject only to the daily quota below. If you only need to ship a new build, use Deploy, not Publish.

Fix: upgrade to Pro or Max, then reopen the deploy modal and publish again. See Plans for what each tier includes and Manage your subscription to upgrade.

Reconnect Supabase to publish (412)

Publishing stopped and the modal asked you to reconnect Supabase. Supabase access tokens are short-lived, around a day, so a token you granted yesterday can be expired by the time you publish. MaShop tries to refresh the stored token automatically; when it cannot, it stops rather than fire a raw provider error at you.

The provision runner returns HTTP 412 with this state when the Supabase connection cannot be refreshed:

{
 "outcome": "error",
 "state": {
 "stage": "error",
 "error": {
 "stage": "idle",
 "message": "Reconnectez Supabase pour publier.",
 "retryable": false
 }
 }
}

The Publish modal turns that into a plain-language prompt. Any raw message that mentions unauthorized, 401, or reconnect maps to: Votre connexion Supabase a expiré. Reconnectez Supabase puis réessayez. (Your Supabase connection has expired. Reconnect Supabase then try again.)

Fix: reconnect Supabase from the deploy modal, then click Réessayer (Retry). The state machine resumes from the last completed stage, so you do not re-create the Supabase project or repush your code. See Connect GitHub and Supabase for the connection flow.

No Supabase organization

MaShop creates your merchant project inside one of your existing Supabase organizations. If your Supabase account has none, provisioning stops with Merchant Supabase account has no organization. Ask the merchant to create one at supabase.com/dashboard/projects. Create an organization in your Supabase dashboard, then publish again.

The Free deploy limit is reached

A deploy was refused with a quota toast. The Free plan is capped at 3 deploys per day; Pro and Max are unlimited. The cap is enforced atomically inside the reserve_deploy_slot database function, which checks the count and increments it in one locked transaction, so two near-simultaneous deploys cannot both slip past the limit.

The deploy route returns HTTP 402 and the modal shows this toast:

Limite de 3 déploiements par jour atteinte. Réessaie dans 24h ou passe à un plan supérieur.

The window is a rolling 1 day that resets on your next deploy after 24 hours have passed since the window opened. A 402 here is not a transient error, so the modal closes instead of arming a retry loop; retrying would only hit the same limit again.

PlanDeploy quotaOn exceeding
Free3 per dayHTTP 402, quota toast, retry in 24h or upgrade
ProUnlimitedNever blocked by quota
MaxUnlimitedNever blocked by quota

Fix: wait for the daily reset, or upgrade to Pro or Max for unlimited deploys. See Deploy on Netlify for the deploy flow and Plans for the tiers.

Your first publish deploy does not count

The first Netlify build MaShop triggers during publishing is provisioned as a courtesy and does not draw against your daily Free quota. Only the deploys you trigger yourself afterward count.

Netlify is not connected

A deploy failed before any build started because MaShop has no Netlify token for your account. Deploying ships to your own Netlify site, so MaShop needs your Netlify connection first.

The deploy helper returns HTTP 400 with this body when the Netlify OAuth token is missing:

{
 "error": "Netlify non connecté. Connectez votre compte Netlify d'abord.",
 "code": "NETLIFY_NOT_CONNECTED"
}

If the token exists but cannot be decrypted, you get HTTP 500 with Netlify token decryption failed. Reconnect your Netlify account. instead. Both mean the same practical thing: MaShop needs a fresh Netlify connection.

Fix: connect (or reconnect) Netlify from the deploy modal, then deploy again. See Deploy on Netlify.

GitHub is not linked or not connected

Deploying needs two GitHub facts: a repository linked to your project, and a valid GitHub token so MaShop can add a deploy key. Two distinct messages tell you which one is missing.

Message and codeCauseFix
GitHub repo non lié. Connecte GitHub et crée un projet d'abord. (GITHUB_NOT_LINKED, HTTP 400) The project row has no github_repo value, so MaShop has nowhere to deploy from. Connect GitHub and let MaShop create or link a repository, then deploy again.
GitHub non connecté. Reconnecte ton compte GitHub. (GITHUB_NOT_CONNECTED, HTTP 400) A repo is linked, but there is no usable GitHub token to add the Netlify deploy key to it. Reconnect GitHub from the deploy modal, then deploy again.
GitHub OAuth not connected. The merchant must reconnect GitHub before the template can be pushed. Raised during publishing when MaShop reaches the code-push stage with no GitHub token. Reconnect GitHub, then click Réessayer. The push stage resumes without re-creating the repo.

See GitHub and your repository and Connect GitHub and Supabase.

Publishing failed at a specific stage

Publishing runs a sequence of stages on your own accounts, and the Publish modal shows which one failed. The modal never shows the raw infrastructure error; it maps the underlying message to plain guidance and keeps the raw text in the browser console for debugging. These are the mappings it uses.

Stage that failedWhat the modal tells you
Supabase auth (unauthorized, 401, or reconnect)Votre connexion Supabase a expiré. Reconnectez Supabase puis réessayez.
Storage init (bucket)Erreur lors de l'initialisation du stockage. Réessayez dans un instant.
Database schema (migration, schema, or sql)Échec de l'application du schéma de base de données. Réessayez.
GitHub (repo or repository)Erreur côté GitHub. Vérifiez votre connexion GitHub puis réessayez.
Netlify (deploy or build)Échec du déploiement. Réessayez.
Anything elseUne erreur est survenue pendant la publication. Réessayez.
Retry resumes, it does not restart

Every provisioning stage is idempotent. When you click Réessayer, MaShop reads the recorded stage and continues from there. It only creates the Supabase project once, only pushes your code once, and skips any stage already done. A failure marked non-retryable (invalid, forbidden, or unauthorized in the raw message) is the one case where Retry will not clear on its own; fix the connection first, then retry.

You ran out of credits mid generation

An AI message stopped and the run was rolled back. Generation reserves credits before it runs; when your balance cannot cover the estimate and you are not within the trial budget, the run is refused rather than half-completed.

The chat stream emits an error with code INSUFFICIENT_CREDITS, and the workspace shows this toast:

Crédits épuisés. Recharge pour continuer à générer.

The assistant message is removed so you are not billed for a run that did not happen. If you are on the free trial and still under its cap, MaShop runs the generation in trial mode instead of blocking you; the block only appears once the trial budget is spent or you are on a plan whose balance is empty.

Fix: top up your balance or move to a plan with more monthly credits, then send your message again. See Top-ups, How credits work, and Plans.

You are being rate limited

A request was refused with a too-many-requests message. MaShop rate-limits per client IP to stop runaway clients. The limits differ by endpoint.

ActionLimitMessage (HTTP 429)
Deploy (/api/deploy-netlify)5 per 10 minutes per IPTrop de déploiements. Réessayez dans quelques minutes.
Publish and provision polling40 per minute per IPTrop de requêtes. Réessayez dans une minute.

Fix: wait the stated window and try once. The publish and provision limit is generous because the modal polls every few seconds; if you hit it, you likely have multiple tabs polling the same project. Close the extra tabs.

The deploy status stays stuck on building

A deploy triggered fine but the workspace kept showing a building state. MaShop never marks a deploy live on its own; it waits until Netlify reports the build is ready. The deploy route runs a short server-side check right after triggering, and if the build has not finished within that window, the row stays in its building state and the client keeps polling to finish it.

Fix: leave the workspace tab open. The status finalizes to live or failed once Netlify confirms the build. If Netlify reports a failed build, the modal surfaces the build error message; open the Netlify build log for the full detail. See Deploy overview.

Still stuck

If none of the messages above match what you see, capture two things before you reach out: the exact text of the error or toast, and the stage the Publish modal was on when it stopped. Both narrow the cause fast. The FAQ covers questions that are not errors, and the glossary defines the terms used here.

Your work is safe

None of these failures delete your project, your code, or your database. Provisioning resumes from where it stopped, deploys can be retried, and a refused generation is rolled back so you are not charged for it. Your prompts and generated code are not sent to OpenAI or Anthropic.

troubleshootinghelperrors
Was this page helpful?
Your feedback is anonymous.