CITg Re-Tek¶
CITg Re-Tek is the Re-Tek brand of the Circular IT Group, offering refurbished IT and consumer electronics. The offer feed, order submission, and shipment updates are all exchanged with iUsed via FTPS as JSON files. Re-Tek provides a drop-ship service, meaning orders are shipped directly from their warehouse to the end customer.
Refurbisher currently inactive
This Refurbisher record is currently marked inactive (active: 0) in the IRP. Onboarding is still in progress — see the Shipment Updates (FTPS) section below.
-
Website
-
Drop-ship
Direct shipment from Refurbisher to end customer
-
Feed Type
FTPS — JSON file transfer (offers, orders & shipments)
-
Currency
EUR
Status¶
| Artifact | Acceptatie | Productie |
|---|---|---|
| Refurbisher | ID: 27 · → IRP |
ID: 27 · → IRP |
| Supplier | ID: 21 · → IRP |
ID: 21 · → IRP |
| Offer connector | FTPS · JSON · FTPS credentials · → | FTPS · JSON · FTPS credentials · → |
| Order connector | FTPS · JSON · FTPS credentials · → | FTPS · JSON · FTPS credentials · → |
| Shipment updates | In progress · FTPS · JSON · ClickUp IUS-3429 · → | Not configured |
IRP¶
| Field | Value |
|---|---|
| Refurbisher ID | 27 |
| Supplier ID | 21 |
| Odoo Vendor ID | Not set |
| Currency | EUR |
| Shipping Costs | Free (€0.00) |
| Home Copy Tax | €0.00 |
| Default Margin | 27% |
| Stock Threshold | 2 |
| Approved Refurbished | No |
| Drop-ship | Yes |
| Active | No — onboarding in progress |
Monitoring Thresholds¶
| Metric | Threshold |
|---|---|
| Latest order (hours) | 48 |
| Offers stock (hours) | 48 |
| Open order (days) | 4 |
| Offers endpoint HTTP status | 200 |
Refurbisher Connector Config¶
"citg-retek-ftps": {
"name": "Re-Tek via FTPS",
"refurbisher_id": 27,
"offers": {
"connection": "ftps",
"auth": {
"host": "vault.circularitgroup.com",
"path": "RefurbishedDirect/OfferFeed-production/OfferFeed-prod.json",
"username": "ims-flooris",
"password": "XXXXXXXXXXX"
},
"type": "json",
"paginate": false,
"pagination_parameter": "pageNumber",
"offer_location": "",
"price_locale": "nl_NL",
"mapping": {
"name": "name",
"sku": "sku",
"stock_available": "stock_available",
"ean": "ean",
"price_purchase_amount": "price_purchase",
"price_consumer_amount": "price_consumer"
}
},
"order": {
"connection": "ftps",
"format": "json",
"delimiter": ";",
"enclosure": "",
"auth": {
"host": "vault.circularitgroup.com",
"path": "RefurbishedDirect/OrderFeed/",
"username": "ims-flooris",
"password": "XXXXXXXXXXXX"
},
"order_object": {
"customerInformation.firstname": "orderShippingAddress.first_name",
"customerInformation.lastname": "orderShippingAddress.last_name",
"customerInformation.email": "!info@iused.nl",
"customerInformation.country": "orderShippingAddress.country->getIsoAlpha3",
"customerInformation.phoneNumber": "!+31302484006",
"paymentInformation.currency": "!EUR",
"paymentInformation.priceExclVat": "order.total_price->formatByDecimal",
"billingAddress.company": "orderShippingAddress.company",
"billingAddress.firstname": "orderShippingAddress.first_name",
"billingAddress.lastname": "orderShippingAddress.last_name",
"billingAddress.email": "!info@iused.nl",
"billingAddress.street1": "orderShippingAddress.full_address",
"billingAddress.postcode": "orderShippingAddress.zipcode",
"billingAddress.city": "orderShippingAddress.city",
"billingAddress.country": "orderShippingAddress.country->getIsoAlpha3",
"billingAddress.phoneNumber": "!+31302484006",
"shippingAddress.company": "orderShippingAddress.company",
"shippingAddress.firstname": "orderShippingAddress.first_name",
"shippingAddress.lastname": "orderShippingAddress.last_name",
"shippingAddress.email": "!info@iused.nl",
"shippingAddress.street1": "orderShippingAddress.full_address",
"shippingAddress.postcode": "orderShippingAddress.zipcode",
"shippingAddress.city": "orderShippingAddress.city",
"shippingAddress.country": "orderShippingAddress.country->getIsoAlpha3",
"shippingAddress.phoneNumber": "!+31302484006",
"uniqueOrderNumber": "id",
"sourceOrderNumber": "order.order_number",
"customerOrderDate": "created_at->toDateString",
"items": "%ITEMS%"
},
"item_object": {
"orderLines.productFamily": "!reference",
"orderLines.productCode": "productVariant.refurbisherOffer.sku",
"orderLines.quantity": "quantity",
"orderLines.priceExclVat": "productVariant.refurbisherOffer.price_purchase_amount->formatByDecimal"
}
},
"shipment": {
"connection": "ftps",
"auth": {
"host": "vault.circularitgroup.com",
"upload_path": "RefurbishedDirect/ShipmentUpdateFeed",
"processed_path": "RefurbishedDirect/ShipmentUpdateProcessed",
"username": "ims-flooris",
"password": "XXXXXXXXXXX"
}
}
}
Config nog niet aangevuld in productie
De shipment-sectie hierboven moet nog toegevoegd worden aan de daadwerkelijke config.json (via de Refurbisher Offer Configuration UI) voordat GetCitgRetekShipmentJob iets kan ophalen.
Het host-veld hierboven is overgenomen van de bestaande offer/order-config (vault.circularitgroup.com) — controleer bij Re-Tek of de shipment-feed op dezelfde FTPS-server staat, want de eerdere aanname in ClickUp IUS-3429 (storage-swoop-renewd.refurbishedcompany.com) lijkt per ongeluk overgenomen van de Renewd-integratie.
Let op dat deze configuratie al WEL is toegepast op de accept omgeving!
Contactpersonen¶
| Naam | Rol | |
|---|---|---|
| Harsha Dushantha | harsha.dushantha@re-tek.co.uk | Technical Contact |
API Integration¶
CITg Re-Tek uses FTPS for both offer retrieval and order submission — both directions exchange JSON files rather than a request/response REST API.
Credentials
Stored in 1Password under iUsed - IRP - Refurbisher: CITg Re-Tek.
Both the offer feed and order feed use the same FTPS username/password credentials, on the same host, but with different paths.
| Field | Value |
|---|---|
| Host | vault.circularitgroup.com |
| Username | ims-flooris |
| Password | Stored in 1Password |
| Method | Path | Description |
|---|---|---|
FTPS GET |
vault.circularitgroup.com/RefurbishedDirect/OfferFeed-production/OfferFeed-prod.json |
Retrieve offer feed (JSON) |
FTPS PUT |
vault.circularitgroup.com/RefurbishedDirect/OrderFeed/ |
Drop a new order JSON file in this directory |
FTPS PUT |
vault.circularitgroup.com/RefurbishedDirect/ShipmentUpdateFeed/ |
Re-Tek drops shipment JSON files in this directory |
FTPS |
vault.circularitgroup.com/RefurbishedDirect/ShipmentUpdateProcessed/ |
IRP moves shipment files here once picked up (see below) |
The offer feed is a JSON file retrieved from an FTPS server. No pagination is applied.
| Field | JSON Key |
|---|---|
| Name | name |
| SKU | sku |
| Stock | stock_available |
| EAN | ean |
| Purchase Price | price_purchase |
| Consumer Price | price_consumer |
Format details
- Connection:
ftps - Type:
json - Paginated: No
- Price locale:
nl_NL
An order is submitted by writing a JSON file into the RefurbishedDirect/OrderFeed/ directory on the FTPS server. Each order includes customer information, billing/shipping addresses, and order lines (orderLines).
| Field | Source |
|---|---|
uniqueOrderNumber |
Internal order ID |
sourceOrderNumber |
Order number |
customerOrderDate |
Order creation date |
orderLines[].productCode |
Refurbisher offer SKU |
orderLines[].quantity |
Quantity |
orderLines[].priceExclVat |
Purchase price (excl. VAT) |
No explicit order confirmation
CITg Re-Tek does not return an acknowledgement or order ID after a file is dropped. There is no response/assert mapping — writing the file to the directory is considered the completed submission.
Once an order is shipped, Re-Tek drops a JSON file in the RefurbishedDirect/ShipmentUpdateFeed/ directory on the FTPS server. The IRP polls this directory on a schedule; see Shipment Updates (FTPS) below for the full mechanism.
| Field | JSON Key |
|---|---|
| Order reference | external_order_reference |
| Vendor order ID (Re-Tek's own reference) | vendor_order_id |
| Carrier | carrier |
| Track & trace codes | track_and_trace[] |
| Shipped devices | imeis[].imei, imeis[].sku |
| Supplier ID (informational) | supplierId |
Format details
- Connection:
ftps - Type:
json(one shipment object, or a JSON array of shipment objects, per file) - A file is moved to
RefurbishedDirect/ShipmentUpdateProcessed/as soon as it is read — this marks it as handled, independent of whether order-matching succeeds
Shipment Updates (FTPS)¶
Not the standard Shipment Webhook
CITg Re-Tek does not call the IRP's Shipment Webhook endpoint. Instead, since offers and orders already run over FTPS for this Refurbisher, shipment updates were added to the same channel: Re-Tek drops a JSON file, and the IRP pulls it on a schedule. This decision is tracked in ClickUp task IUS-3429.
Status: code implemented, config + credentials pending
The IRP-side jobs (GetCitgRetekShipmentJob, ProcessCitgRetekShipmentJob) exist and are scheduled every 15 minutes. What's still open:
- Add the
shipmentblock to Re-Tek's entry in the IRP'sconfig.json(see Refurbisher Connector Config above) — confirm the correct FTPS host with Re-Tek first (see warning above). - Confirm the JSON field mapping below with Harsha Dushantha — it was derived from a single example message, not a formal spec.
- Flip
active: 1on the Refurbisher record once the full flow (offers → orders → shipments) has been verified end-to-end.
How it works¶
- Re-Tek writes one shipment as a JSON file into
RefurbishedDirect/ShipmentUpdateFeed/on the same FTPS server used for offers/orders. - Every 15 minutes,
GetCitgRetekShipmentJob(routes/console.php) connects over FTPS, lists all files in that directory, and for each file:- Reads the file contents.
- Immediately moves the file to
RefurbishedDirect/ShipmentUpdateProcessed/— the file is considered "picked up" at this point, regardless of whether the JSON parses or an order match is found afterwards. - Parses the JSON (single object, or an array of objects) and dispatches
ProcessCitgRetekShipmentJobper shipment.
ProcessCitgRetekShipmentJobapplies the same matching andRefurbisherOrderDelivery-creation logic as the generic Shipment Webhook contract (ProcessGenericShipmentJob) — order lookup onexternal_order_reference, IMEIs grouped by SKU,RefurbisherOrderDelivery::create(...). From there on, processing is identical to every other Refurbisher: the same Eloquent event andPushRefurbisherOrderDeliveryListenerpush the update to Alumio/Odoo and Shopware/ChannelEngine.
See docs/shipment-webhook-api.md in the IRP repository for the full technical breakdown of that shared downstream flow.
Shipment JSON format¶
{
"external_order_reference": "42126",
"vendor_order_id": "98029",
"carrier": "UPS",
"track_and_trace": [
"1Z16F751DK22372550"
],
"imeis": [
{
"imei": "GVFP3F2LLK",
"sku": "5487567683726"
}
],
"supplierId": 21
}
| Field | Type | Description |
|---|---|---|
external_order_reference |
string |
Must match the orderReference/uniqueOrderNumber the IRP used when it submitted the order to Re-Tek. Used to look up the RefurbisherOrder. |
vendor_order_id |
string |
Re-Tek's own internal order ID. Not currently used for matching — informational only. |
carrier |
string |
Free text; mapped via App\Flooris\Carrier. Defaults to PostNL if omitted (see Refurbisher Onboarding — Shipment Webhook for allowed values). |
track_and_trace |
string[] |
One or more track & trace codes. |
imeis[].imei |
string |
IMEI/serial number of the shipped device. |
imeis[].sku |
string |
Must match the sku on the corresponding RefurbisherOffer. |
supplierId |
int |
CITg Re-Tek's Supplier ID (21). Not used for matching in this flow (it's a webhook-only field); included here for parity with the generic contract. |
No validation, no acknowledgement
Same caveats as the Shipment Webhook: there is no schema validation on the JSON, and a file that doesn't match an existing order is silently skipped (logged on the webhook_shipments channel, no error surfaced to Re-Tek — there's no response channel to surface one on anyway, since this is a file drop, not a request/response call).
FTPS credentials¶
1Password
Uses the same FTPS credentials as the offer/order feeds — stored in 1Password under iUsed - IRP - Refurbisher: CITg Re-Tek. No separate secure token is generated for this integration (unlike the standard Shipment Webhook, this is not exposed as a public endpoint).