Kvalitetskrav ved app-gjennomgang
Stripe går gjennom hver app som sendes inn til marketplace, opp mot et omfattende sett med kvalitetskrav. Setter du deg inn i disse kravene før du utvikler, sparer du tid og reduserer antall runder i gjennomgangen.
Oversikt
Gjennomgangen av Stripe-apper vurderer appen din på seks hovedområder:
- Transparent prising, tydelig informasjon om kostnader
- Appfunksjonalitet, pålitelighet og fullstendighet
- Utviklerstandarder, kodekvalitet og bruk av API-et
- UX-kvalitet, krav til grensesnitt og brukeropplevelse
- Sikkerhet, databeskyttelse og sikre arbeidsmåter
- Juridisk etterlevelse, personvern og regulatoriske krav
Transparent prising
Appen din må informere brukerne tydelig om alle kostnader:
- Åpen prising: All prising må oppgis på forhånd i oppføringen i marketplace
- Ingen skjulte gebyrer: Brukerne må ikke møte uventede kostnader etter installasjon
- Prøvevilkår: Tilbyr du en prøveperiode, si tydelig hvor lenge den varer og hva som skjer når den er over
- Oppgraderingsflyter: Salgsfremstøt og oppgraderingsforslag må være diskré og tydelig frivillige
- Valuta: Vis prisene i brukerens lokale valuta når det er mulig
Caution
Apper som skjuler prisen eller belaster brukerne uten tydelig samtykke, blir avvist umiddelbart.
Formatering av dato og klokkeslett
Alle datoer og klokkeslett appen din viser, må følge konvensjonene i Stripe Dashboard:
- Bruk brukerens lokalinnstilling for datoformat når den er tilgjengelig
- Vis klokkeslett i brukerens lokale tidssone
- Bruk relative tidsangivelser for nylige hendelser (for eksempel «2 timer siden»)
- Bruk absolutte tidsangivelser med full dato og klokkeslett for eldre hendelser
- Følg ISO 8601 for alle datofelt som går mot 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"Appinnstillinger
Hvis appen din krever konfigurasjon:
- Lag en egen innstillingsvisning som er tilgjengelig fra appens viewport
- Fyll inn fornuftige standardverdier der det lar seg gjøre
- Valider alt brukerne skriver inn, med tydelige feilmeldinger
- La brukerne endre innstillinger uten å installere appen på nytt
- Ta vare på innstillingene mellom økter med Secret Store API i Stripe
Støtte for sandkasse
Appen din må fungere riktig i Stripes sandkassemodus (testmodus):
- Kompatibilitet med testmodus: Alle funksjoner må fungere i testmodus
- Testdata: Bruk realistiske testdata som viser hva appen kan
- Ingen live-data i sandkassen: Eksponer aldri produksjonsdata i testmodus
- Elegant håndtering: Er en funksjon utilgjengelig i sandkassen, vis en tydelig melding om hvorfor
- Sett
sandbox_install_compatible: truei manifestet ditt
{ "sandbox_install_compatible": true}Appfunksjonalitet
Pålitelighet
- Appen må ikke krasje eller henge under normal bruk
- Alle funksjoner du reklamerer for, må fungere som beskrevet
- Nettverksfeil må håndteres elegant, med mulighet for å prøve på nytt
- Appen må forbli responsiv mens den kjører operasjoner i bakgrunnen
Fullstendighet
- Ingen plassholderinnhold, «kommer snart»-funksjoner eller ødelagte lenker
- Alle elementer i grensesnittet må fungere, ingen døde knapper eller inaktive kontroller
- Hjelpetekster og dokumentasjonslenker må peke til sider som finnes
- Avinstallering må fjerne alle appdata og webhooks på en ryddig måte
Ytelse
- Grensesnittet må tegnes opp innen 3 sekunder på en vanlig tilkobling
- Synkronisering i bakgrunnen må ikke blokkere grensesnittet
- Store datamengder må bruke paginering eller lazy loading
- Hold antallet API-kall nede, slik at du unngår ratebegrensning
Utviklerstandarder
Bruk av API-et
- Bruk den nyeste stabile versjonen av Stripe API
- Følg beste praksis for Stripe API når det gjelder paginering, feilhåndtering og idempotens
- Ikke overskrid ratebegrensningene, bruk eksponentiell backoff ved nye forsøk
- Bruk webhooks for hendelsesdrevne oppdateringer i stedet for polling
Kodekvalitet
- Ingen feil eller advarsler i konsollen i produksjonsbygg
- Fjern all feilsøkingslogging før du sender inn
- Håndter alle spesialtilfeller (tomme tilstander, manglende data, nettverksfeil)
- Følg mønstrene i Stripes komponentbibliotek for et konsistent grensesnitt
Versjonering
- Bruk semantisk versjonering (MAJOR.MINOR.PATCH)
- Dokumenter bruddendringer i versjonsoppdateringene
- Behold bakoverkompatibilitet der det lar seg gjøre
UX-kvalitet
Reklame
- Ingen annonser: Appen din må ikke vise reklame av noe slag
- Ingen kryssalg: Ikke reklamer for andre produkter eller tjenester i appens grensesnitt
- Merkevareinnhold: Vis bare din egen merkevare, ikke tredjeparters (med unntak av integrasjonspartnere som Brevo)
Språk og innhold
- Konsistent språk: Bruk samme terminologi gjennom hele appen
- Profesjonell tone: Match den profesjonelle, konsise kommunikasjonsstilen i Stripe Dashboard
- Ingen sjargong: Unngå teknisk sjargong som selgerne kanskje ikke forstår
- Stavekontroll: Sørg for at all tekst er fri for skrive- og grammatikkfeil
- Kun engelsk: All tekst brukerne ser, må være på engelsk i marketplace-apper
Bekreftelsesdialoger
Krev at brukeren bekrefter destruktive eller viktige 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 som krever bekreftelse:
- Koble fra integrasjoner
- Slette synkroniserte data
- Endre innstillinger som påvirker dataflyten
- Tilbakestille konfigurasjonen til standardverdier
Lastetilstander
Vis alltid en lasteindikator for asynkrone operasjoner:
// 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 skjelettskjermer mens data lastes
- Deaktiver knapper mens et skjema sendes inn
- Vis fremdriftsindikatorer for operasjoner som tar lang tid
- Vis aldri en blank skjerm under lasting
Feilmeldinger
Gi tydelige feilmeldinger brukeren 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 feilmeldinger:
- Forklar hva som skjedde, i et enkelt språk
- Foreslå en konkret handling brukeren kan gjøre for å løse problemet
- Gi en måte å prøve den mislykkede operasjonen på nytt
- Logg detaljert feilinformasjon for feilsøking (som ikke vises til brukerne)
- Ta med feilkoder som support kan bruke, der det er relevant
Sikkerhet
Secret Store API
Bruk Stripes Secret Store API til all lagring av sensitive 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;};Lagre aldri sensitive data i:
- Local storage eller session storage
- Informasjonskapsler
- URL-parametere
- Hardkodede verdier i kildekoden
- Konfigurasjonsfiler i klartekst
Kryptografi
- Ingen egen kryptografi: Ikke lag dine egne krypteringsalgoritmer
- Bruk de innebygde sikkerhetsprimitivene i Stripe (Secret Store, signeringshemmeligheter)
- Bruk HTTPS for alle eksterne API-kall
- Valider alle webhook-signaturer før du behandler dem
Databehandling
- Be bare om tillatelsene appen din faktisk trenger
- Ikke lagre Stripe-data utover det funksjonaliteten krever
- Innfør retningslinjer for lagringstid som samsvarer med personvernerklæringen din
- Gi brukerne en måte å be om sletting av data på
Juridisk etterlevelse
Personvernerklæring
Appen din må ha en offentlig tilgjengelig personvernerklæring som dekker:
- Hvilke data appen din henter fra Stripe
- Hvordan dataene lagres, behandles og deles
- Retningslinjer for lagring og sletting av data
- Brukernes rettigheter til egne data
- Kontaktinformasjon for spørsmål om personvern
- Etterlevelse av gjeldende regelverk (GDPR, CCPA og lignende)
Vilkår for bruk
- Lag tydelige vilkår for bruk av appen din
- Ikke ta med vilkår som er i strid med Stripes egne vilkår
- Si tydelig fra om eventuelle begrensninger i bruken
Regulatorisk etterlevelse
- Etterlev alt gjeldende regelverk om databeskyttelse
- Innfør nødvendige databehandleravtaler
- Støtt forespørsler om dataportabilitet og sletting
- Før revisjonslogg over tilgang til og behandling av data
Tidslinje for gjennomgangen
| Trinn | Varighet |
|---|---|
| Første innsending | 5-10 virkedager |
| Gjennomgang av revidert versjon | 3-7 virkedager |
| Endelig godkjenning | 1-2 virkedager |
| Publisering | Umiddelbart etter godkjenning |
Tip
Ta hånd om alle tilbakemeldingene fra gjennomgangen i én og samme revisjon, slik at du unngår flere runder. Stripe-teamet gir konkrete tilbakemeldinger du kan handle på, for hvert problem de finner.
Vanlige grunner til avvisning
- Manglende feilhåndtering, appen krasjer ved nettverksfeil eller uventede data
- For dårlige lastetilstander, blanke skjermer mens data hentes
- Uklar prising, prisen er ikke oppgitt fullt ut i oppføringen
- For mange tillatelser, appen ber om tillatelser den ikke trenger
- Ødelagt sandkassemodus, appen fungerer ikke i testmodus
- Sikkerhetsproblemer, hemmeligheter lagres utenfor Secret Store API
- Manglende personvernerklæring, ingen tilgjengelig URL til personvernerklæringen
- Ufullstendig funksjonalitet, «kommer snart»-funksjoner eller plassholderinnhold