Skip to main content

Create InstaReport Automation Processor

Overview

The Create InstaReport automation generates automated marketing reports (InstaReports) for business contacts associated with deals when they enter a specific pipeline stage. Supports custom templates and email/SMS notifications.

Source File: queue-manager/queues/deals/automations/instareport.js
Triggered By: queue-manager/services/deals/automations.js
Business Impact: HIGH - Lead nurturing & value demonstration

Processing Logic

sequenceDiagram
participant AUTO as Automation Service
participant QUEUE as InstaReport Queue
participant DEAL as Deals
participant CONTACT as Contacts
participant REPORT as InstaReport Utility
participant NOTIFY as Email/SMS

AUTO->>QUEUE: Add automation job
QUEUE->>DEAL: Find eligible deals<br/>(with business contact)

loop For Each Deal
QUEUE->>CONTACT: Validate business contact
QUEUE->>REPORT: Create instareport<br/>(template + business)
REPORT-->>QUEUE: Report ID

opt Notifications Enabled
QUEUE->>NOTIFY: Send email/SMS with report link
end

QUEUE->>DEAL: Mark automation triggered
end

Key Features

Template Requirement

const templateID =
automation.data && automation.data.template_id ? automation.data.template_id : null;

if (!templateID) {
throw new Error('Template not provided!');
}

Business Contact Requirement

// Only processes deals with business contacts
const business = deal.business ? deal.business : null;

if (business) {
const businessRS = await Contact.findById(business).exec();
if (!businessRS) {
throw new Error('Invalid business ID.');
}
// Create instareport...
} else {
throw new Error('No business contact associated with deal');
}

Notification Configuration

const notifications =
automation.data && automation.data.notifications ? automation.data.notifications : {};

// Normalize field names
if (notifications.sms?.message) notifications.sms.content = notifications.sms.message;
if (notifications.email?.message) notifications.email.content = notifications.email.message;

InstaReport Creation

const accountRS = await Account.findById(accountID, 'parent_account').lean().exec();
const parentAccount = accountRS?.parent_account || accountID;

const result = await addInstareport(parentAccount, userID, [business], notifications, templateID);

Collections Used

Input: deal-automation
Query: deal (with business field)
Validation: contact (business contact)
Query: account (parent account lookup)
Create: instareports-* collections (via utility)
Optional: communication (email/SMS records)

Automation Data Structure

{
template_id: ObjectId("templateId"), // Required
notifications: {
email: {
enabled: true,
subject: "Your Custom Report",
content: "Hi {{business.company}}, check out your report...",
sender: "reports@company.com"
},
sms: {
enabled: true,
content: "Your report is ready: {{report.url}}"
}
}
}

Use Cases

Example 1: Lead Magnet

// Automation
{
stage_id: "new_lead",
action: "create_instareport",
data: {
template_id: seoAuditTemplateID,
notifications: {
email: {
enabled: true,
subject: "Free SEO Audit - {{business.company}}",
content: "Thank you for your interest. Here's your free SEO audit..."
}
}
},
delay: 0
}

// Result: Instant value delivery to new leads

Example 2: Proposal Supporting Data

// Automation
{
stage_id: "proposal_sent",
action: "create_instareport",
data: {
template_id: competitorAnalysisTemplateID,
notifications: {
email: {
enabled: true,
subject: "Competitor Analysis for {{business.company}}",
content: "To support our proposal, we've prepared a competitive analysis..."
}
}
},
delay: 3600 // 1 hour after proposal
}

Example 3: Onboarding Report

// Automation
{
stage_id: "closed_won",
action: "create_instareport",
data: {
template_id: onboardingReportTemplateID,
notifications: {
email: {
enabled: true,
subject: "Welcome! Your Onboarding Report",
content: "Congratulations on joining us! Here's your baseline report..."
},
sms: {
enabled: true,
content: "Welcome aboard! Your onboarding report: {{report.url}}"
}
}
},
delay: 0
}

Parent Account Handling

const accountRS = await Account.findById(accountID, 'parent_account').lean().exec();
const parentAccount = accountRS?.parent_account || accountID;

Uses parent account for instareport creation if account is a sub-account.

Error Handling

Common Errors

  1. No Template: template_id not provided
  2. Invalid Business: Contact doesn't exist
  3. No Business: Deal has no business contact
  4. Template Not Found: Invalid template ID
  5. Report Generation Failed: Utility error

Error Response

{
deal: dealID,
business: businessID,
message: "Invalid business ID.",
additional_info: {...}
}

Notification Flow

  1. InstaReport Created: Report generated with template
  2. Email Sent (if enabled): Email with report link
  3. SMS Sent (if enabled): SMS with shortened link
  4. Activity Logged: Report creation tracked

Performance

Execution Time: 2-5 seconds per report (report generation intensive)
Batch Processing: Sequential (not parallel) due to report generation load
Complexity: HIGH
Lines of Code: 193


Business Value: Automated value demonstration, lead nurturing, differentiation

💬

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