Kvalitetskrav för appgranskning
Stripe granskar varje app som skickas in till marketplace mot en omfattande uppsättning kvalitetskrav. Att förstå dessa standarder innan utvecklingen sparar tid och minskar antalet granskningsiterationer.
Översikt
Stripe App-granskningen utvärderar din app inom sex nyckelområden:
- Transparent prissättning, Tydlig kommunikation av kostnader
- Appfunktionalitet, Tillförlitlighet och fullständighet
- Utvecklarstandards, Kodkvalitet och API-användning
- UX-kvalitet, Användargränssnitt och upplevelsestandarder
- Säkerhet, Dataskydd och säkra metoder
- Juridisk efterlevnad, Integritets- och regulatoriska krav
Transparent prissättning
Din app måste tydligt kommunicera alla kostnader till användare:
- Prisupplysning: All prissättning måste anges i förväg i marketplace-listningen
- Inga dolda avgifter: Användare får inte möta oväntade avgifter efter installation
- Provperiodsvill kor: Om du erbjuder en provperiod, ange tydligt varaktigheten och vad som händer efter den
- Uppgraderingsflöden: Eventuella merförsäljnings- eller uppgraderingsuppmaningar måste vara icke-påträngande och tydligt frivilliga
- Valuta: Visa priser i användarens lokala valuta när möjligt
Caution
Appar som döljer prissättning eller debiterar användare utan tydligt samtycke avvisas omedelbart.
Datum- och tidsformatering
Alla datum och tider som visas i din app måste följa Stripe Dashboard-konventioner:
- Använd användarens locale för datumformatering när tillgänglig
- Visa tider i användarens lokala tidszon
- Använd relativa tidsstämplar för nyliga händelser (t.ex. “2 timmar sedan”)
- Använd absoluta tidsstämplar för äldre händelser med fullständigt datum och tid
- Följ ISO 8601 för alla API-riktade datumfält
// Good: Use Stripe's date formatting utilitiesimport { formatDate, formatRelativeTime } from '@stripe/ui-extension-sdk/utils';
const formattedDate = formatDate(timestamp); // Locale-awareconst relativeTime = formatRelativeTime(timestamp); // "2 hours ago"Appinställningar
Om din app kräver konfiguration:
- Tillhandahåll en dedikerad Inställningsvy tillgänglig från appens viewport
- Fyll i förnuftiga standarder i förväg där möjligt
- Validera alla användarinmatningar med tydliga felmeddelanden
- Tillåt användare att uppdatera inställningar utan att installera om appen
- Bevara inställningar mellan sessioner med Stripe Secret Store API
Sandboxstöd
Din app måste fungera korrekt i Stripes sandbox (test)-läge:
- Testlägeskompatibilitet: Alla funktioner måste fungera i testläge
- Testdata: Använd realistisk testdata som demonstrerar appfunktionalitet
- Inga livedata i sandbox: Exponera aldrig produktionsdata i testläge
- Elegant hantering: Om en funktion är otillgänglig i sandbox, visa ett tydligt meddelande som förklarar varför
- Ange
sandbox_install_compatible: truei ditt manifest
{ "sandbox_install_compatible": true}Appfunktionalitet
Tillförlitlighet
- Appen får inte krascha eller frysa under normal användning
- Alla annonserade funktioner måste fungera som beskrivs
- Nätverksfel måste hanteras elegant med alternativ för nytt försök
- Appen måste förbli responsiv under bakgrundsoperationer
Fullständighet
- Inget platshållarinnehåll, “kommer snart”-funktioner eller brutna länkar
- Alla UI-element måste vara funktionella – inga döda knappar eller inaktiva kontroller
- Hjälptext och dokumentationslänkar måste lösa till giltiga sidor
- Avinstallation måste rensa alla appdata och webhooks
Prestanda
- UI måste renderas inom 3 sekunder på en standardanslutning
- Bakgrundssynkroniseringsoperationer får inte blockera UI:t
- Stora datamängder måste använda paginering eller lazy loading
- Minimera API-anrop för att undvika hastighetsbegränsning
Utvecklarstandards
API-användning
- Använd den senaste stabila versionen av Stripe API
- Följ Stripe API:s bästa metoder för paginering, felhantering och idempotens
- Överskriv inte hastighetsgränser – implementera exponentiell backoff för nya försök
- Använd webhooks för händelsedrivna uppdateringar istället för polling
Kodkvalitet
- Inga konsolfel eller varningar i produktionsbyggen
- Ta bort all debugloggning innan inlämning
- Hantera alla kantfall (tomma tillstånd, saknad data, nätverksfel)
- Följ Stripes komponentbibliotekmönster för konsekvent UI
Versionshantering
- Använd semantisk versionshantering (MAJOR.MINOR.PATCH)
- Dokumentera brytande ändringar i versionsuppdateringar
- Bibehåll bakåtkompatibilitet där möjligt
UX-kvalitet
Annonsering
- Inga annonser: Din app får inte visa annonser av något slag
- Ingen korsmarknadsföring: Marknadsför inte andra produkter eller tjänster inom app-UI:t
- Varumärkt innehåll: Visa bara din egen varumärkesidentitet, inte tredjepartsvarumärken (förutom integrationspartners som Brevo)
Språk och innehåll
- Konsekvent språk: Använd konsekvent terminologi i hela appen
- Professionell ton: Matcha Stripe Dashboards professionella, kortfattade kommunikationsstil
- Inget jargong: Undvik teknisk jargong som säljare kanske inte förstår
- Stavningskontroll: Se till att all text är fri från stavnings- och grammatikfel
- Endast engelska: All användarvänlig text måste vara på engelska för marketplace-appar
Bekräftelsedialoger
Kräv användarbekräftelse för destruktiva eller betydelsefulla åtgärder:
// Good: Confirm before destructive actionsconst handleDisconnect = async () => { const confirmed = await showConfirmation({ title: 'Disconnect Brevo Integration', message: 'This will stop syncing customer data to Brevo. You can reconnect at any time.', confirmLabel: 'Disconnect', cancelLabel: 'Cancel', destructive: true, });
if (confirmed) { await disconnectIntegration(); }};Åtgärder som kräver bekräftelse:
- Koppla ifrån integrationer
- Ta bort synkroniserad data
- Ändra inställningar som påverkar dataflödet
- Återställa konfiguration till standardvärden
Laddningstillstånd
Visa alltid laddningsindikatorer för asynkrona operationer:
// Good: Show loading state during data fetchconst CustomerSyncStatus = () => { const { data, isLoading, error } = useSyncStatus();
if (isLoading) { return <Spinner label="Loading sync status..." />; }
if (error) { return <Banner type="critical" title="Failed to load sync status"> {error.message} </Banner>; }
return <SyncStatusDisplay data={data} />;};Krav:
- Visa spinners eller skelettskärmar under dataladdning
- Inaktivera knappar under formulärinlämning
- Visa förloppsindikatorer för långvariga operationer
- Visa aldrig en tom skärm under laddning
Felmeddelanden
Tillhandahåll tydliga, åtgärdbara felmeddelanden:
// Bad: Generic error"Something went wrong"
// Good: Specific and actionable"Unable to sync customer data to Brevo. Please verify your Brevo API keyin Settings and try again."Riktlinjer för felmeddelanden:
- Förklara vad som hände på vanligt språk
- Föreslå en specifik åtgärd som användaren kan vidta för att lösa problemet
- Tillhandahåll ett sätt att försöka utföra den misslyckade operationen igen
- Logga detaljerad felinformation för felsökning (visas inte för användare)
- Inkludera felkoder för supportreferens när tillämpligt
Säkerhet
Secret Store API
Använd Stripes Secret Store API för all lagring av känsliga data:
import { createHttpClient, STRIPE_API_KEY } from '@stripe/ui-extension-sdk/http_client';
// Good: Store secrets using the Secret Store APIconst storeBrevoApiKey = async (apiKey: string) => { const stripe = createHttpClient(STRIPE_API_KEY); await stripe.apps.secrets.create({ name: 'brevo_api_key', payload: apiKey, scope: { type: 'account' }, });};
// Good: Retrieve secrets from the Secret Storeconst getBrevoApiKey = async () => { const stripe = createHttpClient(STRIPE_API_KEY); const secret = await stripe.apps.secrets.find({ name: 'brevo_api_key', scope: { type: 'account' }, }); return secret.payload;};Lagra aldrig känsliga data i:
- Local storage eller session storage
- Cookies
- URL-parametrar
- Hårdkodade värden i källkoden
- Klartextskonfigurationsfiler
Kryptografi
- Ingen anpassad kryptografi: Implementera inte dina egna krypteringsalgoritmer
- Använd Stripes inbyggda säkerhetsprimitiver (Secret Store, signeringshemligheter)
- Använd HTTPS för alla externa API-anrop
- Validera alla webhook-signaturer innan behandling
Datahantering
- Begär bara behörigheter din app faktiskt behöver
- Lagra inte Stripe-data utöver vad som är nödvändigt för funktionalitet
- Implementera datalagringspolicyer som är i linje med din integritetspolicy
- Tillhandahåll en mekanism för användare att begära databorttagning
Juridisk efterlevnad
Integritetspolicy
Din app måste ha en offentligt tillgänglig integritetspolicy som täcker:
- Vilka data din app samlar in från Stripe
- Hur data lagras, behandlas och delas
- Policyer för datalagring och -borttagning
- Användarrättigheter angående deras data
- Kontaktinformation för integritetsförfrågningar
- Efterlevnad av tillämpliga förordningar (GDPR, CCPA osv.)
Användarvillkor
- Tillhandahåll tydliga användarvillkor för din app
- Inkludera inte villkor som strider mot Stripes användarvillkor
- Ange tydligt eventuella användningsbegränsningar eller restriktioner
Regulatorisk efterlevnad
- Följ alla tillämpliga dataskyddsförordningar
- Implementera lämpliga databehandlingsavtal
- Stöd begäranden om dataportabilitet och borttagning
- Bibehåll granskningsloggar för dataåtkomst och -behandling
Tidslinje för granskningsprocessen
| Steg | Varaktighet |
|---|---|
| Första inlämning | 5-10 arbetsdagar |
| Revisionsgranskning | 3-7 arbetsdagar |
| Slutligt godkännande | 1-2 arbetsdagar |
| Publicering | Omedelbart efter godkännande |
Tip
Åtgärda all granskningsfeedback i en enda revision för att undvika flera granskningscyklar. Stripe-teamet ger specifik, åtgärdbar feedback för varje hittad fråga.
Vanliga avslagsorsaker
- Saknad felhantering, App kraschar vid nätverksfel eller oväntad data
- Otillräckliga laddningstillstånd, Tomma skärmar under datahämtning
- Oklar prissättning, Prissättning inte fullt ut upplyst i listningen
- Överdrivna behörigheter, Begär behörigheter som appen inte behöver
- Trasigt sandboxläge, App fungerar inte i testläge
- Säkerhetsproblem, Lagrar hemligheter utanför Secret Store API
- Saknad integritetspolicy, Ingen tillgänglig URL till integritetspolicy
- Ofullständig funktionalitet, “Kommer snart”-funktioner eller platshållarinnehåll