[Wishlist] Bulk select and verify email for all members at once in dashboard
Would like to be able to select ALL members from the list in the dashboard and then be able to verify the email for all members at one time.
Would like to be able to select ALL members from the list in the dashboard and then be able to verify the email for all members at one time.
Comments
2 comments
Agreed! No ETA, but I can see how this would be a huge time saver.
Three Implementation Options:
Key Features:
Setup Steps:
Important: Keep your API key secure and only use it server-side. Never expose it in client-side code or public repositories.
// ============================================
// MEMBERSTACK 2.0 BULK EMAIL VERIFICATION
// ============================================
// OPTION 1: Node.js + Express Backend
// ============================================
const express = require('express');
const memberstackAdmin = require('@memberstack/admin');
const app = express();
app.use(express.json());
const memberstack = memberstackAdmin.init(process.env.MEMBERSTACK_API_KEY);
// Endpoint to bulk verify all unverified members
app.post('/api/bulk-verify-emails', async (req, res) => {
try {
const verified = [];
const failed = [];
let nextCursor = null;
let hasMore = true;
// Paginate through all members
while (hasMore) {
const response = await memberstack.members.list({
limit: 50,
after: nextCursor
});
const members = response.data || [];
// Process each member
for (const member of members) {
try {
// Check if member is not verified
if (member.auth?.verifiedEmail === false) {
// Update member to mark as verified
await memberstack.members.update(member.id, {
auth: {
verifiedEmail: true
}
});
verified.push({
id: member.id,
email: member.auth?.email
});
}
} catch (error) {
failed.push({
id: member.id,
email: member.auth?.email,
error: error.message
});
}
}
// Check for pagination
hasMore = response.hasMore || false;
nextCursor = response.endCursor || null;
}
res.json({
success: true,
summary: {
verified: verified.length,
failed: failed.length,
totalProcessed: verified.length + failed.length
},
verified,
failed
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
// ============================================
// OPTION 2: REST API (JavaScript/Frontend)
// ============================================
async function bulkVerifyMembersREST() {
const API_KEY = process.env.MEMBERSTACK_SECRET_KEY;
const BASE_URL = 'https://admin.memberstack.com/members';
const headers = {
'X-API-KEY': API_KEY,
'Content-Type': 'application/json'
};
try {
let allMembers = [];
let nextCursor = null;
let hasMore = true;
// Fetch all members with pagination
while (hasMore) {
const url = nextCursor
? `${BASE_URL}?limit=50&after=${nextCursor}`
: `${BASE_URL}?limit=50`;
const response = await fetch(url, {
method: 'GET',
headers
});
const data = await response.json();
allMembers = allMembers.concat(data.data || []);
hasMore = data.hasMore || false;
nextCursor = data.endCursor || null;
}
// Filter unverified members
const unverifiedMembers = allMembers.filter(
m => m.auth?.verifiedEmail === false
);
const results = {
verified: [],
failed: [],
skipped: allMembers.length - unverifiedMembers.length
};
// Update each unverified member
for (const member of unverifiedMembers) {
try {
const response = await fetch(
`${BASE_URL}/${member.id}`,
{
method: 'PATCH',
headers,
body: JSON.stringify({
auth: {
verifiedEmail: true
}
})
}
);
if (response.ok) {
results.verified.push({
id: member.id,
email: member.auth?.email
});
} else {
results.failed.push({
id: member.id,
email: member.auth?.email,
error: `HTTP ${response.status}`
});
}
} catch (error) {
results.failed.push({
id: member.id,
email: member.auth?.email,
error: error.message
});
}
}
return {
success: true,
summary: {
total: allMembers.length,
verified: results.verified.length,
failed: results.failed.length,
skipped: results.skipped
},
...results
};
} catch (error) {
console.error('Bulk verification error:', error);
throw error;
}
}
// ============================================
// OPTION 3: Verify Specific Members by ID
// ============================================
async function verifySpecificMembersREST(memberIds) {
const API_KEY = process.env.MEMBERSTACK_SECRET_KEY;
const BASE_URL = 'https://admin.memberstack.com/members';
const headers = {
'X-API-KEY': API_KEY,
'Content-Type': 'application/json'
};
const results = { verified: [], failed: [] };
for (const memberId of memberIds) {
try {
const response = await fetch(
`${BASE_URL}/${memberId}`,
{
method: 'PATCH',
headers,
body: JSON.stringify({
auth: {
verifiedEmail: true
}
})
}
);
if (response.ok) {
const member = await response.json();
results.verified.push({
id: memberId,
email: member.data?.auth?.email
});
} else {
results.failed.push({
id: memberId,
error: `HTTP ${response.status}`
});
}
} catch (error) {
results.failed.push({
id: memberId,
error: error.message
});
}
}
return {
success: results.failed.length === 0,
verified: results.verified.length,
failed: results.failed.length,
details: results
};
}
// ============================================
// USAGE EXAMPLES
// ============================================
Please sign in to leave a comment.