Skip to main content

Campaign Management — Technical Documentation

Last updated: February 2026


Table of Contents

  1. Overview
  2. Architecture
  3. Repository Map
  4. Core Flows
  5. Entities & Data Model
  6. API Endpoints
  7. Services & Business Logic
  8. Company Suitability (AI Integration)
  9. Configuration
  10. Integration Points

1. Overview

Campaign Management handles the full lifecycle of outbound prospecting campaigns — creation, audience linking, company suitability scoring via AI, email configuration, scheduling, statistics, and status transitions. It spans 5 repositories: sopromasterdata (Data API), data-admin (frontend), sopro-sodastream (legacy CRM), sopro-sodastream-core (queue consumers), and email-template-demo (AIM service for AI scoring).


2. Architecture


3. Repository Map

RepositoryLayerKey Files
sopromasterdataControllerAPI/SoProMasterDBAPI/Controllers/CampaignController.cs
sopromasterdataServiceCampaignServices/CampaignService.cs
sopromasterdataSuitabilityCompanySuitabilityServices/CompanySuitabilityService.cs
sopromasterdataEndpointManagerShared/EndpointManager/EndpointManagerService.cs
sopromasterdataEntitiesCampaignEntities/Campaign.cs, CampaignSender.cs
sopromasterdataHangfireHangfireServices/CampaignHangfireService.cs
data-adminPagessrc/pages/campaigns/
data-adminAPI Hookssrc/api/campaign.queries.ts
sopro-sodastreamCampaign UIControllers/CampaignController.cs (MVC)
sopro-sodastream-coreQueue ConsumerSoProQueueConsumer/
email-template-demoSuitability APIControllers/CompanySuitabilityController.cs

4. Core Flows

4.1 Campaign Creation

4.2 Company Suitability Scoring

4.3 Campaign Statistics Recalculation


5. Entities & Data Model

Campaign

ColumnTypeDescription
Idint (PK)Campaign identifier
Namenvarchar(255)Campaign display name
ClientIdint (FK)Client who owns the campaign
AudienceIdint (FK)Linked audience
Statusint (enum)Setup, Active, Paused, Completed
StartDatedatetime?Campaign start date
EndDatedatetime?Campaign end date
CreatedAtdatetimeCreation timestamp
CreatedBynvarchar(100)Creator identifier

CampaignSender

ColumnTypeDescription
Idint (PK)Sender profile identifier
CampaignIdint (FK)Parent campaign
Emailnvarchar(255)Sender email address
DisplayNamenvarchar(255)Sender display name
TrackingDomainnvarchar(255)Domain for open/click tracking

CompanySuitabilityResult

ColumnTypeDescription
Idint (PK)Result identifier
CampaignIdint (FK)Campaign being scored for
CompanyIdint (FK)Company being scored
ScoredecimalSuitability score (0-100)
Reasoningnvarchar(max)AI-generated explanation
Providernvarchar(50)AI provider used (OpenAI, Anthropic, etc.)
ScoredAtdatetimeWhen scoring occurred

CampaignStatistics

ColumnTypeDescription
CampaignIdint (FK)Campaign reference
TotalProspectsintTotal audience size
ContactedintNumber contacted
OpensintEmail opens
ClicksintLink clicks
RepliesintResponses received
BouncesintFailed deliveries
CalculatedAtdatetimeLast recalculation

6. API Endpoints

Data API (/api/Campaign)

MethodEndpointDescription
GET/api/Campaign/GetCampaignsList campaigns with pagination
GET/api/Campaign/GetCampaignById/{id}Campaign detail
GET/api/Campaign/GetCampaignStatistics/{id}Campaign statistics
POST/api/Campaign/CreateCreate campaign

Admin API (/api/admin/Campaign)

MethodEndpointDescription
POST/api/admin/Campaign/ScoreCompanies/{id}Trigger company suitability scoring
POST/api/admin/Campaign/RecalculateStatistics/{id}Trigger stats recalculation

AIM Service (Company Suitability)

MethodEndpointDescription
POST/api/v5/company-suitability-v1Score a company for campaign fit

7. Services & Business Logic

CampaignService

Location: CampaignServices/CampaignService.cs
Interface: ICampaignService
DI: AddScoped<ICampaignService, CampaignService>() in ApiServiceExtensions.cs

MethodDescription
CreateCampaignAsync()Creates campaign with sender profiles and audience link
GetCampaignByIdAsync()Returns campaign with stats
GetCampaignStatisticsAsync()Returns calculated statistics
RecalculateStatisticsAsync()Recounts all prospect statuses

CompanySuitabilityService

Location: CompanySuitabilityServices/CompanySuitabilityService.cs
Interface: ICompanySuitabilityService

MethodDescription
ScoreCompanyAsync()Scores a single company via EndpointManager → AIM
ScoreCompaniesForCampaignAsync()Batch-scores all companies for a campaign

EndpointManager

Location: Shared/EndpointManager/EndpointManagerService.cs
Purpose: Routes HTTP calls to Sopro internal services (AIM, etc.)

The EndpointManager abstracts the HTTP communication with AIM. It handles:

  • Endpoint URL resolution
  • Authentication headers
  • Retry logic and error handling
  • Response deserialization

8. Company Suitability (AI Integration)

AIM Service Architecture

The AIM service (email-template-demo repo, hosted at aim.sopro.io) provides the company suitability scoring endpoint.

Request Payload

The suitability request includes:

FieldDescription
companyNameCompany name
companyWebsiteCompany website URL
companyIndustryCompany industry classification
companySizeEmployee count range
campaignBriefClient's ideal customer description
valuePropositionWhat the client's product/service offers

Response

FieldDescription
score0-100 suitability score
reasoningNatural language explanation of the score
providerWhich AI model was used

9. Configuration

DI Registration

DataApi: API/SoProMasterDBAPI/Extensions/ApiServiceExtensions.cs

services.AddScoped<ICampaignService, CampaignService>();
services.AddScoped<ICompanySuitabilityService, CompanySuitabilityService>();

EndpointManager Configuration

Configured via appSettings.Global.json:

{
"EndpointManager": {
"CompanySuitability": {
"Url": "https://aim.sopro.io/api/v5/company-suitability-v1",
"ApiKey": "<configured-per-environment>"
}
}
}

Frontend Configuration

API Hooks: src/api/campaign.queries.ts
Endpoints: src/api/endpoints.tsendpoints.campaigns


10. Integration Points

Upstream (data flows in)

SourceDataMechanism
Audience ManagementProspect list for campaignsAudience linked via AudienceId FK
AIM ServiceCompany suitability scoresHTTP via EndpointManager
SodastreamCampaign configuration, schedulingDirect DB access

Downstream (data flows out)

TargetDataMechanism
Email SendingCampaign email scheduleAzure Queue / Hangfire
Email FindingProspect email requestsHangfire jobs → email-finder
Data Admin UICampaign stats, detailsREST API → React Query
Audience ManagementCampaign status (affects deduplication)Shared DB

Cross-Feature Dependencies

FeatureRelationship
Audience ManagementCampaigns require linked audiences
Email SendingCampaign scheduling triggers email delivery
Generative MessagingAIM generates email content per campaign
Company SuitabilityAI scores determine prospect prioritization
Email FindingCampaign prospects need email addresses found