Integration diagram showing Salmon connecting to HubSpot and Outreach platforms

Wiring Salmon Into HubSpot and Outreach: A Revenue Ops Integration Guide

Step-by-step: how to configure Salmon's enrichment webhooks to fire on HubSpot form submission, populate custom properties, and trigger Outreach sequences — all before the lead even shows up in your CRM queue.

The Integration Goal: Enrichment Before the Lead Is Visible

The objective of this integration is specific: by the time a rep opens a new lead record in HubSpot or Outreach, the enrichment is already there. Not scheduled for later. Not "available on next sync." There — in the contact properties, in the prospect record, ready to inform the first action the rep takes.

This requires a webhook-first architecture. The standard HubSpot form submission flow notifies your CRM and then waits for enrichment to run. Salmon's integration inverts that sequence: the form submission event triggers Salmon's webhook simultaneously with the HubSpot form handler, so the enrichment query runs in parallel with the CRM write. By the time HubSpot has finished creating the contact record, Salmon has already queried enrichment sources and is writing back enrichment fields through HubSpot's Contact Properties API.

This guide covers the full configuration from HubSpot webhook setup through Outreach sequence trigger. It assumes you have HubSpot Marketing Hub (Starter or above) and Outreach connected to HubSpot via their native integration or through the HubSpot-Outreach connector.

Step 1: Configure Salmon's HubSpot Webhook Trigger

In your Salmon dashboard, navigate to Integrations → HubSpot → Webhook Configuration. You'll configure Salmon to listen for HubSpot's form submission events.

HubSpot supports two approaches for real-time form submission notifications: the HubSpot Webhook API (sends an event to your endpoint when a form is submitted) and the HubSpot Workflow "Send a webhook" action (fires on workflow enrollment). For lowest latency, use the Webhook API approach — the workflow action adds a processing delay of 5–30 seconds due to workflow evaluation time.

// Salmon expects this webhook payload from HubSpot form submissions
// Configure this in HubSpot Settings → Integrations → Webhooks
{
  "eventType": "contact.propertyChange",
  "subscriptionType": "contact.creation",
  "portalId": 12345678,
  "objectId": 9876543,
  "propertyName": "email",
  "propertyValue": "[email protected]",
  "appId": 123456,
  "occurredAt": 1704067200000,
  "subscriptionId": 654321,
  "attemptNumber": 0
}

In practice, Salmon's HubSpot integration uses the contact.creation subscription type — it fires when a new contact record is created, which covers form submissions, list imports, and manual contact creation. If you only want enrichment to fire on form submissions (not manual imports), add a filter condition in Salmon's webhook configuration to check that the contact's hs_analytics_source property equals ORGANIC_SEARCH, PAID_SEARCH, or your specific form submission source values.

Step 2: Map HubSpot Contact Properties to Salmon's Enrichment Fields

Salmon writes enrichment data back to HubSpot as custom Contact Properties. You'll create these properties in HubSpot before the first enrichment fires; Salmon checks for their existence and creates them automatically if they're missing on first run, but pre-creating them gives you control over the property group organization.

Create a custom property group in HubSpot called "Salmon Enrichment" and add the following properties:

Property Internal Name Property Type Description
salmon_enriched_headcount Number Current employee count
salmon_headcount_delta_90d Number 90-day headcount change
salmon_funding_recency_days Number Days since last funding event
salmon_icp_fit_tier Dropdown Strong / Moderate / Weak / Insufficient Data
salmon_installed_tech_stack Multi-line text Detected technologies (comma-separated)
salmon_enrichment_coverage Dropdown Full / Partial / Minimal
salmon_firmographic_score Number 0–100 firmographic fit score
salmon_tech_momentum_score Number 0–100 technographic recency score

Once properties are created, map them in Salmon's field mapping configuration. The mapping tells Salmon which HubSpot property internal name to write each enrichment result to.

Step 3: Configure HubSpot Workflows to Act on Enrichment Data

With enrichment fields populated, HubSpot Workflows can now act on ICP fit tier to trigger downstream actions. Create a Contact-based Workflow with the trigger condition: salmon_icp_fit_tier is known AND salmon_enrichment_coverage is not equal to "Minimal".

The workflow branching structure should mirror your routing tier logic:

  • Branch 1 — Strong ICP, 500+ employees: Create a task for the enterprise SDR, set the Contact Owner to the enterprise rep queue, send an internal Slack notification via HubSpot's Slack integration. Delay: none — this is immediate.
  • Branch 2 — Strong or Moderate ICP, 100–499 employees: Enroll in a HubSpot Sequence (or trigger the Outreach enrollment — see Step 4). Set Contact Owner to mid-market pool.
  • Branch 3 — Moderate ICP, under 100 employees: Enroll in a lower-touch nurture sequence. Set lifecycle stage to Lead.
  • Branch 4 — Insufficient Data: Create a task for manual review, assign to ops review queue. Do not enroll in any sequence until reviewed.

Step 4: Trigger Outreach Sequences Based on Tech Stack

The HubSpot-Outreach integration syncs contact properties bidirectionally. Once salmon_installed_tech_stack is populated in HubSpot and synced to Outreach as a Prospect custom field, Outreach sequence enrollment triggers can reference it.

In Outreach, create a Trigger (under Sequences → Triggers) for each tech stack routing track:

// Outreach Trigger configuration (conceptual — mirrors the UI settings)
{
  "trigger_name": "Salmon - Strong ICP - Salesforce Stack",
  "enrollment_condition": {
    "AND": [
      { "field": "salmon_icp_fit_tier", "operator": "equals", "value": "Strong" },
      { "field": "salmon_installed_tech_stack", "operator": "contains", "value": "Salesforce" },
      { "field": "stage", "operator": "equals", "value": "Prospect" }
    ]
  },
  "sequence": "Inbound - Salesforce Stack - Enrichment Focus",
  "sequence_step": 1,
  "owner_assignment": "round_robin",
  "owner_pool": "mid_market_sdr_team"
}

The three sequence tracks — Salesforce stack, HubSpot stack, and stack-undefined — ensure that every SDR's first email references the prospect's actual technology context rather than sending a generic opening line. This isn't about personalization theater; it's about demonstrating that you already know something relevant about the prospect's situation before they've told you anything.

One friction point teams frequently encounter: Outreach's contact sync with HubSpot operates on a polling interval rather than real-time push. If you create an Outreach prospect from a HubSpot contact before the Salmon enrichment fields have synced, the Outreach record may trigger with incomplete data. The safest architecture delays Outreach enrollment until Salmon's enrichment write is confirmed — which Salmon handles by sending a confirmation event that the HubSpot Workflow can listen for before triggering Outreach enrollment.

Step 5: Verify the End-to-End Timing

After configuration, run a test submission using a work email address from a B2B domain. The expected timing is:

  • T+0ms: Form submitted
  • T+50–150ms: Salmon webhook received, enrichment queries begin
  • T+200–300ms: Enrichment results returned, HubSpot Contact Properties updated
  • T+300–800ms: HubSpot Workflow evaluates updated properties, workflow branches fire
  • T+1–3s: Outreach prospect created or updated with enrichment properties
  • T+3–5s: Outreach sequence enrollment trigger evaluates, prospect enrolled

By the five-second mark, a fully-enriched lead has been routed, sequenced, and assigned to a rep — before the prospect has navigated away from your thank-you page. For a team that was previously working on 18-hour enrichment cycles, the operational change is significant: SDRs check their Outreach queue in the morning and every lead there is already enriched, scored, and enrolled in the right sequence. There's no "this one is still waiting for enrichment" state.

Full API documentation for both the HubSpot and Outreach integrations — including authentication, field sync cadence, and error handling for enrichment timeouts — is available on the HubSpot integration page and Outreach integration page.