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:

  1. Transparent prissättning, Tydlig kommunikation av kostnader
  2. Appfunktionalitet, Tillförlitlighet och fullständighet
  3. Utvecklarstandards, Kodkvalitet och API-användning
  4. UX-kvalitet, Användargränssnitt och upplevelsestandarder
  5. Säkerhet, Dataskydd och säkra metoder
  6. 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 utilities
import { formatDate, formatRelativeTime } from '@stripe/ui-extension-sdk/utils';
const formattedDate = formatDate(timestamp); // Locale-aware
const 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: true i 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 actions
const 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 fetch
const 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 key
in 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 API
const 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 Store
const 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

StegVaraktighet
Första inlämning5-10 arbetsdagar
Revisionsgranskning3-7 arbetsdagar
Slutligt godkännande1-2 arbetsdagar
PubliceringOmedelbart 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

  1. Saknad felhantering, App kraschar vid nätverksfel eller oväntad data
  2. Otillräckliga laddningstillstånd, Tomma skärmar under datahämtning
  3. Oklar prissättning, Prissättning inte fullt ut upplyst i listningen
  4. Överdrivna behörigheter, Begär behörigheter som appen inte behöver
  5. Trasigt sandboxläge, App fungerar inte i testläge
  6. Säkerhetsproblem, Lagrar hemligheter utanför Secret Store API
  7. Saknad integritetspolicy, Ingen tillgänglig URL till integritetspolicy
  8. Ofullständig funktionalitet, “Kommer snart”-funktioner eller platshållarinnehåll

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

AI-assistent

Hej! Fråga mig om dokumentationen.

Börja gratis med Brevo