Paypal recurring payment reattempts: IPN callback flow for failed payments, and subscription cancellation? - paypal

I have a bog-standrad Paypal subscription -button installation, with an IPN callback flow. One bleeding point of this setup for the past 24 months has been the instant subscription cancellation upon lack of available funds; which, statistically, happens with moderate frequency in the target market I'm currently selling to.
So, current IPN flow is: subscr_signup -> [Nx] subscr_payment -> subscr_cancel/subscr_failed [terminate subscription].
According to a previous SO question: retry to charge the client if a payment fails:
There is a variable sra when set to 1 , PaYPal will try to collect the payment two more times before canceling the subscription. More information on Recurring Payments Reattempts
I suspect using this would drastically reduce "churn-by-payment-issue" problem, and would like to implement this.
My question is, what is the IPN callback flow for these endgame situations? That is, for "payment failed, will retry", VS "payment failed, subscription terminated" , specifically, what order, and txn_type will be called?
Many thanks.

Related

PayPal Express Checkout - Webhook PAYMENT.SALE.COMPLETED

I was searching a while and also read the paypal docs but I am unable to find an answer to my question. I created a recurring payment with Paypal Express Checkout. Everything is working fine, but now I need to know a little bit more about webhooks.
Assume a user registered and created a recurring subscription. The set-up fee is 0,00€ and the first payment will be in one week. After the first payment, the billing cycle will be every week. Now about my webhook question: I guess I need to use the PAYMENT.SALE.COMPLETED webhook am I right? As soon as I get paid every week, the PAYMENT.SALE.COMPLETED webhook will fire for every successfull payment and therefore add a new entry inside my database. Am I right? Or do I need to use another webhook for recurring payments?
Is there someone who uses this webhook in combination of a recurring subscription? Would be great if someone can help me out understanding if PAYMENT.SALE.COMPLETED is the correct webhook for recurring subscriptions.
Yes, PAYMENT.SALE.COMPLETED is sent after every successful billing event for a subscription.
Here is an example timeline of a subscription sale on my website:
2021-07-30 13:17:13.143: PAYMENT.SALE.COMPLETED - first payment
2021-07-30 13:17:10.679: BILLING.SUBSCRIPTION.ACTIVATED
2021-07-30 13:16:15.032: BILLING.SUBSCRIPTION.CREATED - this came after the one above, so make sure you can handle that
2021-08-30 11:13:05.321: PAYMENT.SALE.COMPLETED with "state"=>"completed" - second recurring payment
2021-09-08 14:34:44.816: PAYMENT.SALE.COMPLETED with "state"=>"completed","payment_hold_status"=>"RELEASED" - this is the release of the second recurring payment
If the recurring payment fails, you will receive BILLING.SUBSCRIPTION.PAYMENT.FAILED. Paypal retries the payment 3 times. See the attribute next_payment_retry_time which is set to null after the 3rd and final failed payment attempt.
You can configure your billing plan to automatically suspend a subscription after x number of failed payments (note: set this to be 1+ because 0 keeps is always active) and/or automatically add the outstanding payments to the next billing cycling.
Screenshot below:
I don't believe you have any choice for which webhook PayPal will send you. I am fighting with this right now because PAYMENT.SALE.COMPLETED is the one they send me, but it doesn't contain enough data for me to match it up with a customer or a shopping cart. I want them to return CHECKOUT.ORDER.COMPLETED instead, but there doesn't seem to be a way to make that happen.

PayPal Subscriptions - Tracking Refund

I'm not a developer, but a project manager. So please excuse my lack of proper language.
We are trying to figure out how to handle subscription refunds and then limit account access on the site.
Here's a scenario. Member signs up for an annual subscription to gain certain capabilities in the account. 3 months into it member decides to cancel and requests a refund. Normally, if no refund is issued, subscription is good until the end of the billing period, at which point account is deactivated.
In our case, if a refund is issued, account should be deactivated immediately. Question: is it possible to set this up as part of PayPal Subscriptions? Some type of call from PayPal to our system that will trigger account deactivation.
Thank you.
We recommend using IPN (Instant Payment Notifications) to be asynchronously notified of any events, in this case of those related to existing subscription/recurring payments.
https://developer.paypal.com/webapps/developer/docs/classic/ipn/gs_IPN/
If you enable IPN notifications you will receive a POST of PayPal in the following events (among others):
When a recurring profile is cancelled.
When a refund has been made to a previous completed transaction.
This way, you can set up your IPN script to keep the subscription “open” in your side for the remainder of the month even if the profile has been cancelled, or to deactivate it if the last month has been refunded.
For more information about IPN variables:
https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/

Paypal recurring_payment_skipped conditions

When using the Paypal Express Checkout API, I've created a recurring payments profile, and set up an endpoint to listen for IPN messages.
I've received messages at this endpoint with a txn_type of recurring_payment_skipped.
The documentation is a little sparse on the details of when these messages may occur:
Recurring payment skipped; it will be retried up to 3 times, 5 days apart
What would cause a recurring payment to be skipped? What happens after the 3rd retry?
Skipped basically means failed. This could be due to the funding source(s) available (or not available) on the payer's account, it could be something like a daily limit reached on the payer's credit card, or anything else that would keep the payment from completing.
After the 3rd retry if it hasn't completed successfully it will automatically suspend the profile. At that point you would have to collect the outstanding balance and then you could reactivate the profile.

How do paypal clients retry monthly subscription payments without setting up a new payment?

Similar to the post: Does PayPal Standard automatically retry to charge the client if a payment fails?
But about how the client can make it retry manually lets say after they have put more funds into their paypal account but before paypal automatically retries in a few days time.
When you use subscription - the automatic billing is handled by PayPal, and the retrying interval is fixed in this design, the client will not be able to trigger a manual recurring transaction / payment retry.
If the use case behind the question is about how the merchant(you) handles the flexible subscription billing period calculation upon payment failure/retries, it would be recommended that either you make fixed billing period start dates (continue the subscription) regardless of the payment delay, or suspend the client's subscription when payments failed, and resume it (calculate the new start date) when payment retry worked.
Both of the status/events above will trigger IPN messages to your listener, so that you may proceed either logic based on that.

PayPal Subscription Payment Failed

When a subscription payment fails, PayPal will retry for n times.
What transaction type (subscr_cancel or subscr_eot) is sent back via IPN, after all retries fail?
The specifics depend on the PayPal product you're using, although the logic works similar(`ish) across both Website Payments Standard subscription buttons and Express Checkout Recurring Payments (via the CreateRecurringPaymentsProfile API):
This depends on whether you've set MAXFAILEDPAYMENTS or not. If MAXFAILEDPAYMENTS > 0 is set, it will cancel the subscription after n number of attempts and you'll receive a subscr_cancel. If you have it set to MAXFAILEDPAYMENTS=0, you'll get recurring_payment_skipped and the recurring payment will be marked as having an outstanding balance. If you specify AUTOBILLOUTAMT=AutoBillAmt, the outstanding balance will be added to the next billing cycle.
I would suggest taking a look at https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables#id091EB0901HT which lists all IPN variables, including the ones for recurring payments.
Paypal returns subscr_failed for this case, and the possible return values are:
subscr_signup: subscription sign-up.
subscr_cancel: subscription cancellation.
subscr_failed: subscription payment failure.
subscr_payment: subscription payment.
subscr_eot: subscription’s end-of-term.
subscr_modify: subscription modification.
Please click here for further clarification.