⚠️ Warning - Advanced Feature
Importing sales via FTP with a JSON file is an advanced feature intended for users with strong technical knowledge.
ℹ️ Data Formats
Quantities and amounts: enter these values as strings in the JSON to avoid rounding issues related to floating-point numbers (float).
Always use a dot as the decimal separator (e.g.,
1.23), not a comma.Values must be expressed in the currency used and not in cents (e.g.,
1.23and not123).
📋 Field Structure
Field | Required | Description |
id | Yes | Unique order identifier. |
date | Yes | Sale date in ISO8601 format |
covers | No | Number of covers. |
amount_including_tax | No | Total including tax amount for the sale. |
amount_excluding_tax | No | Total excluding tax amount for the sale. |
items | Yes | List of products sold. |
Fields for each product in items:
Field | Required | Description |
product_id | Yes | Unique product identifier in the POS. |
product_name | No | Product name as defined in the POS. |
quantity | Yes | Total quantity sold for this product. |
amount_including_tax | Yes | Total including tax amount for the product, excluding linked products. |
amount_excluding_tax | Yes | Total excluding tax amount for the product, excluding linked products. |
items | Yes | Linked products for this product (e.g., menu components, add-ons). |
Example of a complete JSON file
[
{
"id": "000001",
"date": "2025-01-01T00:00:00Z",
"amount_excluding_tax": "31.00",
"amount_including_tax": "37.20",
"covers": 2,
"items": [
{
"quantity": "2",
"amount_excluding_tax": "25.00",
"amount_including_tax": "30.00",
"product_id": "000001",
"product_name": "Bundle - $15 each without without linked products",
"items": [
{
"quantity": "2",
"amount_excluding_tax": "0.00",
"amount_including_tax": "0.00",
"product_id": "000002",
"product_name": "Burger",
"items": [
{
"quantity": "2",
"amount_excluding_tax": "1.00",
"amount_including_tax": "1.20",
"product_id": "000003",
"product_name": "Extra cheese - $0.60 each",
"items": []
}
]
},
{
"quantity": "2",
"amount_excluding_tax": "5.00",
"amount_including_tax": "6.00",
"product_id": "000004",
"product_name": "Sparkling water - $3 each",
"items": []
}
]
}
]
}
]
🧪 Validate your CSV file
Before uploading your file to the FTP server, you can verify that it follows the required format by using our validation tool:
👉 https://pos-import-report.yokitup.com
🔐 FTP / SFTP Connection
The connection credentials (server, username, password) are visible on the POS integration page.
⚠️ After 3 failed login attempts, your IP address will be automatically blocked for 24 hours.
⏱ File Processing Frequency
Files uploaded to the FTP are processed automatically every hour.
Each processing run will analyze the files present in the folder, based on their filename.
⚠️ Already Processed Files
Once a file has been processed, it cannot be processed again, even if:
the file is deleted and re-created with the same name;
the file contained an error (e.g. invalid format).
To force a new processing, you must change the file name (add a date, a version number, etc.).
🚫 No Deletion Possible
Once a file has been processed, the recorded sales and products cannot be deleted.
⚠️ So be very careful before uploading a file to the FTP.
✅ Duplicate Management
If a sale has already been processed (e.g. via another file), it will be automatically ignored during the next processing runs.
The identifier used for this check is the
order_remote_idfield, which must be unique for each sale.
🔔 Error Tracking
After uploading a file, you can check if it was processed correctly in the Events tab of your POS integration page. The file name is not displayed, so you’ll need to monitor the dates and error types shown.
📆 Recommendation for Night Sales
💡 Tip: if you have sales recorded between midnight and 6:00 AM and your export only contains the date (without time), we recommend assigning them to the previous day in your export.
This helps align the data with the operational reality of sites open late at night and ensures more consistent statistics.
👉 This behavior is often expected by operational teams, but it must be explicitly handled in the export script, as it is not the default behavior.