Gestionar pago
Exportar contenido
Accede al portal de Stripe para actualizar tu método de pago, ver facturas o gestionar datos de facturación.
- En la pestaña “Facturación”, clic en “Gestionar pago”
- Se abre el Stripe Customer Portal en una nueva ventana
- Desde el portal puedes:
- Actualizar tarjeta de crédito/débito
- Cambiar datos de facturación
- Ver historial de facturas
- Descargar recibos en PDF
- Los cambios se sincronizan automáticamente con Factux
Errores comunes
Sección titulada «Errores comunes»“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
Detalles técnicos
Sección titulada «Detalles técnicos»Implementación del Customer Portal
Edge Function: create-portal-session
Ubicación: supabase/functions/create-portal-session/index.ts
Flujo:
// 1. Obtener Stripe Customer IDconst { 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 portalconst portalSession = await stripe.billingPortal.sessions.create({ customer: subscription.stripe_customer_id, return_url: `${origin}/owner/settings/subscription`,});
// 3. Retornar URLreturn { 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 businessesstripe.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ñadidostripe.webhook.on('payment_method.attached', async (paymentMethod) => { // Registra nuevo método en logs console.log('New payment method:', paymentMethod.id);});