WIX Payment Plans expire = participants in course lose access - is there a solution? (need one fast 🙏)

- using WIX Studio

I just spent close to 3hrs on a support call with WIX and it seems I have no solution to my problem, so here I am hoping maybe one of you can confirm or knows a workaround.

I’m setting up a few client websites to sell online courses, so we’re using the Online Programs. They are all offering their courses with 2 payment options:

a) pay in full, flat fee

b) pay in 3x payments ($X/month for 3 months)

Today I just learned that when you setup a Payment Plan, and set to the max 3 months, that it then will actually expire thus removing the member/participant so they lose access to the course. Basically it works like a Netflix plan = no more payments, no more access. This is a huge limiting feature as most online courses nowadays have a payment plan option!

I tried to think of workarounds with automations to no avail. There’s no action to ADD a Participant to a program, only Remove Participant.

Then I started to think that maybe I can use a direct link from a button to go to a subscription I set in Stripe, but there’s no way to then have Stripe talk back to WIX to then add them to the course.

So the simple fact there’s no option to not have a participant stay in a course after a payment plan expires means that we can’t use WIX for selling online courses.

So after being deep in these setups for clients I’m totally hitting a wall I just feel like :sob: given my hard work put into these projects so far and it seems that WIX won’t work for their needs.

Has anyone found any solution for this type of payment structure? :pray::pray::pray::pray:

Could a webhook somehow work from Stripe?

I’m so desperate as I have deadlines and now thinking I may need to move everything to another platform.

p.s. On top of that, the checkout process is super awkward. They must go from my sales page to another course page (Visitor page) to then click on Join > then they must signup > then they have to check their email to get the verification code > then they get sent to the checkout. It’s totally backyards, all the courses I’ve ever purchased first get you to pay (you don’t want to loose them while they’re hot!) and then they get an access link via email to signup or temp password.

Did you find a solution to this? We are just about to load courses that we had plan to use an instalment option with - your issue has stopped us dead in our tracks thank heavens!!

1 Like

Yes I do actually! Here it is:

SOLVED :partying_face:

ALSO WIX is collecting votes for this feature:

Here’s a walkthrough:

Note » Ensure that in the Forever Access plan you uncheck this box or people will get access to all other programs that are connected as well:

Here’s the Velo code I used in the Automation:

/**
 * Autocomplete function declaration, do not delete
 * @param {import('./__schema__.js').Payload} options
 */
/**
 * Autocomplete function declaration, do not delete
 * @param {import('./__schema__.js').Payload} options
 */
import { checkout } from 'wix-pricing-plans-backend';

const FOREVER_ACCESS_PLAN_ID = "a16b4348-30d3-4193-a905-2fbf09965a8c";

export const invoke = async ({ payload }) => {
  console.log("invoke() function called with payload:", payload);

  // Check that payload exists
  if (!payload) {
    console.error("No payload provided!");
    return {};
  }
  
  // Extract buyerId from payload.contact_id
  const buyerId = payload.contact_id;
  console.log("Extracted buyerId:", buyerId);

  if (!buyerId) {
    console.error("contact_id not provided in payload");
    return {};
  }
  
  try {
    console.log("Calling checkout.createOfflineOrder with planId and buyerId...");
    // Call the API with the FOREVER_ACCESS_PLAN_ID and buyerId
    const orderResponse = await checkout.createOfflineOrder(FOREVER_ACCESS_PLAN_ID, buyerId,{suppressAuth:true});
    console.log("Offline order created successfully:", orderResponse);
  } catch (error) {
    console.error("Error creating offline order for Forever Access plan:", error);
  }
  
  return {}; // The automation requires returning an empty object
};