Submitting your app
Send your app for review from the developer portal. It keeps your draft as you go, and one press sends it to the review queue.
From the developer portal
- App detailsName, category, tagline, description, data note and the plans it works on. The support email comes from your developer profile.
- Media and codeA cover, up to 8 screenshots with alt text, the app icon, and your app's code: connect GitHub and pick the repository and branch (required).
- PricingFree, one-time or monthly, and the price. You see what you keep at the 80/20 split.
- Customization and this updateWhat an owner's sentence may change (test a sentence to see what would change), the version number you propose and, from the second version on, the update notes.
- Review checklistConfirm the six promises, then press Submit for review.
Open it at Submit an app. The form saves as you go.
Your app's code comes from GitHub
There is no ZIP to upload. Under App code on the Media step, connect GitHub, pick the repository and pick a branch. The repository has ezystudio-app.json at the top and follows the rules in The bundle.
- When you pick the branch, we check its latest commit right away, so a missing manifest, a file an app may not ship, a secret or a repository that is too big shows up there, with the reason. After a push, press Check again.
- When you submit, we freeze the branch's latest commit. We keep a copy of that commit: it is what reviewers test and what customers install, whatever you push afterwards. The next version takes the newest commit when you submit it.
- There is no demo link to add. We build a test site from the frozen commit and host the preview ourselves.
Every update says what changed
Customers have their own copy of your app, often customised. When they update, their AI applies your changes to their copy. So from the second version on, the Customization step asks for three notes:
| Field | Who reads it | Limit |
|---|---|---|
What's new changelog | Customers, in your listing's changelog. Optional on the first version. | 2,000 characters |
What customers might lose customerImpact | Customers, before they update: removed features, changed or deleted data, breaking changes. Or tick “Nothing is removed or changed in a way customers lose” (customerImpactNone). | 2,000 characters |
Update instructions for the AI aiUpdateNotes | The AI that applies the update: what changed since the previous version, data migrations, files moved or renamed, and how to carry each customer's changes over. | 8,000 characters |
You also propose the version number (1.2 or 1.2.3). It must be higher than the live version, or submit answers 422 E_DRAFT_INCOMPLETE. The reviewer who publishes it confirms the number, or sets another one, when it goes live.
The six promises
Every submission confirms all six. Missing any answers 422 E_ATTESTATIONS_INCOMPLETE with the missing ones in meta.missing.
| Promise | Code | What you confirm |
|---|---|---|
| Works out of the box | works_out_of_box | Installs and runs with no setup beyond the one-sentence customization. |
| No hidden fees | no_hidden_fees | The listed price is the only price. Nothing extra inside the app. |
| Accessible | accessible | Readable contrast, works with a keyboard, alt text on every image. |
| Handles user data properly | handles_data | Stores only what it needs, and says what it keeps and why. |
| Listing is honest | honest_listing | Screenshots and description show what the app really does. |
| Support email set | support_set | Buyers can reach you at your support email. |
After you submit
- You get a reference like
SUB-1042and an email (“{app} {version} was submitted for review”). A person reviews it within 7 business days, and we email you at every step. - We build a test site of your version straight away, with its own database: your migrations run on it and it is filled with sample customers and your
sampleData. A build or sample data problem shows up on your submission before a reviewer looks. - The draft is locked while the submission is
queuedorin_review. Saving answers409 E_APP_IN_REVIEW. - Withdraw (
POST …/apps/{appId}/withdraw, or in the portal) to make changes. The version goes back to draft; sending it again starts a new place in the queue. - If a reviewer asks for changes, fix them and submit again. A resubmission keeps your place in line: same reference, same target date. Each ask is ticked off as soon as your draft changes the part it points at.
Limits
| What | Limit |
|---|---|
| Create an app | 30 an hour per developer org |
| Submit and withdraw (together) | 10 an hour per developer org |
| Upload URLs for images (presign) | 120 an hour per developer org |
| GitHub repository and branch lists | 60 a minute per person |
| Every developer API call | 200 a minute per IP address |
Errors you may see
| Code | Status | Meaning |
|---|---|---|
E_FORBIDDEN | 403 | Your role in the developer org doesn't allow this. |
DEVELOPER_NOT_APPROVED | 403 | Your developer application is not approved yet. |
E_DEVELOPER_SUSPENDED | 403 | This developer account is suspended. |
E_APP_NOT_FOUND | 404 | No such app in your developer org. |
E_APP_IN_REVIEW | 409 | A submission is open. Withdraw it first to make changes. |
E_NO_DRAFT | 409 | There is no draft to submit. After a reviewer asks for changes, edit the listing or push a new commit first. |
E_NOTHING_TO_WITHDRAW | 409 | Nothing is waiting for review. |
E_SUBMISSION_STATE_CHANGED | 409 | Someone else changed this submission. Refresh and try again. |
E_DRAFT_INCOMPLETE | 422 | The draft is missing something, such as the repository (repo) or an update note. meta.problems lists each one with its step and field. |
E_ATTESTATIONS_INCOMPLETE | 422 | Not all six promises were confirmed. |
E_INVALID_CATEGORY | 422 | categorySlug isn't one of the App Store categories. |
E_PRICE_BELOW_MINIMUM | 422 | The price is under the minimum paid app price. The message gives the minimum; raise the price or make the app free. |
E_VERSION_TAKEN | 422 | That version number is already used by this app. |
E_INVALID_UPLOAD | 422 | A file type, size or key that isn't allowed. |
E_TOO_MANY_MEDIA | 422 | Up to 8 screenshots, one cover and one icon. |
E_INVALID_PRICING | 422 | Only EzyStudio's own apps can use the included pricing model. |
E_BUNDLE_INVALID | 422 | The branch's latest commit breaks the install rules, when you pick the branch or at submit. The message gives the reason; meta.bundle has its code and path (bad_sample_data when it's your sample data file). |
E_GITHUB_BRANCH_MISSING | 422 | The branch has no commits on GitHub (it was deleted or is empty). Pick another branch. |
E_GITHUB_INSTALLATION_NOT_FOUND | 422 | That GitHub connection isn't your developer team's any more. Connect GitHub again. |
E_GITHUB_UPSTREAM | 502 | GitHub didn't answer. Try again in a moment. |
E_DRAFT_CHANGED | 409 | The draft changed while it was being submitted. Submit it again. |