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

# Vendor Sync Workflow Guide

> The end-to-end sequence for this sync: fetching and matching Vendors, then creating, updating, unarchiving, and archiving them.

export const ArchiveVendorsDiagramNonClickable = () => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const s2Fill = isDark ? "#212222" : "#EEF4F4";
  const s2Stroke = isDark ? "#848989" : "#212222";
  const s2TextStyle = isDark ? ",color:#EEF4F4" : ",color:#212222";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "10px"}}}%%
flowchart LR
    S1["1. Archive the Vendor"] --> S2["Vendor state: ARCHIVED"]

style S1 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S2 white-space:normal,fill:${s2Fill},stroke:${s2Stroke},stroke-dasharray:5 5${s2TextStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const UpdateVendorsDiagramNonClickable = () => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const s2Fill = isDark ? "#212222" : "#EEF4F4";
  const s2Stroke = isDark ? "#848989" : "#212222";
  const s2TextStyle = isDark ? ",color:#EEF4F4" : ",color:#212222";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "10px"}}}%%
flowchart LR
    S1["1. Update the Vendor"] --> S2["Vendor details<br>match the AS"]

style S1 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S2 white-space:normal,fill:${s2Fill},stroke:${s2Stroke},stroke-dasharray:5 5${s2TextStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const UnarchiveVendorsDiagramNonClickable = () => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const s2Fill = isDark ? "#212222" : "#EEF4F4";
  const s2Stroke = isDark ? "#848989" : "#212222";
  const s2TextStyle = isDark ? ",color:#EEF4F4" : ",color:#212222";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "10px"}}}%%
flowchart LR
    S1["1. Unarchive the Vendor"] --> S2["Vendor state: ACTIVE"]

style S1 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S2 white-space:normal,fill:${s2Fill},stroke:${s2Stroke},stroke-dasharray:5 5${s2TextStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const CreateVendorsDiagramNonClickable = () => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const s2Fill = isDark ? "#212222" : "#EEF4F4";
  const s2Stroke = isDark ? "#848989" : "#212222";
  const s2TextStyle = isDark ? ",color:#EEF4F4" : ",color:#212222";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "10px"}}}%%
flowchart LR
    S1["1. Create Vendors for<br>New AS Entries"] --> S2["Vendor state: ACTIVE"]

style S1 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S2 white-space:normal,fill:${s2Fill},stroke:${s2Stroke},stroke-dasharray:5 5${s2TextStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const FetchAndMatchVendorsDiagramNonClickable = () => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const s4Fill = isDark ? "#212222" : "#EEF4F4";
  const s4Stroke = isDark ? "#848989" : "#212222";
  const s4TextStyle = isDark ? ",color:#EEF4F4" : ",color:#212222";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "18px"}}}%%
flowchart LR
    S1["1. Fetch Active Vendors from AS"] --> S2["2. Fetch All Vendors from Pleo"] --> S3["3. Match by externalId<br><br>"] --> S4["Create, Update,\nUnarchive, and Archive Vendors"]

style S1 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S2 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S3 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S4 white-space:normal,fill:${s4Fill},stroke:${s4Stroke},stroke-dasharray:5 5${s4TextStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const VendorSyncOverviewDiagram = () => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const subgraphFill = isDark ? "#131414" : "#ffffff";
  const subgraphStroke = isDark ? "#848989" : "#6B7070";
  const subgraphTextStyle = isDark ? ",color:#EEF4F4" : ",color:#6B7070";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "12px"}}}%%
flowchart LR

subgraph AS["Accounting System"]
    source["Vendors"]
end

subgraph Pleo["Pleo APIs"]
    A["1. Fetch and<br>Match Vendors"]
    B["2. Create<br>Vendors"]
    C["3. Unarchive<br>Vendors"]
    D["4. Update<br>Vendors"]
    E["5. Archive<br>Vendors"]
    A --> B --> C --> D --> E
end

source --> A

click A "#1-fetch-and-match-vendors"
click B "#2-create-vendors"
click C "#3-unarchive-vendors"
click D "#4-update-vendors"
click E "#5-archive-vendors"

style A white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style B white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style C white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style D white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style E white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style source white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}

style AS fill:${subgraphFill},stroke:${subgraphStroke}${subgraphTextStyle}
style Pleo fill:${subgraphFill},stroke:${subgraphStroke}${subgraphTextStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const WhatComesNext = ({children, href}) => <div className="mt-4">
    <a href={href} className="btn-primary">
      {children} →
    </a>
  </div>;

export const RememberCallout = ({title, children}) => <div className="callout-box callout-remember">
    <div className="callout-row">
      <span className="callout-icon">
        <svg width="22" height="22" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="currentColor"><path d="M229.66,98.34,172.39,155.8c11.46,22.93-1.72,45.86-10.11,57a8,8,0,0,1-12,.83L42.34,105.76A8,8,0,0,1,43,93.85c29.65-23.92,57.4-10,57.4-10l57.27-57.46a8,8,0,0,1,11.31,0L229.66,87A8,8,0,0,1,229.66,98.34Z" opacity="0.2" /><path d="M235.32,81.37,174.63,20.69a16,16,0,0,0-22.63,0L98.37,74.49c-10.66-3.34-35-7.37-60.4,13.14a16,16,0,0,0-1.29,23.78L85,159.71,42.34,202.34a8,8,0,0,0,11.32,11.32L96.29,171l48.29,48.29A16,16,0,0,0,155.9,224c.38,0,.75,0,1.13,0a15.93,15.93,0,0,0,11.64-6.33c19.64-26.1,17.75-47.32,13.19-60L235.33,104A16,16,0,0,0,235.32,81.37ZM224,92.69h0l-57.27,57.46a8,8,0,0,0-1.49,9.22c9.46,18.93-1.8,38.59-9.34,48.62L48,100.08c12.08-9.74,23.64-12.31,32.48-12.31A40.13,40.13,0,0,1,96.81,91a8,8,0,0,0,9.25-1.51L163.32,32,224,92.68Z" /></svg>
      </span>
      <div>
        {title && <div className="callout-title">
            {title}
          </div>}
        <div className="callout-body">
          {children}
        </div>
      </div>
    </div>
  </div>;

export const RecommendedCallout = ({title, children}) => <div className="callout-box callout-recommended">
    <div className="callout-row">
      <span className="callout-icon">
        <svg width="22" height="22" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="currentColor"><path d="M229.06,108.79l-48.7,42,14.88,62.79a8.4,8.4,0,0,1-12.52,9.17L128,189.09,73.28,222.74a8.4,8.4,0,0,1-12.52-9.17l14.88-62.79-48.7-42A8.46,8.46,0,0,1,31.73,94L95.64,88.8l24.62-59.6a8.36,8.36,0,0,1,15.48,0l24.62,59.6L224.27,94A8.46,8.46,0,0,1,229.06,108.79Z" opacity="0.2" /><path d="M239.18,97.26A16.38,16.38,0,0,0,224.92,86l-59-4.76L143.14,26.15a16.36,16.36,0,0,0-30.27,0L90.11,81.23,31.08,86a16.46,16.46,0,0,0-9.37,28.86l45,38.83L53,211.75a16.38,16.38,0,0,0,24.5,17.82L128,198.49l50.53,31.08A16.4,16.4,0,0,0,203,211.75l-13.76-58.07,45-38.83A16.43,16.43,0,0,0,239.18,97.26Zm-15.34,5.47-48.7,42a8,8,0,0,0-2.56,7.91l14.88,62.8a.37.37,0,0,1-.17.48c-.18.14-.23.11-.38,0l-54.72-33.65a8,8,0,0,0-8.38,0L69.09,215.94c-.15.09-.19.12-.38,0a.37.37,0,0,1-.17-.48l14.88-62.8a8,8,0,0,0-2.56-7.91l-48.7-42c-.12-.1-.23-.19-.13-.5s.18-.27.33-.29l63.92-5.16A8,8,0,0,0,103,91.86l24.62-59.61c.08-.17.11-.25.35-.25s.27.08.35.25L153,91.86a8,8,0,0,0,6.75,4.92l63.92,5.16c.15,0,.24,0,.33.29S224,102.63,223.84,102.73Z" /></svg>
      </span>
      <div>
        {title && <div className="callout-title">
            {title}
          </div>}
        <div className="callout-body">
          {children}
        </div>
      </div>
    </div>
  </div>;

<RecommendedCallout title="Recommended Workflow">
  This guide covers the Accounting System → Pleo half of [Integration Level 4](/docs/current/getting-started/accounting-integrations-overview), which syncs Vendor records from your Accounting System (AS) into Pleo. It builds on Level 3 and lets bookkeepers tag expenses and invoices to the correct vendor before export.
</RecommendedCallout>

<RememberCallout title="Remember">
  This guide covers Vendor Sync only. For the complementary Pleo → Accounting System direction, where a bookkeeper creates a brand-new vendor directly in Pleo, see the [Vendor Creation Workflow Guide](/docs/current/guides/vendor-creation-workflow-guide).
</RememberCallout>

## What You'll Have Built

After implementing this workflow:

* Active vendors from the AS are reflected as Vendors in Pleo.
* Vendors are automatically kept up to date on a scheduled basis.
* Bookkeepers can tag current, accurate vendors to expenses and invoices in Pleo.
* The integration aligns with Pleo's Vendor Sync guarantees and matching model.

## Who This Guide Is For

This guide is intended for:

* Integration developers
* Solution architects
* Accounting platform integrators

It focuses on **workflow understanding**, not implementation details.

## Before You Start

You should be familiar with:

* Pleo's [supported authentication](/docs/current/integration-design/auth/integration-design-auth-overview#authentication-policy-overview) methods.
* The [Vendor Sync](/docs/current/platform/accounting-integrations/imports/vendors/vendor-sync-overview) platform capabilities page.

## Vendor Sync Workflow Overview

Vendors in the AS are the definitive list of parties expenses and invoices can be attributed to. Each vendor has an `externalId` (the stable identifier used for matching), a `code`, a `name`, a `country`, a `defaultCurrency`, and optional `registrationNumber` and `taxRegistrationNumber` values.

Vendor Sync copies this structure into Pleo. The Accounting System is the source of truth; the integration's role is to keep Pleo's Vendors aligned with the current state of the AS so bookkeepers always have accurate, up-to-date vendors when tagging expenses and invoices.

<VendorSyncOverviewDiagram />

The how-to articles in this section use a consistent example to illustrate each step. The table below shows the starting state in both systems before the sync runs.

| Vendor (AS)                 | AS Status | Vendor (Pleo)            | Pleo Status    | Desired Pleo State   |
| --------------------------- | --------- | ------------------------ | -------------- | -------------------- |
| Acme Supplies (EXT-001)     | Active    | Acme Supplies (EXT-001)  | Active         | Active (no change)   |
| Nordic Freight (EXT-002)    | Active    | Nordic Freight (EXT-002) | Archived       | Unarchived           |
| Bright Office Ltd (EXT-003) | Active    | —                        | Does not exist | Created              |
| Kaffehuset AS (EXT-004)     | Active    | Kaffehuset AS (EXT-004)  | Active         | Updated to match AS  |
| —                           | —         | Old Print Shop (EXT-005) | Active         | Archived (not in AS) |

The steps progress as follows:

| Step                       | Action                                                      | Outcome                                      |
| -------------------------- | ----------------------------------------------------------- | -------------------------------------------- |
| 1. Fetch and Match Vendors | Fetches vendors from AS and Pleo, matches by `externalId`   | Each vendor is paired with a required action |
| 2. Create Vendors          | Creates new Vendors in Pleo for unmatched active AS vendors | Pleo reflects new AS vendors as `ACTIVE`     |
| 3. Unarchive Vendors       | Unarchives Vendors whose AS vendor is active again          | Pleo reflects the AS vendor's active state   |
| 4. Update Vendors          | Updates Vendor details that differ from the AS              | Pleo Vendor details match the AS             |
| 5. Archive Vendors         | Archives Vendors with no matching active AS vendor          | Pleo no longer offers them for tagging       |

***

## Steps

### 1. Fetch and Match Vendors

#### Purpose

This step runs at the start of every Vendor Sync cycle. The integration retrieves active vendors from the AS and all Vendors from Pleo (active and archived), then matches them using the `externalId` field to determine what action is needed for each vendor.

#### Input

* Active vendors from the AS
* Active and archived Vendors from Pleo. Archived Vendors are included so they can be unarchived rather than duplicated if a vendor becomes active in the AS again.

#### Workflow Process

The integration retrieves AS vendors, then retrieves all Pleo Vendors. It matches every AS vendor against Pleo Vendors by `externalId` and determines the required action for each.

<FetchAndMatchVendorsDiagramNonClickable />

#### Output

* Each AS vendor matched to a Pleo Vendor (or identified as new)
* Each Pleo Vendor identified as requiring creation, unarchiving, updating, or no action
* Active Pleo Vendors with no AS match flagged for archiving

#### Why It Matters

The matching step is the foundation of the reconciliation. Accurate matching by `externalId` ensures vendors are updated rather than duplicated, and that vendors removed from the AS are archived rather than left stale in Pleo.

#### Integration Design

If you're an integration developer or architect, read the [Sync Vendors](/docs/current/integration-design/accounting-integrations/imports/vendors/integration-design-vendor-sync) integration design doc before implementing this step. It covers the matching rules, performance considerations, and how the sync handles each reconciliation outcome.

#### Step-by-Step Instructions

When you're ready to start implementing, follow the step-by-step instructions in the accompanying how-to article.

<WhatComesNext href="/docs/current/how-tos/accounting-integrations/imports/vendors/how-to-fetch-and-match-vendors">
  How to Fetch and Match Vendors
</WhatComesNext>

***

### 2. Create Vendors

#### Purpose

For each active AS vendor with no matching Pleo Vendor, the integration creates a new Vendor in Pleo.

#### Input

* Active AS vendors identified in Step 1 as having no matching Pleo Vendor

#### Workflow Process

<CreateVendorsDiagramNonClickable />

#### Output

* A new Vendor created in Pleo, in `ACTIVE` state

#### Why It Matters

Without this step, a vendor that's genuinely active in the AS would never appear in Pleo, and bookkeepers could not tag expenses or invoices to it.

#### Integration Design

If you're an integration developer or architect, read the [Sync Vendors](/docs/current/integration-design/accounting-integrations/imports/vendors/integration-design-vendor-sync) integration design doc before implementing this step. It covers the API operation, request and response structure, and the data mapping requirements.

#### Step-by-Step Instructions

<WhatComesNext href="/docs/current/how-tos/accounting-integrations/imports/vendors/how-to-create-vendors">
  How to Create Vendors
</WhatComesNext>

***

### 3. Unarchive Vendors

#### Purpose

For each Pleo Vendor identified in Step 1 as `ARCHIVED` while its matching AS vendor is active, the integration unarchives it.

#### Input

* Pleo Vendors identified in Step 1 as `ARCHIVED` with an active matching AS vendor

#### Workflow Process

<UnarchiveVendorsDiagramNonClickable />

#### Output

* The Pleo Vendor's `state` transitions back to `ACTIVE`

#### Why It Matters

An AS vendor that becomes active again after being archived should reuse its existing Pleo Vendor record, not a duplicate. Unarchiving preserves that vendor's history.

#### Integration Design

If you're an integration developer or architect, read the [Sync Vendors](/docs/current/integration-design/accounting-integrations/imports/vendors/integration-design-vendor-sync) integration design doc before implementing this step. It covers the API operation, request and response structure, and the data mapping requirements.

#### Step-by-Step Instructions

<WhatComesNext href="/docs/current/how-tos/accounting-integrations/imports/vendors/how-to-unarchive-vendors">
  How to Unarchive Vendors
</WhatComesNext>

***

### 4. Update Vendors

#### Purpose

For each matched Vendor whose details differ from the AS, the integration updates the Pleo Vendor to match.

#### Input

* Matched Pleo Vendors identified in Step 1 as having details that differ from the AS

#### Workflow Process

<UpdateVendorsDiagramNonClickable />

#### Output

* The Pleo Vendor's details (name, country, currency, registration and tax numbers) updated to match the AS

#### Why It Matters

Without this step, Pleo's vendor details drift out of date, and bookkeepers could tag expenses or invoices to a vendor whose details no longer reflect the AS.

#### Integration Design

If you're an integration developer or architect, read the [Sync Vendors](/docs/current/integration-design/accounting-integrations/imports/vendors/integration-design-vendor-sync) integration design doc before implementing this step. It covers the API operation, request and response structure, and the data mapping requirements.

#### Step-by-Step Instructions

<WhatComesNext href="/docs/current/how-tos/accounting-integrations/imports/vendors/how-to-update-vendors">
  How to Update Vendors
</WhatComesNext>

***

### 5. Archive Vendors

#### Purpose

For each active Pleo Vendor identified in Step 1 as having no matching active AS vendor, across at least two consecutive sync runs, the integration archives it.

#### Input

* Active Pleo Vendors with no matching active AS vendor, unmatched across at least two consecutive sync runs. See the [Sync Vendors](/docs/current/integration-design/accounting-integrations/imports/vendors/integration-design-vendor-sync#4-archive-unmatched-vendors) integration design doc for the full two-consecutive-run safeguard.

#### Workflow Process

<ArchiveVendorsDiagramNonClickable />

#### Output

* The Pleo Vendor's `state` transitions to `ARCHIVED`
* The vendor is no longer offered for bookkeepers to tag on expenses and invoices, though it remains available to unarchive if it becomes active in the AS again

#### Why It Matters

A vendor no longer active in the AS should not stay tag-able in Pleo. Archiving, rather than deleting, keeps historical data intact while preventing new expenses or invoices from being tagged to it.

#### Integration Design

If you're an integration developer or architect, read the [Sync Vendors](/docs/current/integration-design/accounting-integrations/imports/vendors/integration-design-vendor-sync) integration design doc before implementing this step. It covers the API operation, request and response structure, and the data mapping requirements.

#### Step-by-Step Instructions

<WhatComesNext href="/docs/current/how-tos/accounting-integrations/imports/vendors/how-to-archive-vendors">
  How to Archive Vendors
</WhatComesNext>

***

## Observability and Recovery

Build in enough visibility to detect and recover from failures without manual database inspection:

* **Sync-run ID:** generate a unique ID for each sync run and include it in every log line for that run, so all create/update/unarchive/archive actions taken during one execution can be traced together.
* **Per-action counters:** log how many Vendors were created, updated, unarchived, and archived in each run. A sudden spike (for example, archiving far more vendors than usual) can indicate a partial AS fetch or a misconfigured connection, and is easier to catch with counters than by inspecting individual log lines.
* **Audit trail:** for each write action, log the vendor's `id`, `externalId`, the action taken, and the fields that changed, so any Vendor's history can be reconstructed later.

## What Comes Next?

Once Vendor Sync is live, bookkeepers can tag the synced vendors to expenses and invoices in Pleo before export.

To complete Level 4, also implement the complementary direction:

* [Vendor Creation Workflow Guide](/docs/current/guides/vendor-creation-workflow-guide): create vendors in the AS when a bookkeeper adds a new one directly in Pleo.

***

## Related Reading

* [Integration Design: Vendor Sync Implementation Overview](/docs/current/integration-design/accounting-integrations/imports/vendors/integration-design-vendor-sync-overview)
* [Platform Capabilities: Vendor Sync](/docs/current/platform/accounting-integrations/imports/vendors/vendor-sync-overview)

***
