Viewports Reference

Viewports define where your Stripe App’s UI components appear within the Stripe Dashboard. Each viewport corresponds to a specific Dashboard page or location where your app can render a view.

How Viewports Work

When you declare a view in your app manifest, you map a React component to a viewport:

{
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
}
]
}
}

The component renders in the app drawer (side panel) when a user navigates to the corresponding Dashboard page and opens your app.

Dashboard-Wide vs Page-Specific Viewports

Dashboard-Wide Viewports

These viewports are available on every page of the Stripe Dashboard:

Viewport IDDescription
stripe.dashboard.drawer.defaultDefault drawer view, accessible from any Dashboard page via the app icon
stripe.dashboard.home.overviewHome page overview, shown on the Dashboard landing page
stripe.dashboard.settingsApp settings page, accessible from the app’s settings menu
stripe.dashboard.onboardingOnboarding flow, shown after app installation

Tip

The drawer.default viewport acts as a fallback. If a user opens your app on a page where you haven’t declared a specific viewport, the drawer.default view renders instead.

Page-Specific Viewports

These viewports render only when the user is on the corresponding Dashboard page:

Payments

Viewport IDPageURL PatternObject Type
stripe.dashboard.payment.listPayments list/payments
stripe.dashboard.payment.detailPayment detail/payments/:idPaymentIntent
stripe.dashboard.charge.detailCharge detail/payments/:id (legacy)Charge

Customers

Viewport IDPageURL PatternObject Type
stripe.dashboard.customer.listCustomers list/customers
stripe.dashboard.customer.detailCustomer detail/customers/:idCustomer

Products & Prices

Viewport IDPageURL PatternObject Type
stripe.dashboard.product.listProducts list/products
stripe.dashboard.product.detailProduct detail/products/:idProduct
stripe.dashboard.price.detailPrice detail/prices/:idPrice

Invoices

Viewport IDPageURL PatternObject Type
stripe.dashboard.invoice.listInvoices list/invoices
stripe.dashboard.invoice.detailInvoice detail/invoices/:idInvoice

Subscriptions

Viewport IDPageURL PatternObject Type
stripe.dashboard.subscription.listSubscriptions list/subscriptions
stripe.dashboard.subscription.detailSubscription detail/subscriptions/:idSubscription

Checkout

Viewport IDPageURL PatternObject Type
stripe.dashboard.checkout.session.listCheckout Sessions list/checkout/sessions
stripe.dashboard.checkout.session.detailCheckout Session detail/checkout/sessions/:idCheckoutSession
stripe.dashboard.payment-link.listPayment Links list/payment-links
stripe.dashboard.payment-link.detailPayment Link detail/payment-links/:idPaymentLink

Connect

Viewport IDPageURL PatternObject Type
stripe.dashboard.connect.account.listConnected accounts list/connect/accounts
stripe.dashboard.connect.account.detailConnected account detail/connect/accounts/:idAccount
stripe.dashboard.transfer.listTransfers list/connect/transfers
stripe.dashboard.transfer.detailTransfer detail/connect/transfers/:idTransfer

Billing

Viewport IDPageURL PatternObject Type
stripe.dashboard.coupon.listCoupons list/coupons
stripe.dashboard.coupon.detailCoupon detail/coupons/:idCoupon
stripe.dashboard.quote.listQuotes list/quotes
stripe.dashboard.quote.detailQuote detail/quotes/:idQuote
stripe.dashboard.credit-note.detailCredit note detail/credit-notes/:idCreditNote

Payouts

Viewport IDPageURL PatternObject Type
stripe.dashboard.payout.listPayouts list/payouts
stripe.dashboard.payout.detailPayout detail/payouts/:idPayout

Disputes

Viewport IDPageURL PatternObject Type
stripe.dashboard.dispute.listDisputes list/disputes
stripe.dashboard.dispute.detailDispute detail/disputes/:idDispute

Terminal

Viewport IDPageURL PatternObject Type
stripe.dashboard.terminal.reader.listReaders list/terminal/readers
stripe.dashboard.terminal.reader.detailReader detail/terminal/readers/:idTerminalReader
stripe.dashboard.terminal.location.listLocations list/terminal/locations
stripe.dashboard.terminal.location.detailLocation detail/terminal/locations/:idTerminalLocation

Issuing

Viewport IDPageURL PatternObject Type
stripe.dashboard.issuing.card.listCards list/issuing/cards
stripe.dashboard.issuing.card.detailCard detail/issuing/cards/:idIssuingCard
stripe.dashboard.issuing.cardholder.listCardholders list/issuing/cardholders
stripe.dashboard.issuing.cardholder.detailCardholder detail/issuing/cardholders/:idIssuingCardholder
stripe.dashboard.issuing.transaction.listTransactions list/issuing/transactions
stripe.dashboard.issuing.authorization.listAuthorizations list/issuing/authorizations

Accessing Object Context

When your app renders in a detail viewport, it receives the relevant Stripe object as context:

import type { ExtensionContextValue } from '@stripe/ui-extension-sdk/context';
const CustomerDetailView = ({ environment }: ExtensionContextValue) => {
const { objectContext } = environment;
// objectContext contains the current Stripe object
const customerId = objectContext?.id; // "cus_xxxxx"
const customerEmail = objectContext?.email;
return (
<Box>
<Inline>Customer: {customerEmail}</Inline>
<Inline>Brevo Sync Status: checking...</Inline>
</Box>
);
};

List vs Detail Context

Viewport TypeObject ContextUse Case
List (e.g., customer.list)Not available — no specific object selectedShow aggregate data, summary views, or batch actions
Detail (e.g., customer.detail)Full Stripe object for the current pageShow object-specific data, actions, and integrations

For the Tajo Brevo integration app, these viewports provide the most value:

{
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.customer.list",
"component": "CustomerListView"
},
{
"viewport": "stripe.dashboard.payment.detail",
"component": "PaymentDetailView"
},
{
"viewport": "stripe.dashboard.subscription.detail",
"component": "SubscriptionDetailView"
},
{
"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"
}
]
}
}
ComponentPurpose
CustomerDetailViewShow Brevo contact info, sync status, and engagement data for a specific customer
CustomerListViewShow batch sync controls and aggregate Brevo sync statistics
PaymentDetailViewShow which Brevo events were triggered by this payment
SubscriptionDetailViewShow Brevo automation status for this subscription
OverviewViewDashboard home widget with sync health and key Brevo metrics
DrawerViewGeneral app drawer with quick actions and status overview
SettingsViewConfigure Brevo API key, sync preferences, and field mappings
OnboardingViewGuide new users through connecting their Brevo account

Viewport Availability

Not all viewports are available in all Stripe Dashboard modes:

ModeAvailable Viewports
Live modeAll viewports
Test modeAll viewports (uses test data)
SandboxAll viewports (if sandbox_install_compatible: true)

Caution

If your manifest declares a viewport that doesn’t exist, the app upload will fail validation. Always verify viewport IDs against this reference.

AI Assistant

Hi! Ask me anything about the docs.

Start Free with Brevo