Skip to main content

SINT Outreach

SINT Outreach (sint-outreach) is an AI-powered LinkedIn outreach automation system. It manages multi-step prospecting campaigns, scores leads against an Ideal Customer Profile (ICP), automates connection sequences via Ulinc, and generates personalized AI replies to inbound messages.
Active deployment: BrightBeam (David Steel) — supplement and peptide industry. V1 is operational. The pipeline is currently gated on client OpenAI API key provisioning for reply generation.

Architecture

sint-outreach/
├── backend/                 # FastAPI (Python)
│   ├── app/
│   │   ├── api/             # Route handlers
│   │   ├── models/          # SQLAlchemy ORM models
│   │   ├── schemas/         # Pydantic request/response schemas
│   │   ├── services/        # Business logic
│   │   │   ├── ulinc.py     # Ulinc LinkedIn automation client
│   │   │   ├── ghl.py       # GoHighLevel CRM integration
│   │   │   ├── ai_reply.py  # OpenAI reply generation
│   │   │   └── scoring.py   # ICP scoring engine
│   │   └── main.py
│   └── alembic/             # DB migrations (6 versions)
└── dashboard/               # React SPA
    └── src/
        ├── pages/
        │   ├── Campaigns.tsx
        │   ├── Prospects.tsx
        │   ├── Templates.tsx
        │   ├── Analytics.tsx
        │   └── Settings.tsx
        └── ...

Backend

FastAPI (Python) + SQLAlchemy ORM. 6 Alembic migration versions. Handles campaign logic, Ulinc sync, CRM pushes, and AI reply generation.

Dashboard

React SPA with 5 pages: Campaigns, Prospects, Templates, Analytics, Settings.

Ulinc Integration

Invitation-only LinkedIn automation platform. Provides connection request sending, message delivery, and reply detection. This integration is a competitive moat.

GoHighLevel CRM

Bidirectional prospect sync with GHL. Enriched prospects and campaign responses flow into GHL pipelines for sales follow-up.

Backend

Stack: FastAPI, SQLAlchemy ORM, Alembic, PostgreSQL

Database Schema

Six Alembic migration versions establish the core schema:
TableDescription
campaignsCampaign configs: name, target ICP criteria, sequence steps, status
prospectsLinkedIn profiles with enrichment data and ICP scores
sequencesMessage sequence templates with step ordering
messagesSent message log with delivery status and reply tracking
repliesInbound message content, classified intent, and AI response
analyticsAggregated campaign performance metrics

API Routes

# Core route groups (app/api/)
GET  /api/campaigns            # List campaigns
POST /api/campaigns            # Create campaign
GET  /api/campaigns/{id}       # Campaign detail + metrics
PUT  /api/campaigns/{id}       # Update campaign config
POST /api/campaigns/{id}/start # Activate campaign (triggers Ulinc sync)
POST /api/campaigns/{id}/pause # Pause execution

GET  /api/prospects            # List prospects with filters
POST /api/prospects/enrich     # Trigger enrichment pipeline
GET  /api/prospects/{id}/score # Get ICP score for prospect

GET  /api/replies              # Unreviewed replies
POST /api/replies/{id}/respond # Send AI-generated or manual response

GET  /api/analytics/summary    # Campaign-level conversion metrics
GET  /api/analytics/campaign/{id} # Per-campaign funnel breakdown

ICP Scoring

The ICP scoring engine (services/scoring.py) evaluates prospects against configurable criteria. For BrightBeam, the target ICP is:
  • Industry: Supplements, peptides, nutraceuticals, sports nutrition
  • Role: Founders, CMOs, Head of Growth, Marketing Directors
  • Company size: 10–500 employees
  • Engagement signals: Active LinkedIn presence, recent posts on relevant topics
Each prospect receives a score (0–100) derived from weighted attribute matching. Scores above a configurable threshold (default: 65) are eligible for outreach.

Integrations

Ulinc

Ulinc access is invitation-only. Do not share credentials or expose the Ulinc session token. This integration is a core competitive differentiator.
Ulinc handles the LinkedIn automation layer:
  • Connection requests: Sends personalized invite messages within LinkedIn’s daily limits
  • Message delivery: Routes follow-up sequence messages via Ulinc’s queue
  • Reply detection: Webhooks or polling for inbound message events
  • Campaign sync: Ulinc campaigns map 1:1 to sint-outreach campaigns
# services/ulinc.py — core methods
class UlincClient:
    def sync_campaign(self, campaign_id: str) -> SyncResult: ...
    def send_connection_request(self, prospect: Prospect, message: str) -> bool: ...
    def get_replies(self, since: datetime) -> list[Reply]: ...
    def get_campaign_stats(self, ulinc_campaign_id: str) -> CampaignStats: ...

GoHighLevel (GHL) CRM

Enriched prospects are pushed to GHL contacts with custom field mappings. Reply events trigger pipeline stage updates in GHL.
# services/ghl.py — core methods
class GHLClient:
    def upsert_contact(self, prospect: Prospect) -> GHLContact: ...
    def update_pipeline_stage(self, contact_id: str, stage: str) -> bool: ...
    def add_note(self, contact_id: str, content: str) -> bool: ...

LinkedIn MCP Server

The LinkedIn MCP server provides structured profile lookup and enrichment beyond what Ulinc exposes. Used in the prospect enrichment pipeline to populate missing fields (job title, company size, industry classification) before ICP scoring.

OpenAI API

Reply generation (services/ai_reply.py) uses the OpenAI Chat Completions API to draft context-aware responses to inbound LinkedIn messages.
# services/ai_reply.py (abbreviated)
def generate_reply(prospect: Prospect, inbound_message: str, campaign: Campaign) -> str:
    system_prompt = build_system_prompt(campaign.persona, campaign.product_context)
    response = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": inbound_message},
        ],
        max_tokens=300,
        temperature=0.7,
    )
    return response.choices[0].message.content
Current blocker: Reply generation is paused until the client (BrightBeam) provisions their OpenAI API key. The endpoint is implemented and tested; it requires OPENAI_API_KEY in the server environment.

Campaign Features

Multi-Step Sequences

Campaigns execute message sequences with configurable timing between steps:
1

Connection Request

Personalized invite sent via Ulinc. Includes a short opener referencing the prospect’s ICP-matched attribute (e.g., industry, recent post).
2

Follow-Up 1

Sent N days after connection acceptance. Introduces the product/service in context of the prospect’s pain points.
3

Follow-Up 2

Social proof or case study message. Sent if no reply to Follow-Up 1.
4

Reply Detection

Ulinc polls for replies. On detection, the reply is logged to replies table and queued for AI generation.
5

AI Response

ai_reply.py generates a draft response. Auto-sends or queues for operator review based on campaign auto_reply flag.

A/B Testing

Campaigns support A/B variants on:
  • Connection request message text
  • Follow-up timing (day 2 vs day 4)
  • Opener framing (pain-focused vs outcome-focused)
Variants are assigned at the prospect level. The analytics module tracks conversion rates per variant and surfaces the winner.

Prospect Enrichment Pipeline

LinkedIn profile URL
  → LinkedIn MCP Server (profile data)
  → ICP scorer (score 0–100)
  → GHL contact upsert
  → Campaign eligibility check (score ≥ threshold)
  → Ulinc campaign enrollment

Dashboard

Stack: React, 5-page SPA
Campaign list with status (active/paused/complete), prospect counts, connection rate, reply rate, and conversion rate. Create and configure new campaigns with step builder.

Deployment

# Backend
DATABASE_URL=postgresql://user:pass@host:5432/outreach
ULINC_API_KEY=
ULINC_BASE_URL=https://ulinc.co/api
GHL_API_KEY=
GHL_LOCATION_ID=
OPENAI_API_KEY=              # Required for AI reply generation
LINKEDIN_MCP_URL=            # LinkedIn MCP server endpoint

# Dashboard
VITE_API_BASE_URL=https://api.outreach.sint.gg

Business Context

DimensionDetail
Active clientBrightBeam (David Steel)
IndustrySupplements, peptides, nutraceuticals
Pilot engagement$5,000
Target retainer10,00010,000–25,000/month
V1 statusOperational — campaign running
Current blockerClient OpenAI API key provisioning
Integration moatInvitation-only Ulinc access
The Ulinc integration is the primary competitive differentiator. Ulinc provides LinkedIn automation at scale within platform rate limits; access is not publicly available and was secured through a direct partnership.