Skip to main content

๐Ÿ“Š Projects Module

๐ŸŽฏ Overviewโ€‹

The Projects module manages customer engagement, retention, and loyalty tracking through automated pulse notifications and account health monitoring. This module runs multiple parallel services that analyze account activity, track loyalty milestones, and create engagement pulses.

Module Path: queue-manager/crons/projects.js
Cron Schedule: Every 5 minutes (*/5 * * * *)
Services: 7 parallel processors
Business Impact: HIGH - Customer retention and engagement

๐Ÿ“ Module Structureโ€‹

projects/
โ”œโ”€โ”€ crons/
โ”‚ โ””โ”€โ”€ projects.js # Main cron orchestrator (runs all 7 services)
โ”œโ”€โ”€ services/
โ”‚ โ”œโ”€โ”€ accountChurnRisk.js # Churn probability calculation
โ”‚ โ”œโ”€โ”€ syncAccounts.js # Account data synchronization
โ”‚ โ”œโ”€โ”€ inactiveTaskPulse.js # Inactive task monitoring
โ”‚ โ”œโ”€โ”€ loyaltyMilestone.js # Loyalty tier tracking (674 lines)
โ”‚ โ”œโ”€โ”€ reviewRequestPulse.js # Review automation
โ”‚ โ”œโ”€โ”€ quarterlyCheckInPulse.js # Quarterly engagement
โ”‚ โ””โ”€โ”€ cleanupPulses.js # Pulse data maintenance
โ””โ”€โ”€ queues/
โ”œโ”€โ”€ accountChurn.js # Churn risk queue processor
โ”œโ”€โ”€ inactiveTaskPulse.js # Task pulse queue processor
โ”œโ”€โ”€ reviewRequestPulse.js # Review request queue processor
โ””โ”€โ”€ quarterlycheckinpulse.js # Check-in queue processor

๐Ÿ”„ Processing Flowโ€‹

sequenceDiagram
participant CRON as Cron Schedule
participant ORCH as Projects Orchestrator
participant SVC1 as Churn Risk Service
participant SVC2 as Loyalty Service
participant SVC3 as Pulse Services
participant QUEUE as Bull Queues
participant MONGO as MongoDB

CRON->>ORCH: Every 5 minutes

par Parallel Execution
ORCH->>SVC1: calculateChurnRisk()
SVC1->>MONGO: Query account activity
SVC1->>QUEUE: Add churn risk jobs

ORCH->>SVC2: loyaltyMilestone()
SVC2->>MONGO: Query subscriptions
SVC2->>MONGO: Create loyalty pulses

ORCH->>SVC3: Pulse services (4 types)
SVC3->>MONGO: Create/check pulses
SVC3->>QUEUE: Add pulse jobs
end

๐ŸŽฏ Sub-Processorsโ€‹

Customer Health & Retentionโ€‹

Engagement Pulsesโ€‹

Maintenanceโ€‹

๐Ÿ—„๏ธ Database Collectionsโ€‹

Primary Collectionsโ€‹

projects-pulseโ€‹

  • Purpose: Stores all pulse notifications (tasks, reviews, check-ins, loyalty)
  • Model: models/projects-pulse.js
  • Indexed Fields: account, type, status, createdAt

store-subscriptionโ€‹

  • Purpose: Subscription data for loyalty tier calculations
  • Model: models/store-subscription.js
  • Used By: Loyalty milestone processor

configโ€‹

  • Purpose: Stores loyalty program configuration with dynamic tiers
  • Model: models/config.js
  • Type: loyalty-program

accountโ€‹

  • Purpose: Account data for churn risk and synchronization
  • Model: models/account.js
  • Used By: Churn risk, sync accounts

๐Ÿ”ง Environment Configurationโ€‹

# Projects Module Control
QM_PROJECTS=true # Enable projects module

# Module Dependencies
MONGO_DB_URL=mongodb://localhost:27017/dashclicks
REDIS_HOST=localhost
REDIS_PORT=6379

๐Ÿ”„ Orchestrator Patternโ€‹

The projects cron uses a parallel execution pattern:

exports.start = async () => {
cron.schedule('*/5 * * * *', async () => {
if (!inProgress) {
inProgress = true;
try {
// All services run in parallel
await accountChurnRiskService.calculateChurnRisk();
await syncAccountsService.syncAccounts();
await inactiveTaskPulse.createInactiveTaskPulse();
await inactiveTaskPulse.checkCompleteTaskAndRemovePulse();
await loyaltyPulse.loyaltyMilestone();
await reviewRequestPulse.reviewRequestPulse();
await quarterlyCheckInPulseService.quarterlyCheckInPulse();
await cleanupPulsesService.cleanupPulses();
} finally {
inProgress = false;
}
}
});
};

๐Ÿ“Š Pulse Typesโ€‹

1. Inactive Task Pulseโ€‹

  • Trigger: Tasks with no activity
  • Action: Create notification pulse
  • Cleanup: Remove when task completed

2. Review Request Pulseโ€‹

  • Trigger: Customer satisfaction milestones
  • Action: Request product review
  • Frequency: Configurable per account

3. Quarterly Check-In Pulseโ€‹

  • Trigger: Every 90 days
  • Action: Schedule customer engagement call
  • Purpose: Proactive account management

4. Loyalty Milestone Pulseโ€‹

  • Trigger: MRR tier changes
  • Action: Celebrate customer loyalty
  • Tiers: Dynamic from config (Bronze, Silver, Gold, etc.)

๐Ÿšจ Error Handlingโ€‹

Each service has independent error handling:

try {
await service.process();
} catch (error) {
logger.error({
initiator: 'QM/projects/[service]',
error: error,
});
}

Failures in one service don't affect others due to parallel execution.

๐Ÿ“ˆ Performance Considerationsโ€‹

Execution Timeโ€‹

  • Average: 2-5 seconds
  • Peak: 10-15 seconds (during heavy loyalty calculations)
  • Timeout: None (runs until completion)

Database Loadโ€‹

  • Loyalty Milestone: Heaviest (aggregation queries)
  • Churn Risk: Moderate (account queries)
  • Pulses: Light (simple CRUD operations)

Concurrencyโ€‹

  • All 7 services run in parallel
  • Individual service locking not required
  • Cron-level lock prevents overlapping executions

Module Type: Customer Engagement
Execution: Parallel
Priority: HIGH - Affects retention and revenue

๐Ÿ’ฌ

Documentation Assistant

Ask me anything about the docs

Hi! I'm your documentation assistant. Ask me anything about the docs!

I can help you with:
- Code examples
- Configuration details
- Troubleshooting
- Best practices

Try asking: How do I configure the API?
09:31 AM