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

# Connect an external system

> Register your CRM or field-service software in Liftify, set how often it syncs, and check that the data arrived.

Liftify pulls customers and jobs out of the software you already run your business in, so campaigns can go out without anyone re-keying anything. Setting that up has three parts: register the system, tell Liftify how often to sync it, and check the data landed.

All of this lives under **Integrations** in the settings menu. Registering a system needs the **Manage external systems and their aliases** permission; sync settings, credentials and sync activity each have their own permission on top of that, so you may see some of these pages and not others.

## Register the system

1. In the left sidebar, click the circle with your initials, then **User Settings**.
2. Under **Integrations**, click **External Systems**. The page explains its purpose: *"Register the third-party systems your account integrates with so aliases can map Liftify records to their identifiers in those systems."*
3. Click **Add External System**.
4. Fill in the form:

| Field            | What to put in it                                                                                                                                       |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Display name** | Required. *"Human-readable label shown throughout the app."* For example, ServiceTitan.                                                                 |
| **Slug**         | Required. *"Stable lowercase identifier (letters, numbers, hyphens, underscores). Unique within the account."* It can't be changed after you save.      |
| **Description**  | Optional notes about this system.                                                                                                                       |
| **External ID**  | *"This tenant's identifier in the external system."*                                                                                                    |
| **System type**  | Pick the matching type — for example **ServiceTitan**, or **Generic (API only)** if you're feeding Liftify through the API rather than a built-in sync. |
| **Status**       | Leave the switch on for **Active — available to use in alias mappings**.                                                                                |

5. Click **Create External System**.

The system now appears in the table with its **NAME**, **SLUG**, **DESCRIPTION** and an **Active** or **Inactive** badge. Use the **Status** filter or **Search systems...** to find one in a long list.

<Note>
  **Credentials** and **Sync settings** only appear once the system exists. Save it first, then click the pencil icon on its row to reopen it and finish the setup.
</Note>

## Add credentials

If the system type needs credentials, a **Credentials** section appears when you edit the system. For ServiceTitan that's **Client ID** and **Client secret**.

These are write-only: *"Write-only: saved values are never shown. Leave a field blank to keep the current value."* A field that already holds a value shows **•••••• (set)** as its placeholder; one that doesn't shows **Not set**. Click **Save Changes** when you're done.

## Sync settings

Also on the edit page, **Sync settings** opens with when the system last ran — either **Last synced** and a date, or **Never synced**.

* **Platform sync** — the switch that turns syncing on. Its label spells out the cadence in use — *"Enabled — the platform sync runs every N minutes for this system"*, with the real number in place of N.
* **Sync interval override (minutes)** — *"Leave blank to use the platform interval for this system type."*
* Per-feed fields at the bottom track how far through each feed the last sync got: *"Per-feed cursors. Clearing a field re-pulls that feed from the start of tenant history on the next run."*

You may also see **Webhook URL override** and **Bootstrap webhook URL override**. Both say *"Platform default"* when empty, and that's what they should normally say — leave them blank unless Liftify support asks you to set one.

Click **Save Changes** to apply.

### Re-pull older data

If your system type supports syncing, a **Backfill** section sits at the bottom of the edit page. It resets every feed so the next sync fetches history again: *"Resets every feed cursor to one date — the next sync re-pulls all changes since then."*

Enter a date in **Re-pull changes since** and click **Reset all cursors**. You're asked to confirm first: *"Reset every feed cursor? The next sync re-pulls all changes since the chosen date."*

<Warning>
  Backfilling makes the next sync much larger than usual, and it applies to every feed on the system, not just one. Use it when data is genuinely missing, not as a routine refresh.
</Warning>

## Choose which jobs campaigns act on

**Integration Capture**, also under **Integrations**, is where you stop particular kinds of work from triggering campaigns. It's important to understand what it does and doesn't do, and the page states it directly:

> Everything your integrations send is ingested. These settings only control which jobs campaigns act on: excluded job types, tags, and business units still land — they just never trigger campaign capture.

In other words, excluding something here doesn't hide it from Liftify. The record still arrives; it just never enrolls anyone in a campaign.

The table lists each **DIMENSION**, **NAME**, **EXTERNAL ID** and an **EXCLUDED** switch. Flip a switch to exclude that item — it saves immediately. Narrow the list with the **Dimension** dropdown (**All dimensions**, **Job types**, **Tag types**, **Business units**) or the **Search** box.

Rows appear on their own as data comes in. Before anything has synced you'll see **No integration records yet**.

## Check whether the data arrived

Click **Sync Activity** under **Integrations**. The page shows *"Every sync run and what it did — contacts, jobs, and campaign outcomes."*

The table lists recent syncs with columns for **RUN**, **SOURCE**, **RECEIVED**, **STATUS** and **ITEMS**. Status is one of:

| Badge                        | Meaning                                   |
| ---------------------------- | ----------------------------------------- |
| **Completed**                | Everything in that batch was processed.   |
| **Partial**                  | Some items processed, some didn't.        |
| **Failed**                   | The batch didn't process.                 |
| **Expired** or **Discarded** | The batch was dropped without processing. |

If anything needs looking at, a **Needs attention** panel sits above the table with counts by outcome — **Enrolled**, **Not enrolled**, **Held out**, **Pending**, **Skipped** — and, where Liftify knows it, a reason such as *"No campaigns were eligible for this location"* or *"The job's location no longer exists"*.

### Read a single run

Click a run to open it. Three cards across the top follow the batch from end to end:

1. **Received** — how many items came from the source system.
2. **Processed** — how many Liftify handled, broken down into created, updated, unchanged, deferred and failed.
3. **Campaigns** — how many people were enrolled, held out, not enrolled or still pending. This card only appears once campaign outcomes are known.

Below that, a table breaks the same numbers down by stage, and a **Processing failures** panel groups anything that errored.

If nothing has ever synced you'll see **No sync activity yet**, with the note *"Runs appear here as your integrations sync."* That's the first thing to check when a campaign isn't picking up new jobs.
