Customer has emailed receipt but no payment in user record

[s2Member Pro & actively keep WP and plugins up-to-date]

We converted from using PayPal to Stripe at the end of 2016 and everything seemed to be working fine. We received a report that someone paid last month to renew their annual dues in our non-profit org, and they have an emailed receipt to prove it, but their User info doesn’t reflect the payment in WordPress. Other users who have paid do show the updated payment gateway (Stripe) and an updated EOT, as well as other transition ID data.

No s2Members logs are created since we are not using debug. Does anyone know of a way to reconcile external records for payment (Stripe) with internal ones (all I seem to have is what’s in the User record – no reconciliation reports)? I didn’t find an error in any error logs. I haven’t been able to find anything anywhere to indicate a problem at the time of payment to explain what happened. The user did login on the date of payment and hasn’t logged in since.

Thank you for any assistance.

If they paid using Stripe, you just need to go into your Stripe account to check.

The org’s Treasurer has provided Stripe payment info that allows us to see the payment was successfully processed. Sometimes people use cards to pay that are in another name (wife, parent, whatever) that makes reconciliation more difficult. Thankfully this time is was clear, despite using a different email address than what was used on the website.

What I have found in recreating the issue is that despite Stripe sending back “invalid_request_error” and “No such customer” errors, it is still charging the credit card account. s2Member sees the errors and doesn’t update the user’s payment / EOT info. The error is caused by s2Member sending “Paid Subscr. ID” or “Paid Subscr. CID” that was from a previous PayPal transaction and Stripe cannot find it.

I observe that the majority of the members who have paid since the move from PayPal to Stripe in December had previously paid via PayPal, just like those who are failing now (some are new members and have no payment history). So far I have confirmed failures to reflect payment tracing back to May 15, 2017, but one on April 22, 2017, was okay (prior PayPal user).

I couldn’t find any notice that in switching from PayPal to Stripe I need to blank out “Paid Subscr. ID” or “Paid Subscr. CID” and I think it is supported to offer s2Member users the ability to have multiple payment options configured simultaneously to offer users choice of payment processors.

That’s what I suspected.

You can certainly offer different payment processors. But there’s no way that you or a member can transfer the details held by one payment processor to another. That’s because those details are stored by the payment processor and not by s2Member.

So if you want to migrate fully to Stripe, you need to cancel the PayPal subscription somehow (whether at EOT or otherwise) and then start again with a Stripe Billing Modification form.

At the point when the payment was made, the annual dues had already expired and the administrative notes in the user area listed:

Demoted by s2Member: Sun Jan 1, 2017 3:07 pm UTC
Paid Subscr. ID @ time of demotion: paypal → blah blah blah

It was a buy it now / one time payment type transaction. Other members with seemingly the same scenario were successful in paying dues in early April but something seems to change by the failed payment attempt for another person in mid-May.

Note: we programmatically modify EOT to be the next January 1 based upon business rules (e.g., Mon Jan 1, 2018 6:01 am UTC).

Here’s the code from the payment page (I replaced the site URL in “custom=” with “”:

Payment Process

Payment is processed via Stripe. Choose Annual or Lifetime in Checkout Options. Select Add Billing Method to enter or retrieve your payment details. Select Submit Form to process your payment.
[s2If !current_user_can(access_s2member_level2)]
[s2Member-Pro-Stripe-Form rp=“1” rr=“BN” cc=“USD” custom="<site URL>" ta=“0” tp=“0” tt=“Y” ]
[_s2If current_user_is(s2member_level0)]
[s2Member-Pro-Stripe-Form level=“1” desc=“Annual Membership $50” ra=“50.00” rt=“Y” /]
[/_s2If]
[_s2If current_user_is(s2member_level1)]
[s2Member-Pro-Stripe-Form level=“1” desc=“Annual Membership Renewal $50” ra=“50.00” rt=“Y” /]
[/_s2If]
[s2Member-Pro-Stripe-Form level=“2” desc=“Lifetime Membership $500” ra=“500.00” rt=“L” /]
[/s2Member-Pro-Stripe-Form]
[/s2If]
[s2If current_user_is(s2member_level2)]

Member Level: Lifetime (No payment required)

[/s2If]

… the HTML is getting rendered here so that may mess up what you see …

To me, at least, this looks more like a problem with Stripe. If it’s sending back “invalid_request_error” and “No such customer” errors, then it’s obviously telling s2Member not to do anything. Why it’s then charging the cards anyway is the question.

So I suggest contacting Stripe for an explanation.

It feels so inconvenient to use