stripe-payments downgrade temboo

stripe payments - Raya: degradar a un usuario al "final de período"



stripe-payments downgrade (6)

¿Es posible degradar a un usuario al final del período en lugar de inmediatamente? He revisado los documentos API, pero no he podido averiguar cómo lograr esto.

Como solución temporal, actualmente estoy cancelando de inmediato la suscripción del usuario, luego la suscribo a la suscripción menor, probando hasta el final del mes. Sin embargo, esto no funcionará. Necesito poder retrasar la rebaja hasta el final del período (pero "grabarlo" con raya en el momento en que se solicita la rebaja).

Claramente, hay formas de lograr esto con las devoluciones de llamadas de webhook y mediante el seguimiento de las suscripciones de usuarios localmente, pero me gustaría evitar eso si es posible.

EDITAR

Antes de que alguien pregunte, estoy usando PHP SDK de Temboo. Sin embargo, no estoy buscando un enfoque específico del idioma, solo un alto nivel de cómo hacerlo (si es posible).


Si, en cambio, desea cancelar la suscripción al final del período de facturación actual (es decir, durante el tiempo que el cliente ya ha pagado), proporcione un valor at_period_end de true

https://stripe.com/docs/subscriptions/canceling-pausing

Creo que puede actualizar la suscripción y agregar at_period_end: true y eso debería cancelarse al final del período.


Debe hacer un seguimiento de cuándo su usuario se une a un plan; mantenga un campo de fecha en su base de datos junto al ID de cliente. Puede usar esta fecha para determinar el día del mes en que se unieron y, por lo tanto, el ciclo de facturación. Si el día de facturación es el 31 del mes, en los meses más cortos, Stripe facturará el último día de esos meses ( https://support.stripe.com/questions/subscription-date-at-end-of-month ).

Ahora, cuando un usuario desea degradar, completa la acción en su sitio web cuando inicia sesión. Tome nota de esta solicitud de degradación y la almacene en una, llamémosla "stripe_actionable_table" en su base de datos. Los campos importantes a tener en esta tabla serían:

  • actionable_date (la fecha para la acción de la solicitud de franja: necesitaría algo de lógica para determinar los meses más cortos como se mencionó anteriormente)
  • stripe_customer_id
  • what_to_do (actualizar / degradar / cancelar)
  • change_plan_to (un ID de plan - puede ser nulo si se requiere cancelar)

A continuación, tendrá un cron que se ejecuta todos los días a una determinada hora y comprueba esta stripe_actionable_table y, si el día del mes coincide con una fila de la tabla, haga clic en la solicitud de Stripe. Una vez completado, puede eliminar o marcar la fila como eliminada.


Esto ahora es posible usando la bandera de prorate de Stripe.

P.ej

$subscription = /Stripe/Subscription::retrieve($sub); /Stripe/Subscription::update($sub, [ ''cancel_at_period_end'' => false, ''items'' => [ [ ''id'' => $subscription->items->data[0]->id, ''plan'' => $plan, ], ], ''prorate'' => false, ''trial_end'' => $subscription->current_period_end ]); $subscription->save();

Al establecer prorate en falso, le está diciendo a Stripe que no aplique el cambio de plan hasta el final del período actual.

Documentos oficiales aquí:

https://stripe.com/docs/subscriptions/upgrading-downgrading#disable-prorations

ACLARACIÓN (según el comentario del usuario a continuación) : tenga en cuenta que Stripe actualizará su propia representación del plan activo de inmediato (solo se diferirá el cobro del usuario), por lo que aún deberá gestionar manualmente el retraso del cambio del plan activo desde su propio plan solicitud.


Parece que no hay una manera de hacerlo fácilmente con Stripe.

Estoy actualizando las cantidades en lugar de cambiar los planes, pero la idea también podría aplicarse.

La posible solución es:

  1. Actualizar cantidad de suscripción sin prorrateo con raya.

  2. Mantener la cantidad anterior hasta el evento invoice.created .

  3. Al manejar el evento invoice.created , comparar la cantidad anterior con la cantidad a la que el usuario está suscrito y reducirla si es necesario.


Sí, utilizando la versión más reciente de la API.

  • Crea un producto con múltiples planes de precios.
  • Suscriba un cliente a uno de estos identificadores de planes
  • Al actualizar un cliente a un nuevo plan, simplemente haga lo siguiente:

    $subscription = /Stripe/Subscription::retrieve("sub_44ty4267H50z6c"); $itemID = $subscription->items->data[0]->id; /Stripe/Subscription::update("sub_44ty4267H50z6c", array( "items" => array( array( "id" => $itemID, "plan" => "basic-plan", ), ), "prorate" => false, ));

Al establecer prorate en falso, trial_end a $subscription->current_period_end trial_end $subscription->current_period_end y cancel_at_period_end a falso, le dice a Stripe:

No cargue a este usuario hasta el día en que finalice su facturación actual (cancele al final del período), no le reembolse ningún dinero en el cambio de plan (prorrateo) y comience a facturar nuevamente al final de su ciclo de facturación actual (finalización de prueba).

Lo que tiene el efecto de cambiar su facturación al nuevo plan cuando finaliza su plan anterior.


Como han mencionado @Safinn y @Martin, puede cancelar la suscripción utilizando at_period_end: true para at_period_end: true la cancelación en una fecha específica.

Para cambiar a un plan diferente , la forma de hacerlo es hacer lo anterior y luego crear una versión de prueba gratuita del nuevo plan que termina en la misma fecha / hora. De esta manera, el plan anterior se cancelará en la misma fecha en que finalizará la prueba del nuevo plan (lo que hará que esté activo).

Esto le permite a Stripe manejar la degradación por completo de su final (lo que debería ser un IMHO más sencillo), en lugar de configurar webhooks o rastrear las fechas en su base de datos.