Skip to main content

📊 InstaReports Module

📖 Overview

The InstaReports module provides automated SEO and social media report generation for client businesses. It generates professional, white-labeled PDF reports covering Google My Business performance, social media presence, online reviews, and website SEO metrics. Reports can be sent via email/SMS and are fully customizable with agency branding.

File Path: internal/api/v1/instareports/

Key Features

  • Automated Report Generation: Create SEO/social reports with single click
  • Multi-Business Processing: Bulk generate reports from CSV uploads
  • White-Label Branding: Custom agency logos, colors, and messaging
  • Multi-Channel Delivery: Email, SMS, and web link sharing
  • Template System: Pre-configured report templates (SEO, Social, Combined)
  • Queue Processing: Background job queue for report generation
  • Industry Benchmarks: Compare client metrics against industry averages
  • Tracking: Monitor report views and engagement

🗄️ Collections Used

instareports

  • Purpose: Store generated report metadata and status
  • Model: shared/models/instareports.js
  • Key Fields:
    • account_id (ObjectId) - Owner agency account
    • created_by (ObjectId) - User who created report
    • parent_account (ObjectId) - Parent agency (for sub-accounts)
    • status (String) - 'QUEUED', 'GENERATING', 'COMPLETED', 'FAILED', 'CANCELLED'
    • type (String) - Template ID (e.g., 'seo_report', 'social_report')
    • template_id (ObjectId) - Report template reference
    • details.business_info (Object) - Client business data
    • details.configs (Object) - Report configuration
    • details.notifications (Object) - Email/SMS settings
    • file_url (String) - Generated PDF URL (S3/Wasabi)
    • public_url (String) - Shareable web view URL
    • created (Date) - Generation timestamp

instareports.queue

  • Purpose: Queue for background report generation
  • Key Fields:
    • account_id (ObjectId)
    • type ('instareport' | 'csv_instareport')
    • template_id (ObjectId)
    • reference_id (ObjectId) - Links to instareports document
    • details (Object) - Business info and report settings
    • process_errors (Array) - Error messages if generation fails
    • tries (Number) - Retry attempts
    • status ('pending' | 'processing' | 'completed' | 'failed')

instareports.additional-information

  • Purpose: Store recipient tracking and notification settings
  • Key Fields:
    • instareport_id (ObjectId) - Parent report
    • account_id (ObjectId)
    • recipients (Array) - Person contact IDs with notification preferences
    • instareport_created_at (Date)

Recipient Structure:

{
id: ObjectId, // Person contact ID
email: {
enabled: Boolean,
sent_at: Date,
opened_at: Date
},
sms: {
enabled: Boolean,
sent_at: Date
},
viewed: Boolean, // Has accessed report
last_viewed_at: Date
}

instareports.industry-average

  • Purpose: Industry benchmark data for report comparisons
  • Key Fields:
    • industry (String) - Industry category
    • metrics (Object) - Average scores
    • last_updated (Date)

Supported Industries:

  • Active Life, Arts & Entertainment, Automotive, Beauty & Spas, Education, Event Planning & Services, Financial Services, Food, Health & Medical, Home Services, Hotels & Travel, Professional Services, Real Estate, Restaurants, Shopping, and more (24 total)

crm.contacts

  • Operations: Read (business and person contact lookup)
  • Usage: Retrieve business details and person recipients
  • Purpose: Publisher logos for social media report sections
  • Usage: Display platform branding in reports

🏗️ Architecture

instareports/
├── Services/
│ ├── instareport.js # Core report generation
│ ├── create-business.js # CSV business import
│ ├── csv-to-json.js # CSV parsing
│ ├── generateFileBuffer.js # File handling
│ └── utils.js # Helper functions
├── Controllers/
│ ├── InstareportsController.js # API handlers
│ └── ...
└── Routes/ # API endpoints

🔄 Data Flow

Single Report Generation

sequenceDiagram
participant User
participant API as InstaReports API
participant DB as MongoDB
participant Queue as Queue Manager
participant Generator as Report Generator
participant Storage as S3/Wasabi
participant Notify as Notification Service

User->>API: POST /instareports (business_id, template_id)
API->>DB: Create instareports document (status: QUEUED)
API->>DB: Create instareports.queue job
API->>DB: Create additional-information record
DB-->>API: Report IDs
API-->>User: 201 Created

Queue->>DB: Poll for pending jobs
DB-->>Queue: Queue job
Queue->>Generator: Start report generation
Generator->>Generator: Fetch business data (GMB, Social, SEO)
Generator->>Generator: Apply industry benchmarks
Generator->>Generator: Generate PDF with branding
Generator->>Storage: Upload PDF
Storage-->>Generator: file_url
Generator->>DB: Update instareports (status: COMPLETED, file_url)

alt Email/SMS Enabled
Generator->>Notify: Send notifications to recipients
Notify->>DB: Update sent_at timestamps
end

CSV Bulk Upload

flowchart TD
A[User Uploads CSV] --> B[Parse CSV]
B --> C{Validate Rows}
C -->|Valid| D[Create CRM Contacts]
C -->|Invalid| E[Collect Errors]

D --> F{Contact Creation Success?}
F -->|Yes| G[Queue InstaReport Job]
F -->|No| E

G --> H[Process Queue]
E --> I[Return Error Report]

H --> J{All Reports Generated?}
J -->|Yes| K[Mark CSV Job Complete]
J -->|No| L[Retry Failed Jobs]

L --> M{Max Retries?}
M -->|Yes| N[Mark as Failed]
M -->|No| H

🔧 Core Functions

saveInstareportQueue(queue, data)

Creates a new InstaReport with associated queue job and additional information.

Parameters:

{
queue: {
uid: ObjectId, // Creator user ID
account_id: ObjectId, // Owner account
parent_account: ObjectId,
template_id: String // Report template
},
data: {
con: { // Business contact
id, name, email, phone, website, address,
social: { facebook },
industry: String
},
people: [ // Recipients
{
id: ObjectId,
email: { enabled: Boolean },
sms: { enabled: Boolean },
viewed: false
}
],
notifications: {
email: { enabled: Boolean },
sms: { enabled: Boolean }
},
configs: Object // Custom report settings
}
}

Process:

  1. Create instareports document with status QUEUED
  2. Create instareports.additional-information with recipients
  3. Create instareports.queue job for background processing
  4. Return success confirmation

saveQueueData(queue)

Processes CSV bulk upload queue.

Process:

  1. Download CSV from S3/Wasabi using queue.details.key
  2. Parse CSV to JSON via csvToJson()
  3. Validate business data (name, phone/email, address required)
  4. Create CRM contacts for valid businesses via CreateBusiness()
  5. For each successfully created contact:
    • Extract person contacts from con.people
    • Call saveInstareportQueue() to queue report
  6. Collect all errors (CSV validation errors + contact creation errors)
  7. Update CSV queue with error report
  8. Mark queue job as completed

Error Handling:

  • Invalid CSV rows collected and returned to user
  • Contact creation failures logged
  • Individual report queue failures don't block entire batch
  • CSV queue tracks tries count for retries

🎨 Report Templates

Available Templates:

  • SEO Report: Website audit, keyword rankings, backlinks, page speed
  • Social Media Report: Facebook, Instagram, Twitter presence and engagement
  • GMB Report: Google My Business insights, reviews, photos, posts
  • Combined Report: Full-spectrum digital presence audit

Template Configuration:

{
template_id: 'seo_report',
branding: {
logo_url: String,
primary_color: String,
secondary_color: String,
agency_name: String
},
sections: [
'overview',
'website_audit',
'keyword_rankings',
'backlink_analysis',
'recommendations'
],
custom_message: String,
include_industry_benchmarks: Boolean
}

📊 Report Content

Data Sources

  • Google My Business: Reviews, ratings, posts, photos, Q&A
  • Website SEO: Meta tags, headings, schema markup, load time
  • Social Media: Follower counts, engagement rates, post frequency
  • Online Reviews: Aggregated ratings from multiple platforms
  • Citations: NAP consistency across directories

Metrics Calculated

  • Overall Score (0-100): Weighted aggregate of all sections
  • SEO Score: On-page optimization, technical SEO
  • Social Score: Presence and engagement across platforms
  • Review Score: Rating average and review volume
  • Comparison to Industry Average: Percentile ranking

🔀 Integration Points

  • CRM Module - Business and person contact lookup
  • Queue Manager - Background report generation
  • Email Service (SendGrid) - Report delivery via email
  • SMS Service (Twilio) - Report delivery via SMS
  • File Storage (S3/Wasabi) - PDF storage and public URL generation
  • OneBalance - Credit verification before report generation

⚠️ Important Notes

  • 💰 Credit System: Each report consumes 1 InstaReport credit from OneBalance
  • 🔄 Queue Processing: Reports generated asynchronously (5-15 minutes)
  • 📧 Delivery Tracking: Email open and SMS delivery tracked per recipient
  • 🎨 White-Label: Agency branding embedded in PDF watermark and footer
  • 📊 Data Freshness: Report data cached for 24 hours to reduce API costs
  • 🔒 Public URLs: Generated with secure tokens, expire after 90 days
  • 📈 Industry Benchmarks: Updated monthly from aggregated data

📈 Performance Considerations

  • Batch Processing: CSV uploads processed in background queue
  • Rate Limiting: External API calls (GMB, Facebook) throttled to prevent bans
  • Caching: Business data cached to avoid redundant API calls
  • Retry Logic: Failed reports retried up to 3 times before marking as failed
  • Storage Optimization: PDFs compressed before upload to S3

Last Updated: 2025-10-08
Module Path: internal/api/v1/instareports/
Primary Service: Services/instareport.js (1361 lines)

💬

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