Ir al contenido

Gestionar pago

Accede al portal de Stripe para actualizar tu método de pago, ver facturas o gestionar datos de facturación.

  1. En la pestaña “Facturación”, clic en “Gestionar pago”
  2. Se abre el Stripe Customer Portal en una nueva ventana
  3. Desde el portal puedes:
    • Actualizar tarjeta de crédito/débito
    • Cambiar datos de facturación
    • Ver historial de facturas
    • Descargar recibos en PDF
  4. Los cambios se sincronizan automáticamente con Factux

“No se pudo abrir el portal”

Causa: No existe un Stripe Customer ID asociado a tu negocio.

Solución:

  • Esto solo ocurre si nunca has tenido suscripción de pago
  • Primero selecciona un plan de pago (Basic o Premium)
  • Una vez creada la suscripción, el portal estará disponible
Implementación del Customer Portal

Edge Function: create-portal-session

Ubicación: supabase/functions/create-portal-session/index.ts

Flujo:

// 1. Obtener Stripe Customer ID
const { data: subscription } = await supabase
.from('business_subscriptions')
.select('stripe_customer_id')
.eq('business_id', businessId)
.single();
if (!subscription?.stripe_customer_id) {
throw new Error('No Stripe customer found');
}
// 2. Crear sesión del portal
const portalSession = await stripe.billingPortal.sessions.create({
customer: subscription.stripe_customer_id,
return_url: `${origin}/owner/settings/subscription`,
});
// 3. Retornar URL
return { url: portalSession.url };

Configuración del Customer Portal en Stripe:

El portal está configurado para permitir:

  • ✅ Actualizar método de pago
  • ✅ Ver historial de facturas
  • ✅ Actualizar información de facturación
  • ❌ Cancelar suscripción (se hace desde Factux)
  • ❌ Cambiar plan (se hace desde Factux)

Webhooks sincronizados:

Cuando el usuario actualiza datos en el portal, Stripe envía webhooks que Factux procesa:

// customer.updated → Actualiza datos en businesses
stripe.webhook.on('customer.updated', async (customer) => {
await supabase
.from('businesses')
.update({
email: customer.email,
legal_name: customer.name,
phone: customer.phone,
address: customer.address.line1,
// ...
})
.eq('stripe_customer_id', customer.id);
});
// payment_method.attached → Nuevo método de pago añadido
stripe.webhook.on('payment_method.attached', async (paymentMethod) => {
// Registra nuevo método en logs
console.log('New payment method:', paymentMethod.id);
});