Skip to main content

POS Sales Import via FTP (JSON)

Updated over 2 weeks ago

⚠️ 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.23 and not 123).


📋 Field Structure

Field

Required

Description

id

Yes

Unique order identifier.

date

Yes

Sale date in ISO8601 format YYYY-MM-DD or YYYY-MM-DDThh:mm:ssZ if including time.

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_id field, 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.

Did this answer your question?