Kvalitetskrav ved app-gennemgang
Stripe gennemgår hver app, der indsendes til marketplace, ud fra et bredt sæt kvalitetskrav. Kender du standarderne, før du går i gang med at udvikle, sparer du tid og slipper for flere runder i gennemgangen.
Overblik
Stripes app-gennemgang vurderer din app på seks nøgleområder:
- Gennemsigtige priser, klar kommunikation af omkostninger
- App-funktionalitet, pålidelighed og fuldstændighed
- Udviklerstandarder, kodekvalitet og brug af API’et
- UX-kvalitet, standarder for brugerflade og oplevelse
- Sikkerhed, databeskyttelse og sikker praksis
- Juridisk compliance, krav til privatliv og regler
Gennemsigtige priser
Din app skal kommunikere alle omkostninger tydeligt til brugerne:
- Prisoplysning: Alle priser skal fremgå på forhånd i marketplace-visningen
- Ingen skjulte gebyrer: Brugerne må ikke møde uventede gebyrer efter installationen
- Vilkår for prøveperiode: Tilbyder du en prøveperiode, så angiv tydeligt, hvor længe den varer, og hvad der sker, når den slutter
- Opgraderingsforløb: Mersalg og opfordringer til opgradering skal være diskrete og tydeligt frivillige
- Valuta: Vis priser i brugerens lokale valuta, når det er muligt
Caution
Apps, der slører priserne eller opkræver brugerne uden klart samtykke, bliver afvist med det samme.
Formatering af dato og klokkeslæt
Alle datoer og klokkeslæt, din app viser, skal følge konventionerne i Stripe Dashboard:
- Brug brugerens lokalitet til datoformatering, når den er tilgængelig
- Vis klokkeslæt i brugerens lokale tidszone
- Brug relative tidsangivelser for nye hændelser (f.eks. “2 hours ago”)
- Brug absolutte tidsangivelser for ældre hændelser med fuld dato og klokkeslæt
- Følg ISO 8601 for alle datofelter, der vender mod API’et
// 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"App-indstillinger
Hvis din app kræver konfiguration:
- Lav en dedikeret indstillingsvisning, der kan nås fra appens viewport
- Udfyld fornuftige standardværdier på forhånd, hvor det er muligt
- Valider alle brugerinput med tydelige fejlbeskeder
- Lad brugerne opdatere indstillinger uden at geninstallere appen
- Gem indstillinger på tværs af sessioner med Stripes Secret Store API
Understøttelse af sandbox
Din app skal fungere korrekt i Stripes sandbox (testtilstand):
- Kompatibilitet med testtilstand: Alle funktioner skal virke i testtilstand
- Testdata: Brug realistiske testdata, der viser, hvad appen kan
- Ingen livedata i sandbox: Vis aldrig produktionsdata i testtilstand
- Pæn håndtering: Er en funktion ikke tilgængelig i sandbox, så vis en tydelig besked om hvorfor
- Sæt
sandbox_install_compatible: truei dit manifest
{ "sandbox_install_compatible": true}App-funktionalitet
Pålidelighed
- Appen må ikke gå ned eller fryse under normal brug
- Alle annoncerede funktioner skal virke som beskrevet
- Netværksfejl skal håndteres pænt med mulighed for at prøve igen
- Appen skal blive ved med at reagere, mens den arbejder i baggrunden
Fuldstændighed
- Intet pladsholderindhold, ingen “coming soon”-funktioner og ingen døde links
- Alle elementer i brugerfladen skal virke, ingen døde knapper eller inaktive kontroller
- Hjælpetekster og dokumentationslinks skal føre til gyldige sider
- Afinstallation skal fjerne alle appens data og webhooks helt
Ydeevne
- Brugerfladen skal vises inden for 3 sekunder på en almindelig forbindelse
- Synkronisering i baggrunden må ikke blokere brugerfladen
- Store datasæt skal bruge paginering eller lazy loading
- Hold antallet af API-kald nede, så du undgår rate limiting
Udviklerstandarder
Brug af API’et
- Brug den nyeste stabile version af Stripe API
- Følg bedste praksis for Stripe API omkring paginering, fejlhåndtering og idempotens
- Overskrid ikke rate limits, brug eksponentiel backoff, når du prøver igen
- Brug webhooks til hændelsesdrevne opdateringer i stedet for polling
Kodekvalitet
- Ingen fejl eller advarsler i konsollen i produktionsbuilds
- Fjern al debug-logning, før du indsender
- Håndter alle særtilfælde (tomme tilstande, manglende data, netværksfejl)
- Følg mønstrene i Stripes komponentbibliotek, så brugerfladen er konsistent
Versionering
- Brug semantisk versionering (MAJOR.MINOR.PATCH)
- Dokumentér brydende ændringer i versionsopdateringer
- Bevar bagudkompatibilitet, hvor det er muligt
UX-kvalitet
Reklame
- Ingen annoncer: Din app må ikke vise reklamer af nogen art
- Ingen krydspromovering: Reklamer ikke for andre produkter eller ydelser i appens brugerflade
- Brandet indhold: Vis kun dit eget brand, ikke tredjeparters brands (bortset fra integrationspartnere som Brevo)
Sprog og indhold
- Konsistent sprog: Brug den samme terminologi i hele appen
- Professionel tone: Match den professionelle og præcise tone i Stripe Dashboard
- Ingen jargon: Undgå teknisk jargon, som forhandlerne måske ikke forstår
- Stavekontrol: Sørg for, at al tekst er fri for stave- og grammatikfejl
- Kun engelsk: Al tekst, brugeren ser, skal være på engelsk i marketplace-apps
Bekræftelsesdialoger
Kræv, at brugeren bekræfter destruktive eller betydningsfulde handlinger:
// 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(); }};Handlinger, der kræver bekræftelse:
- Afkobling af integrationer
- Sletning af synkroniserede data
- Ændring af indstillinger, der påvirker datastrømmen
- Nulstilling af konfigurationen til standardværdier
Indlæsningstilstande
Vis altid en indlæsningsindikator ved asynkrone handlinger:
// 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:
- Vis spinnere eller skeletskærme, mens data hentes
- Deaktiver knapper, mens en formular sendes
- Vis fremdriftsindikatorer ved langvarige handlinger
- Vis aldrig en tom skærm under indlæsning
Fejlbeskeder
Giv klare fejlbeskeder, brugeren kan handle på:
// 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."Retningslinjer for fejlbeskeder:
- Forklar i almindeligt sprog, hvad der skete
- Foreslå en konkret handling, brugeren kan tage for at løse problemet
- Giv mulighed for at prøve den mislykkede handling igen
- Log detaljerede fejloplysninger til fejlsøgning (som ikke vises for brugerne)
- Angiv fejlkoder til brug for supporten, hvor det er relevant
Sikkerhed
Secret Store API
Brug Stripes Secret Store API til al opbevaring af følsomme 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;};Gem aldrig følsomme data i:
- Local storage eller session storage
- Cookies
- URL-parametre
- Hardkodede værdier i kildekoden
- Konfigurationsfiler i klartekst
Kryptografi
- Ingen egen kryptografi: Lav ikke dine egne krypteringsalgoritmer
- Brug Stripes indbyggede sikkerhedsprimitiver (Secret Store, signeringsnøgler)
- Brug HTTPS til alle eksterne API-kald
- Valider alle webhook-signaturer, før du behandler dem
Håndtering af data
- Bed kun om de tilladelser, din app faktisk har brug for
- Gem ikke Stripe-data ud over det, funktionaliteten kræver
- Indfør politikker for dataopbevaring, der stemmer med din privatlivspolitik
- Giv brugerne en måde at bede om sletning af data på
Juridisk compliance
Privatlivspolitik
Din app skal have en offentligt tilgængelig privatlivspolitik, der dækker:
- Hvilke data din app indsamler fra Stripe
- Hvordan data gemmes, behandles og deles
- Politikker for opbevaring og sletning af data
- Brugernes rettigheder til deres data
- Kontaktoplysninger ved spørgsmål om privatliv
- Overholdelse af gældende regler (GDPR, CCPA osv.)
Servicevilkår
- Lav klare servicevilkår for din app
- Medtag ikke vilkår, der strider mod Stripes servicevilkår
- Angiv tydeligt eventuelle begrænsninger i brugen
Regeloverholdelse
- Overhold alle gældende databeskyttelsesregler
- Indgå de nødvendige databehandleraftaler
- Understøt anmodninger om dataportabilitet og sletning
- Før revisionslog over adgang til og behandling af data
Tidsforløb for gennemgangen
| Fase | Varighed |
|---|---|
| Første indsendelse | 5-10 hverdage |
| Gennemgang af rettelser | 3-7 hverdage |
| Endelig godkendelse | 1-2 hverdage |
| Udgivelse | Straks efter godkendelse |
Tip
Ret alt feedback fra gennemgangen i én omgang, så du undgår flere gennemgangsrunder. Stripe-teamet giver konkret og handlingsrettet feedback på hvert problem, de finder.
Hyppige årsager til afvisning
- Manglende fejlhåndtering, appen går ned ved netværksfejl eller uventede data
- Utilstrækkelige indlæsningstilstande, tomme skærme, mens data hentes
- Uklare priser, priserne fremgår ikke fuldt ud af visningen
- For mange tilladelser, appen beder om tilladelser, den ikke har brug for
- Sandbox virker ikke, appen fungerer ikke i testtilstand
- Sikkerhedsproblemer, hemmeligheder gemmes uden for Secret Store API
- Manglende privatlivspolitik, ingen tilgængelig URL til privatlivspolitikken
- Ufuldstændig funktionalitet, “coming soon”-funktioner eller pladsholderindhold