Importing Existing Subscriptions

To import existing subscription customers into s2Member, you can include the Subscription ID in the member's profile, so that s2Member can receive future communication about these members from PayPal's IPN service.

So, if you include the Paid Subscr. ID value when you do the import, and your PayPal IPN URL is reporting properly to your installation of s2Member (WP Admin -> s2Member -> PayPal Options -> IPN), s2Member can automate the management of these paying customers.

This includes any associated payments, cancellations, refunds, chargebacks, etc. If s2Member has the Paid Subscr. ID value, and PayPal is sending s2Member IPNs, these events can be handled by s2Member, including any EOT (End Of Term) events.

Now, in practice this is not always easy to accomplish. For instance, if your previous membership software used the PayPal Button integration and an IPN URL was established on a transaction basis, it might not be possible to update the IPN URL for each of your existing Members before importing them into s2Member (PayPal has some limitations in this regard).

Another issue is that s2Member expects to receive IPN data with the PayPal "custom" value set to your installation domain name, and with a proper item_number value, matching s2Member's standardization. Further details on this in your Dashboard under: WP Admin -> s2Member -> PayPal Options -> IPN.

In cases where these technical challenges get in the way of a smooth migration, we recommend that you import your existing userbase with a pre-configured EOT Time. Setting the EOT Time during your import will ensure that s2Member terminates each Member's access at the correct point in time, based on the data in your import, and without any reliance on existing IPN communication, which might have previously been configured to work with an entirely different software application.

Setting an EOT Time when importing Users/Members from software applications you used prior to running s2Member, is a very reliable way to deal with things. It leaves little doubt about how s2Member and any existing IPN data might be handled in the future. A pre-configured EOT Time establishes the exact date on which a Member's account will lose paid access. After import, this value can also be changed by editing the user's profile from WP Admin.

Pages Missing From Specific Post/Page Button Generator

You're trying to use s2Member's Specific Post/Page Access Restrictions, and although you've protected several Posts/Pages this way, they're not showing up in the Specific Post/Page Button Generator?

I would suspect that you've created a conflict by mistake. s2Member will not allow you to generate a Payment Button that facilitates Specific Post/Page Access, with any Post/Page which is already protected with Membership Level Restrictions (of any kind). WP Admin -> s2Member -> Restriction Options -> Specific Post/Page

Also, please be careful not to create a conflict with other Access Restrictions. If you are going to sell Specific Post/Page Access, you should enter specific Post/Page IDs here; and make SURE that you've NOT already protected any of these Posts/Pages with Member Level Access Restrictions.

In other words, if you configure s2Member, in such as a way, that a Post/Page requires Membership Level Access, you cannot sell that same Post/Page through Specific Post/Page Access. Doing so, would create a conflict. Customers that purchased Specific Post/Page Access, would be unable to access the Post/Page – without also having a Membership. Not good. So please be careful.

In other words, if the Posts/Pages are not showing up in the Button Generator, it's most likely because those Posts/Pages are already protected by s2Member's Membership functionality in some way.

I would review all the WP Admin -> s2Member -> Restriction Options to be sure these Posts/Pages (i.e. the ones that are NOT showing up) are only protected with Specific Post/Page Restrictions, and nothing else. Look for anything which includes multiple areas of your site, like Tag Restrictions, Category Restrictions, URI Restrictions, or the special keyword "all".

I login but get logged out

I login and am taken to the Login Welcome Page, but as soon as I surf around the site and come back to the Login Welcome Page, I get sent to the Membership Options Page as a visitor.

The problem may be that you're mixing the use of the www subdomain in your links: vs. They're not the same site for the login session.

When a user logs in under, he's logged into the site without the www, but if then your menu links point to, it's like taking him to a different site where he's not logged in.

Web browsers treat those two as entirely different domains, so when you try to visit a protected page with the www URL when you logged into the URL without it, you're not logged in and get redirected to the Membership Options Page if you try to access protected content. It's like being a visitor instead of a paying member.

Please see this article for more information:

Your menu links may be using the www while your site doesn't, and that's what's causing the problem. A user logs in at the non-www version of the URL and then, once they click one of the menu items, are now considered "not logged in".

Please update all your links to the version your WordPress installation uses.

Registration/Profile Fields Missing In Form

When you configure Custom Registration/Profile Fields with s2Member, those will show on your Pro Form during registration. However, they'll only be visible in the context in which they were configured.

For example, if you configure Custom Registration/Profile Fields for Members at Level 1, they'll only be displayed during registration if your Pro Form provides access to Level 1. WP Admin -> s2Member -> General -> Registration/Profile -> Custom Field -> Applicable Membership Levels

Please use comma-delimited Level #'s: 0,1,2,3,4 or type: all.

This allows you to enable this field only at specific Membership Levels.

Also, if you're already logged in when you test your Pro Forms, you won't see these fields, because s2Member assumes they've already been collected.

Profile fields are shown when the pro-form is used for registration (i.e. creating an account, free or paid). When the user is logged in, then the pro-form is only for payment, not editing the profile.

Members Not Demoted After Failed Payments

If your members are not being demoted after their payments failed, it may be that s2Member is stopping on a failure to locate the item_number associated with the original transaction.

I suspect this is because your customer originally purchased access to your site while you were running an older version of s2Member.

Unfortunately, this particular type of IPN that PayPal sends to s2Member, does not include the rp_invoice_id, or the PROFILEREFERENCE. This forces s2Member to keep a copy of this data locally, so it can reference this vital information and process the EOT.

s2Member started keeping this information locally, starting with version 110927. So if this particular customer signed up originally under a release prior, this could be the result. Unfortunately, there's not much we can do about this now. PayPal changed the rules on us a bit, and we had to adapt accordingly.

Members that signed up in earlier versions of s2Member may fail to expire in certain circumstances. This issue affected certain types of transactions where the storage of IPN Signup Vars was required by s2Member in order to fulfill its obligation later on, in being able to properly terminate access upon receipt of this IPN from PayPal. Newer versions of s2Member resolve this issue.

If you have several members this is affecting, my suggestion would be a manual EOT Time through your Dashboard. In your Dashboard you can set the EOT Time for certain customers, and s2Member will be perfectly capable of processing EOTs at the times you set, regardless of this issue.

Of course, for any customer that originally paid you under a release of s2Member v110927 or newer, you won't need to do this.

Here's how the missing item_number would look in a log entry:

array (
  0 => 'IPN received on: Tue Jan 31, 2012 10:41:54 am UTC',
  1 => 's2Member POST vars verified through a POST back to PayPal.',
  2 => 's2Member originating domain (`$_SERVER["HTTP_HOST"]`) validated.',
'subscr_gateway' => 'paypal',
'subscr_id' => 'I-NPR3...',
'period1' => '0 D',
'period3' => '1 D',
'item_number' => false,