Urgent Help Needed! Badges not being queried or applied!

Hello everyone!

I am completing a task for a client before my family and I move 1800 miles!
I’ve been at it ALL day and the last it just won’t come together.

The use-case:
My clients use badges to mark milestones and open up new courses for people based on how long they have been members.

I have the scheduled job code set to query the members for ACTIVE plans.
If a plan is found it gets the cycle/days the plan has been active.

That part is working like a charm! I

It’s SUPPOSED to get their badges after it “qualifies” their cycles.

If they DON’T already have the badge, it applies it and triggers an email.

If they DO have it then it does nothing and goes on to the next member.

I’ve got it set for “greater than or equal to” the number of cycles…

What am I doing wrong? There are no visible errors in the code, but when I run it, I don’t get my console logs indicating an error retrieving the badge - and it certainly isn’t applying them.

I’m sure it’s something dumb I’m overlooking - it’s been a long day of packing, cleaning, and running back and forth to correct the code, then schedule it, wait for it to run… edit, schedule, run, all day.

I REALLY need to get this done before we leave tomorrow around noon.

I am not able to hire anyone, so please just offer suggestions.

THANK YOU IN ADVANCE!!

Here is my code:

import { orders } from ‘wix-pricing-plans-backend’;
import { badges } from ‘wix-members-backend’;
import { triggeredEmails } from ‘wix-crm-backend’;
import { members } from ‘wix-members.v2’;

export async function processMembersWithActivePlans() {
console.log(“Scheduled job triggered at:”, new Date().toISOString());

const options = {
paging: { limit: 100, offset: 0 }
};

let allMembers = ;
let hasMore = true;

while (hasMore) {
try {
const memberBatch = await members.listMembers({
paging: { limit: 100, offset: options.paging.offset }
});

  allMembers = allMembers.concat(memberBatch.members);
  hasMore = memberBatch.metadata.count === options.paging.limit;
  options.paging.offset += options.paging.limit;
} catch (error) {
  console.error("Error fetching members:", error);
  return;
}

}

console.log(Total members fetched: ${allMembers.length});

const now = new Date();
const badgeMilestones = [
{ cycles: 3, days: 90, badgeId: ‘5b6ca01c-8623-4f5a-bc59-df3a5a899a80’, emailId: ‘3Month’ },
{ cycles: 6, days: 182, badgeId: ‘cb639627-8dee-44f4-baa2-9acf5c9fb584’, emailId: ‘6Month’ },
{ cycles: 9, days: 273, badgeId: ‘701b4458-b4d9-4bbd-a8bd-d7363edffb2e’, emailId: ‘9Month’ },
{ cycles: 12, days: 365, badgeId: ‘aa8c384b-de44-4d59-b4fe-e278c2f9f97e’, emailId: ‘12Month’ },
{ cycles: 18, days: 547, badgeId: ‘4350102f-b18d-44c0-8486-d27df9e955b3’, emailId: ‘18Month’ },
{ cycles: 24, days: 730, badgeId: ‘36b59b92-dc58-470b-89d2-fee541124eff’, emailId: ‘24Months’ }
];

for (const member of allMembers) {
const memberId = member._id;
console.log(Processing member ID: ${memberId});

try {
  const activeOrders = await fetchActiveOrders(memberId);

  if (activeOrders.length === 0) {
    console.log(`No active orders found for member ID: ${memberId}`);
    continue;
  }

  for (const memberOrder of activeOrders) {
    const { currentCycle } = memberOrder;
    const cyclesElapsed = currentCycle.index;
    const cycleStartDate = new Date(currentCycle.startedDate);
    const daysElapsed = Math.floor((now.getTime() - cycleStartDate.getTime()) / (1000 * 60 * 60 * 24));

    console.log(`Member ${memberId}: cyclesElapsed=${cyclesElapsed}, daysElapsed=${daysElapsed}`);

    for (const milestone of badgeMilestones) {
      if (cyclesElapsed >= milestone.cycles && daysElapsed >= milestone.days) {
        console.log(`Checking badge ${milestone.badgeId} for member ${memberId}`);
        
        const memberHasBadge = await checkMemberBadge(memberId, milestone.badgeId);
        console.log(`Member ${memberId} has badge ${milestone.badgeId}: ${memberHasBadge}`);

        if (!memberHasBadge) {
          try {
            console.log(`Assigning badge ${milestone.badgeId} to member ${memberId}`);
            await badges.assignMembers(milestone.badgeId, [memberId]);
            console.log(`Badge ${milestone.badgeId} successfully assigned to member ${memberId}`);

            const firstName = member.profile?.nickname || 'Member';
            let emailVariables = { 'contact.name.first': firstName };

            if (milestone.emailId === '3Month') {
              emailVariables.SITE_URL = "https://daretoconnectnow.com/3-month-advanced-course";
            }

            console.log(`Sending ${milestone.emailId} email to member ${memberId}`);
            await triggeredEmails.emailMember(milestone.emailId, memberId, {
              variables: emailVariables
            });
          } catch (assignError) {
            console.error(`Error assigning badge ${milestone.badgeId} to member ${memberId}:`, assignError);
          }
        } else {
          console.log(`Member ${memberId} already has badge ${milestone.badgeId}`);
        }
      }
    }
  }
} catch (error) {
  console.error(`Error processing member ID ${memberId}:`, error);
}

}

console.log(“Scheduled job completed at:”, new Date().toISOString());
}

async function fetchActiveOrders(memberId) {
try {
const ordersResults = await orders.listOrders({
buyerIds: [memberId],
orderStatuses: [“ACTIVE”]
});

const activeOrders = ordersResults || [];
console.log(`Found ${activeOrders.length} active orders for member ID: ${memberId}`);
return activeOrders;

} catch (error) {
console.error(Error fetching orders for member ID ${memberId}:, error);
return ;
}
}

async function checkMemberBadge(memberId, badgeId) {
try {
const memberBadges = await badges.listMemberBadges([memberId]);
const hasBadge = memberBadges.some(badge => badge.badgeIds.includes(badgeId));
return hasBadge;
} catch (error) {
console.error(Error checking badge for member ID ${memberId}:, error);
return false;
}
}