# FTP(S)

Fulfilleo can connect to an FTP server to automatically fetch tracking files from your supplier. Three protocols are supported:

## Connection Setup

<figure><img src="/files/IPWDufbDjDYDhifrl5jq" alt="FTP(S) source channel settings with all fields filled in"><figcaption><p>FTPS connection settings</p></figcaption></figure>

### Protocol

Choose `ftp://`, `ftps://`, or `sftp://`. Changing the protocol automatically updates the default port.

<table><thead><tr><th width="105.07421875">Protocol</th><th width="549.70703125">Description</th><th>Default port</th></tr></thead><tbody><tr><td><strong>ftp://</strong></td><td>Standard, unencrypted FTP. Credentials and file data are transmitted in plain text.</td><td>21</td></tr><tr><td><strong>ftps://</strong></td><td>FTP over TLS (encrypted). Fulfilleo handles both explicit and implicit TLS automatically. If your server uses a self-signed certificate, enable the <strong>Accept self-signed certificate</strong> option.</td><td>990</td></tr><tr><td><strong>sftp://</strong></td><td>SFTP over SSH — a completely separate protocol from FTP/FTPS. Supports <strong>password</strong> and <strong>private key</strong> authentication.</td><td>22</td></tr></tbody></table>

### Host

Hostname or IP address of the server (e.g. `files.example.com`).

### Port

Port number. Defaults: `21` for FTP, `990` for FTPS, `22` for SFTP.

### Accept self-signed certificate

FTPS only. Enable this option if the server uses a self-signed TLS certificate.

### Username

Your FTP/SFTP login name.

### Password

Password for FTP, FTPS, and SFTP with password authentication.

### Private Key

SFTP with private key authentication only. Paste the full contents of your OpenSSH private key (beginning with `-----BEGIN OPENSSH PRIVATE KEY-----`). The server must have the corresponding public key in its `authorized_keys` file.

### File path

The **File path** field tells Fulfilleo where to look for tracking data. It supports three formats, each producing different processing behaviour.

#### Static path

A fixed path to a single file.

```
/outbound/tracking.csv
```

Fulfilleo checks whether the file has been **modified** since the last run. If the file has not changed, it is skipped and the run is recorded as `File already processed`. If it has changed, the file is downloaded and processed.

#### Wildcard path

A path with `*` or `?` wildcards in the filename.

```
/outbound/tracking_*.csv
```

Fulfilleo lists the directory and matches all filenames against the pattern (case-insensitive). For each matching file it checks the modification time and only processes files that are newer than the previous run. Multiple files can be processed in a single run.

#### Per-order path (Liquid template)

A path that contains Liquid variables referencing the Shopify order.

```liquid
/outbound/{{ order.name }}.csv
/outbound/{{ order_number }}/tracking.csv
```

When the file path contains order variables, Fulfilleo switches to **per-order mode**: it fetches all unfulfilled Shopify orders and looks for a dedicated file for each one. This is useful when your supplier places each order's tracking data in a separate file named after the order.

The following variables are available in the file path template:

| Variable                               | Value                                               |
| -------------------------------------- | --------------------------------------------------- |
| `{{ order.id }}`                       | Shopify internal order ID (numeric)                 |
| `{{ order.name }}`                     | Order name as shown in Shopify admin (e.g. `#1234`) |
| `{{ order.number }}`                   | Order sequence number (numeric)                     |
| `{{ order.order_number }}`             | Same as `order.number`                              |
| `{{ order_id }}`                       | Same as `order.id`                                  |
| `{{ order_name }}`                     | Same as `order.name`                                |
| `{{ order_number }}`                   | Same as `order.order_number`                        |
| `{{ order.metafields.namespace.key }}` | Value of a specific order metafield                 |

{% hint style="info" %}
Liquid variables and wildcards can be combined. For example, `/outbound/{{ order.name }}*.csv` matches files whose names start with the order name.
{% endhint %}

**Per-order processing outcome per order:**

* File not found on the server → recorded as a **warning**.
* File found but contains no tracking data → recorded as a **warning**.
* File found and tracking data extracted → fulfillment update is scheduled.
* Any other error → recorded as an **error**.

## Firewall Whitelist

Fulfilleo connects to your FTP server from a fixed IP address. If your supplier's server is protected by a firewall, you or your supplier will need to whitelist the following IP:

```
165.227.252.217
```

Pass this address to whoever manages the FTP server so they can allow incoming connections from it.

## Connecting and Testing

After filling in all fields, click **Connect**. Fulfilleo will:

1. Establish a connection to the server.
2. Save the credentials.
3. If the file path points to a CSV or XLSX file, download it and detect the column names — these will be available to select in the **Data Mapping** section.

If the file is not found at the given path, the connection still succeeds but a warning is shown next to the **File path** field. You can proceed with saving and Fulfilleo will look for the file again at the next scheduled run.

Once connected, the **Edit** button appears and all fields become read-only. Clicking **Edit** unlocks the fields so you can update the connection details.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.fulfilleo.solvenium.com/settings/ftp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
