Your contacts already live in Salesforce. Twain reads them from there, researches each one, and writes the drafts back into a campaign. Pick a Contact list view, map a few fields, and the workflow loop takes it from there.
Where to start the import
Salesforce shows up as a source in three places in Twain.
- Campaign creation. Pick Salesforce as the lead source when you set up a new campaign. The list view you choose lands in the campaign, and Twain starts research on every contact right away.
- Leads import. Open the leads import modal on an existing campaign, pick Salesforce, and select a list view. Twain pulls the contacts, dedupes against what's already in the campaign, and queues research on the new ones.
- Workflow node. Drop a Salesforce import node into a workflow. The node polls the list view on a schedule and hands new contacts to the next step (usually a campaign).
Connecting Salesforce
The first time you pick Salesforce, Twain sends you through the standard Salesforce OAuth screen. It's OAuth 2.0 with PKCE, so no client secret sits in the browser, and the refresh token is bound to the Twain workspace rather than your individual session.
Twain asks for the narrowest scopes the import needs.
Permissions Twain asks for. Read access to Contact list views (so the picker can show you what exists) and read access to the Contact object (so Twain can pull the rows in the list view). No write scope, no Lead or Opportunity scope, no Apex scope.
The refresh token is stored encrypted against your workspace. If anyone on your team disconnects Salesforce from the integrations page, every running workflow stops polling and every campaign that was importing shows a reconnect banner.
List views are the selector
Twain never asks you to write a SOQL query or paste a CSV. The unit of selection is the Salesforce Contact list view, the same thing you'd see in the Salesforce UI under Contacts.
You define the filter inside Salesforce, where your RevOps team already manages the rules. Twain reads whatever the list view currently contains. That works the same for static lists and filter-driven ones, like "Contacts with a birthday this month" or "Enterprise contacts updated in the last 7 days."
The picker shows the live count next to each list view, so you know what you're about to pull before you click. Re-importing the same list view later is safe. Twain dedupes against the contacts already attached to the campaign and only researches the new ones.
Map fields to variables
After you pick a list view, Twain shows you the field mapping panel. The LinkedIn profile URL field is required. Twain picks a sensible default if your Salesforce org has one of the common LinkedIn fields. Everything else is optional.
Mapping custom fields pays off in three places.
- Better research. A mapped persona or segment field tells Twain what kind of person it's writing to, so the research pass focuses on the right signals.
- Persona-aware copy. Variables like
{{persona}}or{{tier}}can drop straight into the prompt, and Twain uses them when it generates the draft. - Trigger-aware drafts. If your list view is built around a trigger (new role, recent event, renewal date), map that field too. Twain references the trigger in the opener instead of guessing why you're reaching out.
What flows through automatically
The workflow node is where the import stops being a one-time pull.
Once the node is live, Twain polls the list view every couple of minutes. It keeps a snapshot of who was in the list view last time and diffs against the current contents. Only contacts that newly entered the list view trigger work. Existing contacts are ignored, even if Salesforce shuffles their row order or updates a field.
For every new contact, Twain runs research using the fields you mapped, drops the contact into the downstream campaign, and posts a notification to the workspace channel so you can review the fresh batch. Update the filter in Salesforce, and the next poll picks it up.