Beantrage frühzeitigen Zugang

Gib deinen Vornamen und eine E-Mail-Adresse oder Telefonnummer an. Wir melden uns mit den Details zum Tajo-Zugang bei dir.

App-Manifest-Referenz

Die Manifest-Datei stripe-app.json ist die zentrale Konfiguration deiner Stripe App. Sie deklariert die Identität deiner App, ihre Berechtigungen, UI-Ansichten, Sicherheitsrichtlinien und das Verhalten nach der Installation.

Vollständiges Manifest-Beispiel

{
"id": "com.tajo.brevo-integration",
"version": "1.2.0",
"name": "Tajo for Brevo",
"icon": "./assets/icon.png",
"distribution_type": "public",
"sandbox_install_compatible": true,
"stripe_api_access_type": "oauth",
"allowed_redirect_uris": [
"https://tajo.io/stripe/callback",
"https://tajo.io/stripe/oauth/complete"
],
"permissions": [
{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
},
{
"permission": "customer_write",
"purpose": "Update customer metadata with Brevo sync status"
},
{
"permission": "charge_read",
"purpose": "Access payment history for Brevo event tracking"
},
{
"permission": "product_read",
"purpose": "Sync product catalog to Brevo for personalized campaigns"
},
{
"permission": "event_read",
"purpose": "Subscribe to real-time events for Brevo automation triggers"
},
{
"permission": "invoice_read",
"purpose": "Track invoice lifecycle events in Brevo"
}
],
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.customer.list",
"component": "CustomerListView"
},
{
"viewport": "stripe.dashboard.home.overview",
"component": "OverviewView"
},
{
"viewport": "stripe.dashboard.drawer.default",
"component": "DrawerView"
},
{
"viewport": "stripe.dashboard.settings",
"component": "SettingsView"
},
{
"viewport": "stripe.dashboard.onboarding",
"component": "OnboardingView"
}
],
"content_security_policy": {
"connect-src": [
"https://api.tajo.io",
"https://api.brevo.com"
],
"image-src": [
"https://cdn.tajo.io",
"https://assets.brevo.com"
],
"purpose": "Connect to Tajo API for data sync and Brevo API for contact management"
}
},
"post_install_action": {
"type": "onboarding"
},
"constants": {
"API_BASE_URL": "https://api.tajo.io/v1",
"SYNC_INTERVAL_SECONDS": "300"
}
}

Schema-Referenz

Felder auf oberster Ebene

FeldTypErforderlichBeschreibung
idstringJaEindeutige App-Kennung in umgekehrter Domain-Notation (Slug-Format)
versionstringJaSemantische Versionsangabe (z. B. "1.2.0")
namestringJaAnzeigename im Marketplace (max. 35 Zeichen)
iconstringJaRelativer Pfad zur Icon-Datei der App (300x300 PNG oder SVG)
distribution_typestringJa"public" für den Marketplace oder "private" für interne Nutzung
sandbox_install_compatiblebooleanNeinOb die App im Sandbox- oder Testmodus installiert werden kann
stripe_api_access_typestringNeinZugriffsmethode für die API: "oauth" oder "api_key"
allowed_redirect_urisstring[]NeinErlaubte OAuth-Redirect-URIs für den Installationsablauf
permissionsPermissionRequest[]JaArray mit Berechtigungsanfragen
ui_extensionUIExtensionManifestNeinKonfiguration der UI-Erweiterung
post_install_actionPostInstallActionNeinAktion, die nach der Installation der App ausgeführt wird
constantsobjectNeinSchlüssel-Wert-Paare, die zur Laufzeit in der App verfügbar sind

id

Die App-Kennung ist eine Zeichenkette im Slug-Format, üblicherweise in umgekehrter Domain-Notation:

"id": "com.tajo.brevo-integration"
  • Muss über alle Stripe Apps hinweg global eindeutig sein
  • Verwende ausschließlich Kleinbuchstaben, Ziffern, Bindestriche und Punkte
  • Kann nach dem Anlegen der App nicht mehr geändert werden
  • Bestimmt die URL der App im Marketplace

version

Folgt der semantischen Versionierung:

"version": "1.2.0"
  • MAJOR: Breaking Changes oder größere neue Funktionen
  • MINOR: Neue Funktionen, abwärtskompatibel
  • PATCH: Fehlerbehebungen und kleinere Verbesserungen
  • Muss bei jedem Upload erhöht werden

distribution_type

Steuert, wer deine App installieren kann:

WertBeschreibung
"public"Im Stripe App Marketplace für alle Nutzer:innen verfügbar
"private"Nur über dein eigenes Stripe-Konto installierbar

stripe_api_access_type

Legt fest, wie sich deine App gegenüber der Stripe API authentifiziert:

WertBeschreibung
"oauth"Nutzt den OAuth-2.0-Ablauf zur Authentifizierung (empfohlen für öffentliche Apps)
"api_key"Nutzt eingeschränkte API-Schlüssel (geeignet für private Apps)

PermissionRequest

Jede Berechtigungsanfrage deklariert eine bestimmte Berechtigung der Stripe API, die deine App benötigt:

{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
}
FeldTypErforderlichBeschreibung
permissionstringJaDie Kennung der Berechtigung (siehe Berechtigungsreferenz)
purposestringJaVerständliche Erklärung, warum diese Berechtigung nötig ist

Leitlinien für den Zweck:

  • Schreibe klare, konkrete Erklärungen, die Händler:innen verstehen
  • Erkläre, wofür die Berechtigung genutzt wird, nicht nur, was sie erlaubt
  • Halte die Beschreibungen knapp (ein Satz)
  • Vermeide Fachjargon

UIExtensionManifest

Konfiguriert die UI-Komponenten deiner App:

{
"ui_extension": {
"views": [...],
"content_security_policy": {...}
}
}
FeldTypErforderlichBeschreibung
viewsViewManifest[]JaArray mit Ansichtsdeklarationen
content_security_policyCSPRequestNeinContent Security Policy für externe Ressourcen

ViewManifest

Jede Ansicht ordnet eine React-Komponente einem Viewport im Stripe Dashboard zu:

{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
}
FeldTypErforderlichBeschreibung
viewportstringJaDer Ort im Dashboard, an dem diese Ansicht gerendert wird (siehe Viewport-Referenz)
componentstringJaName der React-Komponente, die gerendert wird (muss dem Namen der exportierten Komponente entsprechen)

Eine einzelne App kann mehrere Ansichten für verschiedene Viewports deklarieren:

"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.payment.detail",
"component": "PaymentDetailView"
},
{
"viewport": "stripe.dashboard.home.overview",
"component": "OverviewView"
}
]

CSPRequest

Die Content Security Policy steuert, mit welchen externen Domains deine App eine Verbindung aufbauen darf:

{
"content_security_policy": {
"connect-src": [
"https://api.tajo.io",
"https://api.brevo.com"
],
"image-src": [
"https://cdn.tajo.io"
],
"purpose": "Connect to Tajo API for data sync and load images from CDN"
}
}
FeldTypErforderlichBeschreibung
connect-srcstring[]NeinDomains, an die die App Netzwerkanfragen senden darf
image-srcstring[]NeinDomains, von denen die App Bilder laden darf
purposestringJaErklärung, warum diese externen Verbindungen nötig sind

Caution

Nimm nur Domains auf, zu denen deine App tatsächlich eine Verbindung braucht. Zu viele CSP-Einträge können eine genauere Prüfung auslösen.

PostInstallAction

Konfiguriert, was unmittelbar nach der Installation deiner App passiert:

{
"post_install_action": {
"type": "onboarding"
}
}
FeldTypErforderlichBeschreibung
typestringJaDer Aktionstyp (siehe unten)
urlstringBedingtURL für Aktionen vom Typ external

Aktionstypen

TypVerhalten
"onboarding"Öffnet die Onboarding-Ansicht der App im Dashboard
"settings"Öffnet die Einstellungsansicht der App im Dashboard
"external"Leitet die Nutzer:innen zu einer externen URL weiter (benötigt das Feld url)

Beispiele:

// Open onboarding flow
{
"post_install_action": {
"type": "onboarding"
}
}
// Open settings page
{
"post_install_action": {
"type": "settings"
}
}
// Redirect to external setup
{
"post_install_action": {
"type": "external",
"url": "https://app.tajo.io/stripe/setup"
}
}

Ausführliche Umsetzungsmuster findest du im Leitfaden zu Post-Install-Aktionen.

Konstanten

Lege statische Schlüssel-Wert-Paare fest, die zur Laufzeit in deiner App verfügbar sind:

{
"constants": {
"API_BASE_URL": "https://api.tajo.io/v1",
"SYNC_INTERVAL_SECONDS": "300",
"MAX_BATCH_SIZE": "100"
}
}
  • Alle Werte müssen Strings sein
  • Konstanten werden beim Build in die App eingebettet
  • Nutze Konstanten für Konfiguration, die sich zwischen Umgebungen unterscheidet
  • Speichere niemals Geheimnisse oder API-Schlüssel als Konstanten, nutze stattdessen die Secret Store API

So greifst du im Code deiner App auf Konstanten zu:

import { constants } from '@stripe/ui-extension-sdk/constants';
const apiUrl = constants.API_BASE_URL;

Erweitertes Manifest für die Entwicklung

Während der lokalen Entwicklung stehen zusätzliche Felder zur Verfügung:

{
"id": "com.tajo.brevo-integration",
"version": "0.1.0",
"name": "Tajo for Brevo (Dev)",
"icon": "./assets/icon-dev.png",
"distribution_type": "private",
"sandbox_install_compatible": true,
"dev": {
"hot_reload": true,
"port": 4242
}
}

Der Abschnitt dev wird bei Produktions-Builds und beim Upload der App entfernt. Nutze ihn nur für Komfort-Einstellungen der lokalen Entwicklung.

Validierung

Validiere dein Manifest vor dem Upload:

Terminal window
# Validate manifest syntax and schema
stripe apps validate
# Check for common issues
stripe apps check

Häufige Validierungsfehler:

FehlerUrsacheLösung
Invalid permissionUnbekannte Kennung einer BerechtigungPrüfe die Berechtigungsreferenz
Invalid viewportUnbekannte Viewport-KennungPrüfe die Viewport-Referenz
Missing purposeBerechtigung ohne Feld purposeErgänze für jede Berechtigung einen Zweck als String
Invalid versionVersionsangabe ohne Semver-FormatVerwende das Format MAJOR.MINOR.PATCH
Icon not foundDer Icon-Pfad lässt sich nicht auflösenPrüfe, ob die Icon-Datei unter dem angegebenen Pfad existiert

Beantrage frühzeitigen Zugang

Gib deinen Vornamen und eine E-Mail-Adresse oder Telefonnummer an. Wir melden uns mit den Details zum Tajo-Zugang bei dir.

automatische Erkennung
AI-Assistent

Hallo! Fragen Sie mich alles über die Dokumentation.