ImpactMojo
Home My Account Browse Premium
Organization Tier

Your Organization

Manage your team, track learning progress, and build custom pathways.

0
Team Members
0
Available Seats
0
Learning Paths
0%
Avg Completion

Welcome to Your Organization Dashboard

Get your team up and running in three steps:

1. Invite Your Team

Add members by email. They'll get instant access to all Organization-tier content and tools.

2. Create Learning Paths

Build custom course sequences aligned to your team's capacity-building goals.

3. Track Progress

Monitor completion rates, quiz scores, and engagement across your entire team.

What's Included in Your Organization Plan

11 Flagship Courses

MEL, DevEcon, DataViz, AI for Impact, Gandhi, Politics of Aspiration, Media, SEL, Constitution & Law

11 Interactive Labs

MEL Design, Qual Insights, Risk Mitigation, Policy Advocacy, and 7 more hands-on workbenches

Premium Tools

TOC Workbench Pro, Qual Insights Lab, VaniScribe AI, Code Convert Pro, DevData Practice, and more

Branded Certificates

Completion certificates for your team members with your organization branding

Dedicated Support

Priority support and a dedicated account manager for your organization

Invoice Billing

Purchase orders, bank transfers, and GST-compliant invoicing for your procurement team

Team Features

LIVE

Team Training Packages

Pre-built training paths, facilitator guides, assessment rubrics, and cohort management. Go to the Training tab below.

LIVE

Open Badges & Micro-credentials

W3C-standard verifiable digital credentials shareable on LinkedIn, proving your team's mastery of development competencies. Badges are auto-issued on course completion and visible in the Account page.

LIVE

Team Challenges

Unlimited access to all Live Case Challenges for every team member, plus request custom challenges tailored to your organisation's programs. Go to the Team Challenges tab below.

Name Email Role Progress Status Actions

No team members yet. Invite your first member above.

Pre-built Training Packages

Curated course sequences for common development roles. Deploy to your team in one click.

MEL Officer

5 courses · 12 weeks

Build core MEL competencies: theory of change, indicator design, data collection, analysis, and reporting for development programs.

MEL Data Visualization Dev Economics AI for Impact SEL

Program Manager

4 courses · 10 weeks

Develop program design, stakeholder management, and evidence-based decision-making skills for mid-level program staff.

Dev Economics MEL Data Visualization Media for Development

Field Staff

3 courses · 6 weeks

Essential data collection, community engagement, and social-emotional skills for frontline development workers.

MEL SEL Media for Development

Policy & Governance Officer

4 courses · 10 weeks

Policy analysis, constitutional literacy, and accountability frameworks for governance and policy officers.

Constitution & Law Gandhian Philosophy Politics of Aspiration Dev Economics

Cohort Management

Schedule training cohorts, set deadlines, and track group progress.

No Cohorts Yet

Create a training cohort to schedule group learning with deadlines and milestones.

Facilitator Guides

Complete session plans for team leads running group training. Each guide includes learning objectives, discussion prompts, activities, time estimates, and collaborative workshop templates.

MEL Foundations

8 sessions · 16 hours

Theory of Change Indicators Data Collection Logframes

Data Visualization

6 sessions · 12 hours

Chart Design Dashboards Storytelling

Development Economics

10 sessions · 20 hours

Market Failures RCTs Impact Eval Cost-Benefit

AI for Impact

6 sessions · 12 hours

Prompt Design Ethics Use Cases

Social-Emotional Learning

6 sessions · 12 hours

Self-Awareness Empathy Resilience
Facilitation Resources: Each guide includes interactive workshop templates (Theory of Change builder, Stakeholder Map, Empathy Map, Chart Selector, AI Canvas) for collaborative sessions, printable handouts, and debrief frameworks. Need custom facilitation support? Contact hello@impactmojo.in

Assessment Rubrics

Standardized scoring criteria for evaluating team members' course work, portfolio submissions, and peer reviews.

Course Quiz Performance

Evaluate quiz scores across courses. Includes proficiency thresholds and competency mapping.

AUTO-SCORED
Developing < 50%
Proficient 50–79%
Mastery ≥ 80%

Portfolio Submission Rubric

For evaluating applied work products — theory of change diagrams, data dashboards, evaluation plans.

MANAGER-SCORED
CriterionDeveloping (1)Proficient (2)Mastery (3)
Technical AccuracyMajor errors or omissionsGenerally correct with minor gapsAccurate and comprehensive
Practical ApplicationTheoretical only, no contextSome real-world applicationClearly applied to org context
CommunicationUnclear or poorly structuredAdequate presentationClear, concise, and actionable

Peer Review Rubric

Guidelines for team members reviewing each other's work. Encourages constructive feedback and collaborative learning.

PEER-SCORED
Strengths — What was done well?
Suggestions — What could improve?
Actionable Next Steps — Specific recommendations

Custom Learning Paths

No Learning Paths Yet

Create custom course sequences aligned to your team's capacity needs.

Loading Team Analytics...

Team Challenges

Your team gets unlimited access to all 9 Live Case Challenges plus the ability to request custom challenges tailored to your organisation's work.

Available Challenges

All team members have full access to every challenge (including Practitioner-tier challenges) at no extra cost.

Loading challenges...

Request a Custom Challenge

Need a challenge based on your organisation's real programs or sector? Describe what you need and we'll design a custom case challenge with rubrics, resources, and expert review for your team.

Your Challenge Requests

No custom challenge requests yet.

Organization Settings

Invoice Billing

Need purchase orders or bank transfer options? Contact us at hello@impactmojo.in and we'll work with your procurement team.

'; var blob = new Blob([printHtml], { type: 'text/html;charset=utf-8' }); var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = guide.title.toLowerCase().replace(/[^a-z0-9]+/g, '-') + '.html'; a.click(); URL.revokeObjectURL(a.href); }; // ========== Cohort Management (Supabase-backed) ========== var cohorts = []; var sb = window.supabaseClient; // Package → course mapping var PACKAGE_COURSES = { 'mel-officer': ['mel', 'dataviz', 'devai', 'devecon', 'sel'], 'program-manager': ['mel', 'dataviz', 'devecon', 'media'], 'field-staff': ['mel', 'sel', 'media'], 'governance': ['law', 'gandhi', 'poa', 'devecon'], 'custom': [] }; async function loadCohorts() { if (!orgData || !sb) return; try { var { data, error } = await sb.from('cohorts') .select('*, cohort_members(user_id, status, progress_percentage, profiles:user_id(display_name, full_name, email))') .eq('org_id', orgData.id) .order('start_date', { ascending: false }); if (error) throw error; cohorts = data || []; } catch (e) { console.warn('Cohort load failed, falling back to localStorage:', e); var stored = localStorage.getItem('impactmojo_cohorts_' + orgData.id); cohorts = stored ? JSON.parse(stored) : []; } renderCohorts(); } function renderCohorts() { var container = document.getElementById('cohortsList'); if (!cohorts.length) { container.innerHTML = '

No Cohorts Yet

Create a training cohort to schedule group learning with deadlines and milestones.

'; return; } var packageNames = { 'mel-officer': 'MEL Officer', 'program-manager': 'Program Manager', 'field-staff': 'Field Staff', 'governance': 'Policy & Governance Officer', 'custom': 'Custom Path' }; container.innerHTML = cohorts.map(function(c) { var now = new Date(); var start = new Date(c.start_date || c.startDate); var end = new Date(c.end_date || c.endDate); var status = c.status ? c.status.charAt(0).toUpperCase() + c.status.slice(1) : (now < start ? 'Upcoming' : now > end ? 'Completed' : 'Active'); var statusColor = status === 'Active' ? '#10B981' : status === 'Upcoming' ? '#F59E0B' : 'var(--text-muted)'; // Members from Supabase join or legacy format var memberList = c.cohort_members || []; var memberChips = memberList.map(function(m) { var name = m.profiles?.display_name || m.profiles?.full_name || m.profiles?.email || 'Member'; var prog = m.progress_percentage || 0; return '' + escHtml(name) + (prog > 0 ? ' (' + prog + '%)' : '') + ''; }).join(''); // Fallback for legacy localStorage cohorts if (!memberChips && c.memberNames) { memberChips = c.memberNames.map(function(n) { return '' + escHtml(n) + ''; }).join(''); } var cohortId = c.id; var daysLeft = Math.ceil((end - now) / 86400000); var deadlineInfo = status === 'Active' && daysLeft >= 0 ? '
' + daysLeft + ' days left
' : ''; var avgProgress = memberList.length > 0 ? Math.round(memberList.reduce(function(s, m) { return s + (m.progress_percentage || 0); }, 0) / memberList.length) : 0; return '
' + '
' + '

' + escHtml(c.name) + '

' + '' + status + '' + '
' + '' + '' + '
' + '
' + '
' + (c.start_date || c.startDate) + ' → ' + (c.end_date || c.endDate) + '
' + '
' + memberList.length + ' members
' + '
' + (packageNames[c.package_id || c.packageId] || c.package_id || c.packageId || '') + '
' + deadlineInfo + '
' + (avgProgress > 0 ? '
Avg. Progress' + avgProgress + '%
' : '') + (memberChips ? '
' + memberChips + '
' : '') + '
'; }).join(''); } window.openCohortModal = function() { var selector = document.getElementById('cohortMemberSelector'); if (members.length === 0) { selector.innerHTML = '

Add team members first to assign them to cohorts.

'; } else { selector.innerHTML = members.filter(function(m) { return m.status === 'active'; }).map(function(m) { var name = m.profiles?.display_name || m.profiles?.full_name || m.profiles?.email || 'Member'; return ''; }).join(''); } var today = new Date(); document.getElementById('cohortStartDate').value = today.toISOString().slice(0, 10); var endDate = new Date(today.getTime() + 84 * 86400000); document.getElementById('cohortEndDate').value = endDate.toISOString().slice(0, 10); document.getElementById('cohortModal').classList.add('active'); }; window.createCohort = async function() { var name = document.getElementById('cohortName').value.trim(); var packageId = document.getElementById('cohortPackage').value; var startDate = document.getElementById('cohortStartDate').value; var endDate = document.getElementById('cohortEndDate').value; if (!name) { alert('Please enter a cohort name.'); return; } if (!startDate || !endDate) { alert('Please set start and end dates.'); return; } if (new Date(endDate) <= new Date(startDate)) { alert('End date must be after start date.'); return; } var selectedMembers = []; document.querySelectorAll('#cohortMemberSelector input:checked').forEach(function(cb) { selectedMembers.push(cb.value); }); var courseIds = PACKAGE_COURSES[packageId] || []; try { // Insert cohort var { data: cohort, error } = await sb.from('cohorts').insert({ org_id: orgData.id, name: name, package_id: packageId, course_ids: courseIds, start_date: startDate, end_date: endDate, created_by: ImpactMojoAuth.getUser().id }).select().single(); if (error) throw error; // Enroll selected members if (selectedMembers.length > 0) { var enrollments = selectedMembers.map(function(uid) { return { cohort_id: cohort.id, user_id: uid }; }); var { error: enrollError } = await sb.from('cohort_members').insert(enrollments); if (enrollError) console.error('Enroll error:', enrollError); } await loadCohorts(); closeModal('cohortModal'); document.getElementById('cohortName').value = ''; } catch (e) { console.error('Create cohort error:', e); alert('Failed to create cohort. Please try again.'); } }; window.deleteCohort = async function(cohortId) { if (!confirm('Remove this cohort? This will unenroll all members.')) return; try { var { error } = await sb.from('cohorts').delete().eq('id', cohortId); if (error) throw error; await loadCohorts(); } catch (e) { console.error('Delete cohort error:', e); alert('Failed to remove cohort.'); } }; // ========== Cohort Discussion Threads ========== window.openCohortDiscussion = async function(cohortId) { var cohort = cohorts.find(function(c) { return c.id === cohortId; }); if (!cohort) return; document.getElementById('discussionCohortTitle').textContent = cohort.name; document.getElementById('discussionCohortId').value = cohortId; document.getElementById('discussionInput').value = ''; // Load discussion posts var container = document.getElementById('discussionPosts'); container.innerHTML = '

Loading...

'; document.getElementById('cohortDiscussionModal').classList.add('active'); try { var { data: posts, error } = await sb.from('cohort_discussions') .select('*, profiles:user_id(display_name, full_name, avatar_url)') .eq('cohort_id', cohortId) .is('parent_id', null) .order('created_at', { ascending: true }); if (error) throw error; if (!posts || posts.length === 0) { container.innerHTML = '

No discussions yet. Start the conversation!

'; return; } container.innerHTML = posts.map(function(p) { var authorName = p.profiles?.display_name || p.profiles?.full_name || 'Member'; var timeAgo = formatTimeAgo(new Date(p.created_at)); var isOwn = ImpactMojoAuth.getUser() && p.user_id === ImpactMojoAuth.getUser().id; return '
' + '
' + '' + escHtml(authorName) + '' + '' + timeAgo + '' + '
' + '

' + escHtml(p.content) + '

' + (isOwn ? '' : '') + '
'; }).join(''); } catch (e) { console.error('Load discussions error:', e); container.innerHTML = '

Failed to load discussions.

'; } }; function formatTimeAgo(date) { var seconds = Math.floor((new Date() - date) / 1000); if (seconds < 60) return 'just now'; var minutes = Math.floor(seconds / 60); if (minutes < 60) return minutes + 'm ago'; var hours = Math.floor(minutes / 60); if (hours < 24) return hours + 'h ago'; var days = Math.floor(hours / 24); if (days < 7) return days + 'd ago'; return date.toLocaleDateString('en-IN', { day: 'numeric', month: 'short' }); } window.postDiscussion = async function() { var cohortId = document.getElementById('discussionCohortId').value; var content = document.getElementById('discussionInput').value.trim(); if (!content) return; var user = ImpactMojoAuth.getUser(); if (!user) { alert('Please log in to post.'); return; } try { var { error } = await sb.from('cohort_discussions').insert({ cohort_id: cohortId, user_id: user.id, content: content }); if (error) throw error; document.getElementById('discussionInput').value = ''; await window.openCohortDiscussion(cohortId); } catch (e) { console.error('Post discussion error:', e); alert('Failed to post. Please try again.'); } }; window.deleteDiscussionPost = async function(postId, cohortId) { if (!confirm('Delete this post?')) return; try { await sb.from('cohort_discussions').delete().eq('id', postId); await window.openCohortDiscussion(cohortId); } catch (e) { console.error('Delete post error:', e); } }; // Cohorts lazy-loading — expose for tab click handler window._orgLoadCohorts = loadCohorts; // ========== Team Challenges Tab ========== async function loadTeamChallenges() { try { var resp = await fetch('data/challenges.json'); var challenges = await resp.json(); var container = document.getElementById('teamChallengesList'); if (!challenges || !challenges.length) { container.innerHTML = '

No challenges available.

'; return; } container.innerHTML = challenges.map(function(ch) { var diffColor = ch.difficulty === 'Beginner' ? '#10B981' : ch.difficulty === 'Intermediate' ? '#F59E0B' : '#EF4444'; return '
' + '
' + '
' + escHtml(ch.title) + '
' + '
' + '' + escHtml(ch.trackLabel || ch.track) + '' + '' + ch.difficulty + '' + 'Included' + '
' + '
' + 'Open' + '
'; }).join(''); } catch (e) { console.error('Failed to load challenges:', e); document.getElementById('teamChallengesList').innerHTML = '

Could not load challenges.

'; } } async function loadChallengeRequests() { if (!orgData || !ImpactMojoAuth.getUser()) return; try { var sb = window.supabaseClient; var { data, error } = await sb.from('challenge_requests') .select('*') .eq('org_id', orgData.id) .order('created_at', { ascending: false }); var container = document.getElementById('challengeRequestsList'); if (error || !data || !data.length) { container.innerHTML = '

No custom challenge requests yet.

'; return; } container.innerHTML = data.map(function(r) { var statusColor = r.status === 'pending' ? '#F59E0B' : r.status === 'in_progress' ? '#0EA5E9' : r.status === 'completed' ? '#10B981' : 'var(--text-muted)'; var statusLabel = r.status === 'pending' ? 'Pending' : r.status === 'in_progress' ? 'In Progress' : r.status === 'completed' ? 'Ready' : r.status; return '
' + '
' + '' + escHtml(r.topic) + '' + '' + statusLabel + '' + '
' + '

' + escHtml(r.track) + ' · ' + escHtml(r.difficulty) + ' · ' + new Date(r.created_at).toLocaleDateString('en-IN', { day: 'numeric', month: 'short', year: 'numeric' }) + '

' + '
'; }).join(''); } catch (e) { console.error('Failed to load challenge requests:', e); } } window.submitChallengeRequest = async function(e) { e.preventDefault(); var btn = document.getElementById('challengeSubmitBtn'); btn.disabled = true; btn.innerHTML = ' Submitting...'; var topic = document.getElementById('challengeTopic').value.trim(); var track = document.getElementById('challengeTrack').value; var description = document.getElementById('challengeDescription').value.trim(); var participants = document.getElementById('challengeParticipants').value; var difficulty = document.getElementById('challengeDifficulty').value; if (!topic || !track || !description) { alert('Please fill in all required fields.'); btn.disabled = false; btn.innerHTML = ' Submit Challenge Request'; return; } try { var user = ImpactMojoAuth.getUser(); var sb = window.supabaseClient; var { error } = await sb.from('challenge_requests').insert({ org_id: orgData.id, requested_by: user.id, topic: topic, track: track, description: description, participants: parseInt(participants) || null, difficulty: difficulty, status: 'pending' }); if (error) throw error; document.getElementById('customChallengeForm').style.display = 'none'; document.getElementById('challengeRequestSuccess').style.display = 'block'; loadChallengeRequests(); } catch (err) { console.error('Challenge request failed:', err); alert('Failed to submit request. Please try again or email hello@impactmojo.in.'); btn.disabled = false; btn.innerHTML = ' Submit Challenge Request'; } }; // Challenges lazy-loading — expose for tab click handler window._orgLoadChallenges = function() { loadTeamChallenges(); loadChallengeRequests(); }; // Initialize // Use AuthGate for consistent loading overlay + auth handling // Don't use requiredTier since admins of any tier should also have access AuthGate.protect({ loadingEl: document.getElementById('loadingOverlay'), redirectUrl: '/login.html', timeoutMs: 5000, onReady: function(user, profile) { // Allow access if tier is 'organization' OR role is 'admin' if (!profile || (profile.subscription_tier !== 'organization' && profile.role !== 'admin')) { denyAccess(); return; } loadOrgData(profile); }, onDenied: function() { denyAccess(); } }); })();