Skip to content

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


    re-tek.co.uk

  • 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

config/refurbishers.json
"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 E-mail 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 shipment block to Re-Tek's entry in the IRP's config.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: 1 on the Refurbisher record once the full flow (offers → orders → shipments) has been verified end-to-end.

How it works

  1. Re-Tek writes one shipment as a JSON file into RefurbishedDirect/ShipmentUpdateFeed/ on the same FTPS server used for offers/orders.
  2. Every 15 minutes, GetCitgRetekShipmentJob (routes/console.php) connects over FTPS, lists all files in that directory, and for each file:
    1. Reads the file contents.
    2. 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.
    3. Parses the JSON (single object, or an array of objects) and dispatches ProcessCitgRetekShipmentJob per shipment.
  3. ProcessCitgRetekShipmentJob applies the same matching and RefurbisherOrderDelivery-creation logic as the generic Shipment Webhook contract (ProcessGenericShipmentJob) — order lookup on external_order_reference, IMEIs grouped by SKU, RefurbisherOrderDelivery::create(...). From there on, processing is identical to every other Refurbisher: the same Eloquent event and PushRefurbisherOrderDeliveryListener push 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).