Stripe Apps incorporados
Os Stripe Apps incorporados permitem que plataformas construídas sobre o Stripe Connect exibam funcionalidades de apps de terceiros dentro dos seus próprios painéis. Com os componentes incorporados do Connect, você dá às suas contas conectadas acesso a apps como QuickBooks, Xero e Mailchimp sem que elas precisem acessar o Stripe Dashboard.
Visão geral
Os apps incorporados usam dois componentes principais do Connect:
app-install: renderiza um botão de instalação de um Stripe App dentro da interface da sua plataformaapp-viewport: renderiza um viewport específico do app dentro da interface da sua plataforma
Isso permite que operadores de plataforma incorporem ferramentas de contabilidade, marketing e operação diretamente no seu produto.
Apps compatíveis
Os apps a seguir podem ser incorporados por meio dos componentes do Connect:
| App | Categoria | Caso de uso |
|---|---|---|
| QuickBooks | Contabilidade | Sincroniza pagamentos e faturas com o QuickBooks |
| Xero | Contabilidade | Contabilidade e conciliação automatizadas |
| Mailchimp | Marketing | Sincroniza dados de clientes para campanhas de e-mail |
| Apps personalizados | Qualquer | Seus próprios Stripe Apps criados para a sua plataforma |
Tip
A integração da Tajo com a Brevo pode ser incorporada em plataformas Connect, o que permite que as contas conectadas sincronizem seus dados da Stripe com a Brevo pela interface da própria plataforma.
Configuração com a Account Sessions API
Para incorporar apps, você precisa criar Account Sessions com os componentes adequados habilitados:
No servidor: criar a Account Session
const stripe = require('stripe')('sk_live_...');
// Create an Account Session for the connected accountconst accountSession = await stripe.accountSessions.create({ account: 'acct_connected_account_id', components: { // Enable app install component app_install: { enabled: true, features: { allowed_apps: [ 'com.tajo.brevo-integration', 'com.quickbooks.stripe-app' ], }, }, // Enable app viewport component app_viewport: { enabled: true, features: { allowed_apps: [ 'com.tajo.brevo-integration' ], }, }, },});
// Return the client secret to your frontendres.json({ clientSecret: accountSession.client_secret });No cliente: inicializar o Connect.js
import { loadConnectAndInitialize } from '@stripe/connect-js';
// Initialize Connect.js with the account sessionconst stripeConnect = loadConnectAndInitialize({ publishableKey: 'pk_live_...', fetchClientSecret: async () => { const response = await fetch('/api/account-session', { method: 'POST', }); const { clientSecret } = await response.json(); return clientSecret; },});Componente app install
O componente app-install renderiza um botão de instalação que as contas conectadas podem usar para instalar um Stripe App:
JavaScript
// Create the app install elementconst appInstall = stripeConnect.create('app-install');
// Set the app to installappInstall.setApp('com.tajo.brevo-integration');
// Mount to a DOM elementconst container = document.getElementById('app-install-container');appInstall.mount(container);
// Listen for install eventsappInstall.on('app_installed', (event) => { console.log('App installed:', event.app_id); // Show the app viewport after installation showAppViewport();});
appInstall.on('app_uninstalled', (event) => { console.log('App uninstalled:', event.app_id);});React
import { ConnectAppInstall, ConnectComponentsProvider,} from '@stripe/react-connect-js';
const AppInstallButton = () => { return ( <ConnectComponentsProvider connectInstance={stripeConnect}> <ConnectAppInstall app="com.tajo.brevo-integration" onAppInstalled={(event) => { console.log('App installed:', event.app_id); }} onAppUninstalled={(event) => { console.log('App uninstalled:', event.app_id); }} /> </ConnectComponentsProvider> );};Componente app viewport
O componente app-viewport renderiza um viewport específico do app dentro da sua plataforma:
JavaScript
// Create the app viewport elementconst appViewport = stripeConnect.create('app-viewport');
// Configure the viewportappViewport.setApp('com.tajo.brevo-integration');appViewport.setViewport('stripe.dashboard.customer.detail');
// Pass object context (e.g., customer ID)appViewport.setObjectContext({ id: 'cus_xxxxx', object: 'customer',});
// Mount to a DOM elementconst container = document.getElementById('app-viewport-container');appViewport.mount(container);React
import { ConnectAppViewport, ConnectComponentsProvider,} from '@stripe/react-connect-js';
const BrevoCustomerView = ({ customerId }: { customerId: string }) => { return ( <ConnectComponentsProvider connectInstance={stripeConnect}> <ConnectAppViewport app="com.tajo.brevo-integration" viewport="stripe.dashboard.customer.detail" objectContext={{ id: customerId, object: 'customer', }} /> </ConnectComponentsProvider> );};Schema de metadados de destination charges
Ao usar apps incorporados com destination charges (algo comum em plataformas Connect), os metadados da cobrança carregam dados estruturados que as integrações de contabilidade e marketing conseguem consumir.
Integrações de contabilidade
Em apps como QuickBooks e Xero, os metadados das destination charges seguem este schema:
{ "metadata": { "customer_id": "cus_platform_customer_id", "product_name": "Premium Subscription", "product_id": "prod_xxxxx", "quantity": "1", "unit_amount": "4999", "currency": "usd", "platform_fee": "500", "platform_fee_currency": "usd", "tax_amount": "450", "tax_rate_id": "txr_xxxxx", "invoice_id": "inv_xxxxx", "order_id": "order_12345" }}| Campo | Tipo | Descrição |
|---|---|---|
customer_id | string | Identificador do cliente na plataforma |
customer_email | string | E-mail do cliente, usado para casar faturas e recibos |
product_name | string | Nome de exibição do produto nos itens de linha |
product_id | string | ID do produto na Stripe |
quantity | string | Quantidade do item |
unit_amount | string | Preço unitário na menor unidade da moeda (centavos) |
currency | string | Código ISO da moeda com três letras |
platform_fee | string | Valor da taxa da aplicação na menor unidade da moeda |
platform_fee_currency | string | Moeda da taxa da plataforma |
tax_amount | string | Valor do imposto na menor unidade da moeda |
tax_rate_id | string | ID da alíquota de imposto aplicada na Stripe |
invoice_id | string | ID da fatura associada |
order_id | string | Identificador interno do pedido na plataforma |
Integrações de marketing
Em apps como o Mailchimp e a integração da Tajo com a Brevo, os metadados viabilizam a segmentação de clientes e a definição de público das campanhas:
{ "metadata": { "customer_id": "cus_xxxxx", "customer_name": "Jane Smith", "product_category": "subscription", "product_name": "Pro Plan", "purchase_value": "4999", "currency": "usd", "is_first_purchase": "true", "referral_source": "partner_campaign", "subscription_interval": "monthly", "lifetime_value": "29994" }}Esses metadados viabilizam automações na Brevo como:
- Série de boas-vindas para quem compra pela primeira vez (
is_first_purchase: "true") - Campanhas de upsell com base em
product_categoryepurchase_value - Fluxos de retenção para clientes de assinatura com base em
subscription_interval - Campanhas de reconquista direcionadas a clientes com
lifetime_valuealto que cancelaram
Exemplo de integração em plataforma
Uma integração completa de plataforma incorporando o app Tajo para Brevo:
import { useState, useEffect } from 'react';import { ConnectAppInstall, ConnectAppViewport, ConnectComponentsProvider,} from '@stripe/react-connect-js';import { loadConnectAndInitialize } from '@stripe/connect-js';
const TajoBrevoPlatformIntegration = ({ connectedAccountId, customerId }) => { const [stripeConnect, setStripeConnect] = useState(null); const [isInstalled, setIsInstalled] = useState(false);
useEffect(() => { const instance = loadConnectAndInitialize({ publishableKey: 'pk_live_...', fetchClientSecret: async () => { const res = await fetch('/api/account-session', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ accountId: connectedAccountId }), }); const { clientSecret } = await res.json(); return clientSecret; }, }); setStripeConnect(instance); }, [connectedAccountId]);
if (!stripeConnect) return <div>Loading...</div>;
return ( <ConnectComponentsProvider connectInstance={stripeConnect}> {!isInstalled ? ( <div> <h3>Connect Brevo via Tajo</h3> <p>Install the Tajo integration to sync customer data with Brevo.</p> <ConnectAppInstall app="com.tajo.brevo-integration" onAppInstalled={() => setIsInstalled(true)} /> </div> ) : ( <div> <h3>Brevo Customer Profile</h3> <ConnectAppViewport app="com.tajo.brevo-integration" viewport="stripe.dashboard.customer.detail" objectContext={{ id: customerId, object: 'customer', }} /> </div> )} </ConnectComponentsProvider> );};Considerações de segurança
Ao incorporar apps na sua plataforma:
- As Account Sessions expiram: crie novas sessões conforme a necessidade e não guarde client secrets em cache
- Controle de escopo: use
allowed_appspara restringir quais apps podem ser instalados - Isolamento de dados: os dados de cada conta conectada ficam isolados e a plataforma não acessa os dados do app
- Cabeçalhos de CSP: garanta que a Content Security Policy da sua plataforma permita conexões com
https://connect-js.stripe.com
Caution
Os componentes de apps incorporados exigem uma integração Connect com acesso à Account Sessions API. Contas Stripe padrão não podem usar componentes incorporados.