---
title: "Kvalitetskrav ved app-gennemgang | Tajo"
description: "De krav til kvalitet, sikkerhed, UX og jura, din Stripe App skal opfylde for at bestå gennemgangen"
url: https://tajo.io/dk/docs/stripe-apps/review-requirements/
markdown: https://tajo.io/dk/docs/stripe-apps/review-requirements.md
lang: da-DK
author: "Set Noa"
author_url: https://tajo.io/dk/set-noa/
robots: noindex
---

Bed om tidlig adgang til Tajo

Indtast dit fornavn og din arbejds-e-mailadresse. Vi sender dig et link til at bekræfte din anmodning om adgang til Tajo.

# Kvalitetskrav ved app-gennemgang

[Set Noa](https://tajo.io/dk/set-noa/)

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.

Caution

**Status: planlagt, ikke bygget.** Tajo har ingen Stripe-app, så intet i dette afsnit kan installeres i dag. App-ID’er, URL’er og loginoplysninger på denne side er illustrative pladsholdere, ikke aktive endpoints.

## Overblik

Stripes app-gennemgang vurderer din app på seks nøgleområder:

1. **Gennemsigtige priser**, klar kommunikation af omkostninger
2. **App-funktionalitet**, pålidelighed og fuldstændighed
3. **Udviklerstandarder**, kodekvalitet og brug af API’et
4. **UX-kvalitet**, standarder for brugerflade og oplevelse
5. **Sikkerhed**, databeskyttelse og sikker praksis
6. **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

```typescript
// 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"
```

## 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: true` i dit manifest

```json
{
  "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:

```typescript
// 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();
  }
};
```

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:

```typescript
// 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:

- 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å:

```typescript
// 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."
```

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:

```typescript
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;
};
```

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

1. **Manglende fejlhåndtering**, appen går ned ved netværksfejl eller uventede data
2. **Utilstrækkelige indlæsningstilstande**, tomme skærme, mens data hentes
3. **Uklare priser**, priserne fremgår ikke fuldt ud af visningen
4. **For mange tilladelser**, appen beder om tilladelser, den ikke har brug for
5. **Sandbox virker ikke**, appen fungerer ikke i testtilstand
6. **Sikkerhedsproblemer**, hemmeligheder gemmes uden for Secret Store API
7. **Manglende privatlivspolitik**, ingen tilgængelig URL til privatlivspolitikken
8. **Ufuldstændig funktionalitet**, “coming soon”-funktioner eller pladsholderindhold
