> ## Documentation Index
> Fetch the complete documentation index at: https://help.pipelime.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect HeyReach

> Send a HeyReach API key and, optionally, a list ID, and PipeLime pushes leads into that list for LinkedIn outreach.

export const UiPath = ({children}) => {
  const parts = String(children).split(/\s*(?:→|>)\s*/).filter(Boolean);
  return <span className="pl-path">
      {parts.map((part, index) => <span key={`${index}-${part}`}>
          {index > 0 && <span className="pl-path__sep">→</span>}
          {part}
        </span>)}
    </span>;
};

export const Screenshot = ({id, alt, caption, frame = 'browser', url, marks = [], lang = 'en', workspace = 'northwind-outbound'}) => {
  const src = `/images/screenshots/${lang}/${id}.png`;
  const chrome = url ? `app.pipelime.ai/${workspace}${url}` : 'app.pipelime.ai';
  return <figure className={`pl-shot pl-shot--${frame} not-prose`}>
      <div className="pl-shot__frame">
        {frame !== 'bare' && <div className="pl-shot__bar">
            <span className="pl-shot__dots">
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
            </span>
            <span className="pl-shot__url">{chrome}</span>
          </div>}
        <div className="pl-shot__media">
          <img src={src} alt={alt} loading="lazy" />
          {marks.map(mark => <span key={mark.n} className="pl-shot__mark" style={{
    left: `${mark.x}%`,
    top: `${mark.y}%`
  }} aria-hidden="true">
              {mark.n}
            </span>)}
        </div>
      </div>
      {caption && <figcaption className="pl-shot__caption">{caption}</figcaption>}
    </figure>;
};

Connect HeyReach with an API key so we can push leads into a HeyReach list for LinkedIn outreach.

<div className="pl-availability">
  <div className="pl-availability__row">
    <div className="pl-availability__label">Where</div>
    <div className="pl-availability__value"><span className="pl-path">Integrations<span className="pl-path__sep">→</span>Integrations<span className="pl-path__sep">→</span>Apps & CRM</span></div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">Your role needs</div>
    <div className="pl-availability__value">Read access to Apps & CRM <code>read-integrations</code>. Admin, Member and Viewer have it by default.</div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">To create or change</div>
    <div className="pl-availability__value"><code>create-integrations</code> to add one, <code>update-integrations</code> to change one, on top of the permission above.</div>
  </div>

  <div className="pl-availability__note">If you cannot find this in your sidebar, your workspace may have a custom menu configuration. Contact support and we will check it for you.</div>
</div>

## Before you begin

* A HeyReach account with an API key, from HeyReach's own Integrations > Public API settings. The dialog links straight there.
* Optionally, the numeric ID of a HeyReach list you already use. Leave it out and PipeLime creates one for you, so this only matters if you already run outreach through an existing list.
* Nothing has to be set up on our side. The API key is your own credential, so this connects the same way on every workspace.

## Steps

<Steps>
  <Step title="Open the HeyReach connect dialog">
    Go to <UiPath>Integrations → Integrations → Apps & CRM</UiPath>, choose **Add integration**, then choose **HeyReach** from the list. That menu item and the dialog behind it are English only, whatever language the rest of the interface is in: none of their text has a translation. The dialog opens straight on its connect form: instructions for getting your API key and list ID, then both fields underneath.

    <Screenshot id="integrations/connect-heyreach--form" frame="bare" alt="The Connect HeyReach dialog: an intro sentence, a green panel titled How to get your API Key & List ID with three numbered steps and links to Open API Settings and Open My Lists, an empty API Key field, and a List ID field with a hint box showing where to find it in a HeyReach list's URL and noting that leaving it empty creates a new list automatically" caption="Leave List ID blank and PipeLime creates a new, empty list in HeyReach for you, named after your workspace." marks={[{ n: 1, x: 50, y: 30 }, { n: 2, x: 50, y: 84 }]} />

    The instructions panel (1) is covered in the next step, and the List ID field with its hint (2) in the one after that.
  </Step>

  <Step title="Get your API key from HeyReach">
    The panel's three steps point at HeyReach's own settings:

    1. Log in to your HeyReach account at app.heyreach.io.
    2. Go to "Integrations > Public API" in the left sidebar.
    3. Copy your API key.

    Two links underneath jump straight there: **Open API Settings**, and **Open My Lists** for the next step. Paste the key into the API key field.
  </Step>

  <Step title="Add a list ID, or leave it blank">
    The List ID field is optional. If you already run a HeyReach list for this outreach, open it in HeyReach and copy the number from its URL, the same shape as the field's own example, `app.heyreach.io/app/my-list/574910`. Leave it blank and PipeLime creates a new, empty list in HeyReach for you instead, named after your workspace with "Leads" appended, and uses that.

    Choose **Connect**. PipeLime checks the key against HeyReach's own API before saving anything: an invalid key is rejected immediately and nothing is stored. When List ID was left blank, creating that new list happens in this same step, so a failure there is reported too, before anything is saved. Once both succeed, the dialog shows **HeyReach Connected!**

    <Note>
      Connecting again later updates this same connector's key and list rather than adding a second one. A workspace only ever holds one HeyReach connection.
    </Note>
  </Step>
</Steps>

## What happens next

<Check>
  The dialog shows **HeyReach Connected!** Choose **Done**, and the HeyReach card on <UiPath>Integrations → Integrations → Apps & CRM</UiPath> shows a **Connected** chip. Its own header reads 'Heyreach', title-cased from the connector type rather than taken from HeyReach's own spelling. The connection itself is stored as 'HeyReach', and that is what shows lower down on the card, just above the date you connected it.
</Check>

Connecting HeyReach doesn't push any leads by itself. Nothing moves until you turn on **Auto-push analyzed leads** on the card, choose **Push to CRM** on a lead's own page, or add a Send to CRM step to a workflow. See [Auto-push analyzed leads and stage filters](/en/integrations/auto-push-and-stage-filters) and [Push a lead to your CRM manually](/en/integrations/push-to-crm-manually).

HeyReach doesn't create a contact record the way HubSpot or Salesforce does, since a list append has nothing to look up afterwards. Only one CRM ever owns a lead, and HeyReach counts as one. If HubSpot, Salesforce, Odoo or Kommo already claimed the lead, an automatic push to HeyReach is skipped without telling you, and a workflow's Send to CRM step takes its **Sent** branch while adding nothing to the list. A manual push from the lead's page is the one route that still goes through. It works in the other direction too: once a lead has been pushed to HeyReach, a later automatic push to any record-creating CRM is skipped the same way.

Automatic pushes and the manual **Push to CRM** button both refuse a lead that has no email address, even though a HeyReach list will take a LinkedIn profile URL on its own. A workflow's Send to CRM step is the only route that does not check.

Once a lead is pushed, HeyReach receives its first and last name split apart, its LinkedIn profile URL, company name, job title, most recently added email address, and its city, state and country joined into one line, leaving out whichever of those the lead doesn't have. No phone number, note or email history goes with it: the list-append call has nowhere to put any of them. Because HeyReach's own API returns no per-lead identifier, PipeLime makes one up so the lead still shows as pushed, joining the list's ID and the lead's own ID (for example, `hr_574910_9021`). [Field mapping reference per CRM](/en/integrations/what-gets-pushed-per-crm) has the same detail for every other connector.

## Troubleshooting

<AccordionGroup>
  <Accordion title="'Invalid HeyReach API key…'">
    The full message reads "Invalid HeyReach API key. Please ensure you have the correct API key from your HeyReach account settings." The key was checked against HeyReach's own API before anything was saved, and that check failed, so nothing was created. Copy a fresh key from HeyReach's Integrations > Public API page (the dialog links to it) rather than retyping it.
  </Accordion>

  <Accordion title="'API key is valid but failed to create a list…'">
    The full message reads "API key is valid but failed to create a list in HeyReach. Please try again or provide an existing List ID." This only happens when you leave List ID blank: your key passed, but creating the new list in HeyReach failed. Try again, or paste the ID of a list you already have instead.
  </Accordion>

  <Accordion title="Connected, but leads aren't showing up in HeyReach">
    Connecting only makes HeyReach available as a destination. It doesn't push anything on its own. Check whether **Auto-push analyzed leads** is on for this card, and see [Auto-push analyzed leads and stage filters](/en/integrations/auto-push-and-stage-filters) for every reason a push can be silently skipped. If HeyReach itself refuses the lead, so that nothing was added and nothing updated, you get "HeyReach rejected the lead. Ensure the lead has a valid LinkedIn profile URL or email."
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Auto-push analyzed leads and stage filters" icon="send" href="/en/integrations/auto-push-and-stage-filters">
    What triggers an automatic push, which stages it fires on, and every reason a lead is silently skipped.
  </Card>

  <Card title="Field mapping reference per CRM" icon="table" href="/en/integrations/what-gets-pushed-per-crm">
    What object each connector creates, which lead fields land where, and what happens to your email history.
  </Card>

  <Card title="Connect a LinkedIn account" icon="link" href="/en/channels/connect-linkedin-account">
    Sign in with your LinkedIn credentials, clear the security checkpoint LinkedIn asks for, and reconnect when the session drops.
  </Card>
</CardGroup>
