App Types & Tiers
Every app on LaunchMyStore has both a type and a tier. The type controls distribution and marketplace visibility; the tier controls quotas (API rate limits, supported features). They are independent — aprivate app can be on any tier; a marketplace
public app can be on free.
App types
Thetype field on the Apps row identifies the distribution model.
The enum has exactly three values: public, private, and
first-party.
There is no “custom” app type. Some marketplace UIs use the
word “custom” colloquially for
private apps that were built for a
specific merchant; the underlying enum value is private.public
The default for marketplace distribution.
- Listed in the marketplace at
/marketplace. - Discoverable via search, category browse, and editorial collections.
- Requires the standard review flow before going live (
draft→review→published). - Subject to the marketplace’s listing requirements: icon, screenshots, long description, privacy policy URL, support email.
- Install metrics (installs, uninstalls, reviews) feed into the marketplace ranking.
public when you want any LaunchMyStore merchant to be able to
discover and install your app without you preapproving them.
private
The most restricted type — invisible to the marketplace.
- Not listed anywhere in the marketplace UI.
- Installable only on the developer’s own store — the store that
created the app. There is no whitelist mechanism; any other store
attempting to install gets
404 App not found. Install via the Developer Portal’s Install on My Store button. - Skips the marketplace review queue. Installable by the owning
developer’s store immediately in any status (
draft/review/published) and fully usable there — embedded admin, app proxy, OAuth, and theme app blocks all work without marketplace publication. (Publication only matters forpublic/first-partydistribution to other merchants.) - Useful for:
- Apps written for your own store (custom integrations).
- Internal tooling that wraps the LaunchMyStore API for your organization’s store.
- To run the same code on multiple stores, publish it as a
publicapp (each of your stores then installs it from the marketplace) — private apps cannot be shared across stores.
A private app with an external
appUrl receives its first Admin API
access token the same way a public app does: installing it (Developer
Portal → Install on My Store) redirects the browser to your
/auth install handoff with a
single-use code to exchange at POST /apps/oauth/token. App Bridge
session tokens authenticate the embedded user to your backend — they
are not Admin API credentials.first-party
Apps published by LaunchMyStore itself or strategic partners.
- Surfaced in dedicated cards/collections inside the marketplace UI (e.g. “Apps by LaunchMyStore”, “Recommended for new stores”).
- Bypass the standard public review queue (vetted ahead of time).
- May have access to internal APIs not available to
publicapps — e.g. surfaces in admin areas that public apps cannot inject into. - The
Apps.typeenum stores them asfirst-party(with the hyphen); do not confuse withfirstPartyorFIRST_PARTYin code-style contexts.
first-party — the type is set by
LaunchMyStore staff during onboarding.
Choosing a type
1
Built for your own store?
Choose
private. Faster to ship, no review queue — installable
only on the developer’s own store.2
Distributing to multiple unrelated merchants?
Choose
public. Submit through the marketplace review flow once;
every approved merchant can install themselves.3
Working with the LaunchMyStore team?
first-party is granted by LaunchMyStore. You don’t pick this
yourself.App tiers
Thetier field controls the app’s API rate limit and (in some cases)
which platform features it has access to. The enum has four values:
free, basic, pro, and enterprise.
See API Rate Limits for the full
sliding-window rate-limit spec and the
X-RateLimit-* response
headers.
What each tier unlocks
Free
20 req/sec to
/api/v1/. Suited to dev stores and internal
prototypes. Webhooks count zero against the rate cap — design
around webhooks where possible.Basic
40 req/sec. Default for new public apps. Bulk endpoints
(metafields, products) work just fine at this tier for typical
sync workloads.
Pro
100 req/sec. Recommended for apps with high-frequency polling or
backfill workers. Comes with access to extended diagnostics in the
developer dashboard (function execution timings, webhook delivery
breakdowns).
Enterprise
500 req/sec. For ERP integrations and data-warehouse syncs.
Requires sales/partnership approval — contact LaunchMyStore
support.
Choosing a tier
- Start at
basicwhen publishing — this is the default. - Upgrade to
prowhen your worker logs429responses against your dev store more than once per merchant-day. - Request
enterprisefor any integration that needs to ingest hours of historical data in minutes (ERP onboarding, analytics warehouses, replatform migrations). - Use
freefor dev stores during development to keep your bills accurate to production.
Tier changes propagate within 60 seconds
The rate-limit guard caches tier lookups in-process for 60 seconds. A tier upgrade approved on the dashboard takes up to one minute before your worker sees the higher cap.Type and tier together
The two settings are independent. Examples of valid combinations:Where they are set
Both values are visible on the app’s detail page in the developer
dashboard and in the
GET /apps/developer API response.
Lifecycle interactions
Type and tier do not change the app’s lifecycle — the install/update/uninstall flow is identical for all combinations. Specifically:- All types use the same OAuth flow for granting scopes.
- All types fire webhooks with the same HMAC-signed wire format.
- All types must declare permissions in
app.json. - All types are subject to function active limits (independent of tier).
See also
App Manifest
Manifest fields that depend on app type (e.g.
permissions).API Rate Limits
Tier-based sliding-window limits and best practices.
App Lifecycle
Install, update, uninstall flow shared by all types.
App Listing
What a
public app needs to pass marketplace review.