LinkedIn imports and Outreach campaigns¶
METIS Outreach turns a LinkedIn connections export into searchable METIS People and a human-managed outreach workflow. It does not scrape LinkedIn, send connection requests, send messages, or check whether a connection has changed.
What an import creates¶
The first import creates one private LinkedIn Network Holon for your METIS Person. Later imports reuse it.
Each valid connection row:
- matches an existing METIS Person by normalized LinkedIn profile URL, or creates a shared METIS Person with the exported name and LinkedIn URL; and
- gives that Person a LinkedIn Network Membership on your network Holon.
Imported People join the shared METIS directory. Other API users can find their name and LinkedIn URL through ordinary Person search, but the API does not return who is in your network or your campaign workflow unless the caller has been given edit access to your network Holon.
METIS stores exported company, position, and email as source-specific LinkedIn observations on the shared Person. It stores the connection date on that Person's LinkedIn Network Membership because the date describes the owner's relationship with the Person. These observations do not overwrite canonical, human-authored Person fields. LinkedIn exports do not always contain email addresses, and METIS never uses email for import matching.
Reading a candidate's profile (the browser pass started from an Outreach list) additionally fills the Person's own description, photo and Location — but only while they are empty. Description becomes the headline followed by the About text; Location is the country named on the profile, and is left unset when the profile names only a city or region. Anything you have written or uploaded yourself is never replaced, so re-reading a profile cannot undo an edit.
Download your LinkedIn data¶
Follow LinkedIn's current
data export instructions
and request your connections data. LinkedIn may provide Connections.csv
directly or place it inside a larger ZIP archive. You can upload either form.
Do not edit the header row. METIS accepts LinkedIn's explanatory lines before the header.
Import connections¶
- Open Outreach → LinkedIn Imports.
- Select
Connections.csv, or the LinkedIn ZIP containing exactly one file namedConnections.csv. - Choose Upload and preview. Uploading and previewing do not change People or Memberships.
- Review the totals and row outcomes:
createdmeans a new Person will be made;matchedmeans the exact LinkedIn URL found one existing Person;already_presentmeans the exact network Membership already exists;- an error means that row will be skipped.
- Choose Commit import. Valid rows are committed even if other rows fail.
- Download the CSV report from the result page. Reports expire after seven days.
The result page links to your network Holon. Re-importing the same export after the prior import completes reuses the Person and the exact Membership. METIS blocks a second import from committing while one is already running for that network.
Matching rules¶
METIS normalizes ordinary LinkedIn person URLs such as
https://linkedin.com/in/example?trk=... to
https://www.linkedin.com/in/example/.
- One exact match in your network is reused first.
- Otherwise, one exact match in the shared Person directory is reused.
- More than one matching Person is ambiguous, so the row is skipped.
- A row with no valid
/in/URL is skipped. - A new Person also requires a name.
- An existing Person's canonical name, description, contact details, and photo are never overwritten. Non-empty LinkedIn observations refresh the matching source fields; blanks leave earlier observations intact.
The report is the authoritative row-by-row record of what happened. It contains
the source values, matched or created IDs, warnings, errors, and a
not_imported_fields column. That column is normally empty for a successful
row; it names source values that could not be stored, such as an invalid
connection date, and all present source values when the row itself is skipped.
Set up an Outreach campaign¶
A campaign is not a separate list object. It is the Outreach Prospecting Journey on the same network Holon. This lets one Person have both a LinkedIn Network Membership and an independent campaign Membership.
The fastest route from the web interface is:
- Open Outreach → LinkedIn Contacts.
- If you can edit more than one Outreach network, choose the network to use.
- Search by name, LinkedIn profile URL, exported email, headline, description, location, current title, or company and choose the campaign Journey.
- Filter to Not yet added, select contacts individually or select the current page, and choose their starting step.
- Choose Add selected. The new Memberships are assigned to you.
The page shows 50 contacts at a time and can select the current page in one click. When an external agent has enriched a Person, the table also shows the observed title, company, email, connection date, and profile summary. Existing Memberships in the selected Journey are shown but are not changed.
You can also add one Person at a time from the network Holon:
- Open the network Holon from an import result.
- In People, choose Add Existing.
- Find the Person, select Outreach Prospecting, choose the starting step, and optionally set the responsible person, follow-up date, and note.
- Add the Membership. Repeat for the People in the campaign.
- Open a person's Membership card to change its step, responsibility, follow-up date, or notes as work progresses.
People do not need to have appeared in your LinkedIn export to join the Prospecting Journey.
The initial workflow is:
| Step | Use it when |
|---|---|
| Candidate | The Person may fit the campaign. |
| Researching | You are gathering context before contact. |
| Ready to Connect | Research is complete and a human can act. |
| Connection Requested | A human or an external tool reports that a request was sent. |
| Connected | A human or external tool reports that the connection is active. |
| Paused | No action should be taken for now. |
| Do Not Contact | The Person must not be contacted in this campaign. |
These are workflow facts recorded in METIS. METIS does not verify them against LinkedIn.
Steer the queue on Up Next¶
Outreach → Up Next is the queue in the order the extension will work it. Two controls narrow and hold it:
- Filter by type. The dropdown beside the view switch lists only the kinds of work actually in your queue, with how many of each. Choosing one narrows the list, and nothing else: the place numbers beside the rows stay the real queue positions, and the meters, the depth, "fit today" and the cut line all keep describing the whole queue. Your choice is in the address bar, so the filtered view can be reloaded, bookmarked, or shared.
- Pause a row. Pause holds one row back without cancelling it. It keeps its place in the queue and its history; it is simply never handed to the extension until you press Resume. Paused rows stay visible, marked Paused, and spend none of the day's allowance — so pausing work does not push anything else past today's cut line. Select several rows and the bulk bar offers Pause and Resume for all of them at once.
Pausing an action is not the same as the Paused step in the Prospecting Journey. The step is a statement about the campaign — no action for now, on this person. Pausing here is about one queued piece of work.
Use Claude or another API client¶
The Outreach backend uses the standard token-authenticated METIS API. There is
no /outreach/contacts endpoint and no import endpoint. Uploads remain in the
web interface.
The usual API flow is:
- discover your network with
GET /api/v1/holons?class=outreach-network; - search its Memberships with
GET /api/v1/holons/{holon_id}/memberships; - find additional People with
GET /api/v1/people?q=...; - add up to 500 People to
outreach-prospectingwithPOST /api/v1/holons/{holon_id}/memberships:bulk-add; and - update individual Memberships with
POST /api/v1/memberships/{membership_id}/update; and - read or refresh source-specific LinkedIn profile data with
GET /api/v1/outreach/people/{person_id}/linkedinandPOST /api/v1/outreach/people/{person_id}/linkedin/update.
Pass network_id={holon_id} to the enrichment routes when working in a shared
network. If omitted, they use your owned Outreach network. Access is the same
standard team-active Holon access used by the generic Membership APIs.
LinkedIn enrichment is kept separate from canonical Person data. In
particular, an agent never writes or replaces Person.description; METIS uses
LinkedIn about/headline as a computed display fallback only when the canonical
description is blank. (Seeding a blank description is done only by the
profile-reading browser pass described above, never through this API.) The source email is likewise kept separate from the
canonical contact email. The connection date belongs to the caller's LinkedIn
Network Membership. A Person may be enriched through any Membership on the
caller's Outreach network, including a prospect who never appeared in the
LinkedIn export; setting connected_on additionally requires a LinkedIn
Network Membership. METIS does not enrich a Person linked to a login account;
the update API returns 403 and imports leave their source profile fields in
the report instead.
See the Outreach API playbook for requests,
filters, retry behavior, and examples. The live OpenAPI document at
/api/v1/openapi.json is authoritative for request and response shapes.
Troubleshooting¶
- The ZIP is rejected: upload the LinkedIn ZIP unchanged. Nested archives,
encrypted archives, unsafe paths, and archives with zero or multiple
Connections.csvfiles are rejected. - A row says
ambiguous_linkedin_url: more than one METIS Person currently has the same normalized LinkedIn URL. Resolve the duplicate People before importing that row again. - A source name differs: METIS matched by URL and kept the existing Person's canonical name. The report records a warning.
- The report is unavailable: reports are temporary and normally expire after seven days. The imported People and Memberships remain in METIS.
- Today's allowance is spent on work that produced nothing: open Outreach → Up Next and use Reset today's count under the meters. It restarts the count, not the history — every action stays in History, because those profiles were opened and LinkedIn saw them. Use it when a run spent the day against no result, not to work past a ceiling that is doing its job.
- A profile pass is stuck and neither screen will restart it: this happens when the browser running it disappeared without telling METIS — the tab was closed, or the machine slept. In the extension panel's activity tab the pass offers Take over, which hands its remaining profiles to the browser you are in. Anything still running that pass elsewhere stops, so it takes two presses.