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

# SiteLink Integration: Setup and Sync

> Connect SiteLink self-storage management software to DualEntry to import each location's daily accounting activity as posted journal entries in your ledger.

Connect [SiteLink](https://www.sitelink.com/), the self-storage facility management platform, to DualEntry to pull each location's daily accounting activity and post it as [journal entries](../core-financials/general-ledger/journal-entries) in your ledger. DualEntry reads SiteLink's general journal report through SiteLink's SOAP reporting API, groups the lines into one balanced journal entry per location per day, and posts them to the company you map each location to. Data flows one way: SiteLink to DualEntry. DualEntry never writes back to SiteLink.

## Prerequisites

Confirm the following before connecting:

* SiteLink corporate API credentials: a corporate code, a username, and a password with access to the SiteLink reporting web service. DualEntry supplies the SiteLink API license key, so you do not provide one unless you need to override the default.
* A DualEntry [classification](../core-financials/general-ledger/journal-entries#line-fields) whose lines represent your SiteLink locations. Each line name must start with the 3-character SiteLink location code (for example, `301 - Downtown`). DualEntry reads the first three characters as the location code.
* A DualEntry [company](../platform-configuration/multi-entity-consolidation) for each location you sync, so location activity posts to the correct entity.
* Your [chart of accounts](../core-financials/general-ledger/chart-of-accounts) configured in DualEntry. DualEntry discovers the SiteLink accounts that appear in recent activity and asks you to map each one to a GL account.

<Info>
  SiteLink reporting credentials are configured by a DualEntry system administrator, not from the standard integration screen. The administrator sets the corporate code, username, and password (and an optional API license key override) before you complete mapping.
</Info>

## How locations and accounts map

DualEntry models SiteLink locations and accounts as two mapping layers you complete before any journal entry posts. Setup is not complete until every location and every discovered account is mapped.

* **Locations come from a classification.** Select one DualEntry classification in the integration settings that represents locations in SiteLink. Within the Classifications mapping tab, map each location to a DualEntry company to ensure journal entries are posted to the appropriate company. In the mapping screen the location's target column is labeled "Company".
* **Accounts come from recent activity.** DualEntry pulls SiteLink general journal lines from a backfill window (90 days by default) and collects every distinct account it sees. Each account is identified by its account code plus sub-account name, so `1004` and `1004:Late Fees` map separately. You map each discovered account to a DualEntry GL account.

<Warning>
  Changing the selected classification after setup clears every location and account mapping for the integration, because the location set is derived from that classification. You must remap before the next sync posts journal entries.
</Warning>

## How to connect

The integration authenticates against SiteLink's SOAP reporting service using your corporate credentials combined with the DualEntry-managed API license key. SiteLink does not offer a sandbox, so you connect against live data.

1. Ask your DualEntry system administrator to set the SiteLink credentials on the integration: corporate code, username, and password (plus an API license key only if you are overriding the default).
2. In DualEntry, navigate to **Settings → Integrations → SiteLink** and open the integration settings.
3. Select the DualEntry classification whose lines carry your SiteLink location codes. DualEntry creates a location record for each line whose name starts with a 3-digit code.
4. Map every location to the DualEntry company that should hold its activity.
5. Let DualEntry run the initial backfill to discover accounts, then map every discovered account to a DualEntry GL account.
6. Confirm the integration status is **Connected**. Once all locations and accounts are mapped and the status is Connected, setup is complete and scheduled syncs begin.

## What syncs

Each sync run reads SiteLink's general journal report per mapped location and turns it into DualEntry records. The table below lists what DualEntry pulls and how it lands in your ledger.

| SiteLink data                        | DualEntry record                     | Notes                                                                                                                                                                                                  |
| ------------------------------------ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Locations (from the classification)  | mapping to a DualEntry company       | Codes come from SiteLink and map to a DualEntry classification; each location must map to a company before setup completes. Location classifications also appear at the line level on journal entries. |
| Accounts (from recent journal lines) | mapping to a DualEntry GL account    | Discovered from the backfill window. Identified by account code plus sub-account name, so sub-accounts map independently.                                                                              |
| General journal lines                | grouped into `journal_entry` records | Lines are grouped by date and location into one balanced journal entry per location per day, posted to the mapped company.                                                                             |

Each general journal line carries a transaction type that SiteLink reports as a numeric code: `1` income, `2` credits, `3` refunds, and `5` NSF (returned payments). DualEntry preserves the line's debit or credit amount and builds the line memo from the account name and sub-account name. Every journal entry posts in USD with an exchange rate of 1 and is created in posted status.

## How sync runs

Once setup is complete, DualEntry syncs SiteLink activity automatically. A few behaviors govern the date window and reliability.

* **Account discovery window.** Before the first sync, DualEntry looks back 90 days to discover accounts. Adjust the backfill window in integration settings if your recent activity does not surface every account you need to map.
* **Journal entry sync window.** Each run pulls activity from the configured start date through today. If a global cutoff date is set, DualEntry uses it; otherwise it uses the SiteLink sync start date, falling back to the last 3 days when neither is set.
* **90-day range cap.** A single sync cannot span more than 90 days. If the start date is more than 90 days in the past, DualEntry stops with an error rather than pulling an oversized range. Move the cutoff date forward to within 90 days and resync.
* **Retries.** SiteLink returns a "server busy" signal (`-90`) under load. DualEntry retries the call up to three times with a backoff before surfacing the failure, and retries transient network errors with exponential backoff.

## Troubleshoot sync errors

When a sync or a journal entry fails, the most common causes are below.

| Symptom                                        | Cause                                                                      | Resolution                                                                                                                                                |
| ---------------------------------------------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Authentication fails                           | Wrong corporate code, username, or password, or a missing API license key. | Ask your system administrator to re-enter the SiteLink credentials. SiteLink has no sandbox, so credentials must be valid for the live reporting service. |
| Setup never completes                          | One or more locations or accounts are unmapped.                            | Map every location to a company and every discovered account to a GL account. Confirm the integration status is Connected.                                |
| A location's entries are missing               | The location is not mapped to a company.                                   | Map the location to a DualEntry company; lines for unmapped locations are skipped with an error.                                                          |
| A journal entry fails with an unmapped account | A line references an account that has no GL mapping.                       | Map the account. If it was created after the last backfill, rerun discovery so the new account surfaces.                                                  |
| Sync stops with a date-range error             | The cutoff or start date is more than 90 days in the past.                 | Move the cutoff date forward so the range is within 90 days, then resync.                                                                                 |
| Sync fails after retries                       | SiteLink returned "server busy" (`-90`) or a network error persisted.      | DualEntry already retries three times; resync once SiteLink load clears. Check the [SiteLink status page](https://status.sitelink.com/).                  |

## FAQ

### Does DualEntry write back to SiteLink?

No. The integration is pull-only. SiteLink remains the system of record for facility operations; DualEntry holds the accounting view derived from SiteLink's general journal report.

### Why do I configure locations through a classification instead of entering them directly?

DualEntry reuses your existing DualEntry classification structure so location codes stay aligned with how you already segment activity.

### Can I sync more than 90 days of history at once?

No. A single sync is capped at a 90-day range. To load older history, run successive syncs, moving the cutoff date forward each time so each range stays within 90 days.

## For maintainers

The details below describe connector configuration and internal endpoints, not user-facing features.

* SOAP endpoint: `https://api.smdservers.net/CCWs_3.5/ReportingWs.asmx` (WSDL at the same URL with `?WSDL`). The connector calls the `GeneralJournalEntries` method per location. `SUPPORTS_SANDBOX = False`.
* API license key: read from the `SITELINK_API_LICENSE_KEY` environment variable unless overridden per integration. The reporting username is sent as `username:::api_license_key`.
* Setting keys (category `sitelink`): `SITELINK_TARGET_CLASSIFICATION_ID` (source classification), `SITELINK_BACKFILL_DAYS` (account discovery window, default 90), and `SITELINK_SYNC_START_DATE` (journal entry start date). The global `DEFAULT_CUTOFF_DATE` setting overrides the start date when present.
* Range cap: `MAX_CUTOFF_DAYS = 90`; `DEFAULT_SYNC_DAYS = 3` when no start date is set; `DEFAULT_BACKFILL_DAYS = 90`.
* Retry: server-busy (`-90`) and network errors retry up to `MAX_RETRIES = 3` with a `RETRY_BACKOFF` of 15 seconds; request timeout is 120 seconds.
* Credentials endpoints (system administrator only): `POST /api/integrations/sitelink/{integration_id}/credentials/` and `GET .../credentials/` (returns corporate code and username only). Description enhancement: `PUT /api/integrations/sitelink/{integration_id}/accounts/{record_id}/enhancement/`.

## Result

After completing these steps, you have a SiteLink integration that discovers your locations and accounts, maps them to DualEntry companies and GL accounts, and posts each location's daily SiteLink activity as a balanced journal entry. SiteLink stays the system of record for facility operations; DualEntry holds the accounting view. To compare other pull-only integrations, see [Cubby Storage](./cubby) and [Bill.com](./bill-com). To audit the resulting entries, see [Journal Entries](../core-financials/general-ledger/journal-entries). To connect additional systems, return to [Integrations](./index).
