Shipping

InPost integration
for Medusa

Ship with InPost from Medusa: four shipping options (Paczkomat and courier, each with or without cash on delivery), the chosen locker checked at checkout, and the fulfillment turned into a ShipX shipment from a plan a person reads first. Labels go through the backend, statuses through a webhook, and the rest of the store learns through events.

See it in the demo admin
InPost: The integration page in the Medusa admin, demo mode with sample data.
The integration page in the Medusa admin, demo mode with sample data.

What exactly
this integration does

  • Four shipping options

    Paczkomat and courier, both with cash on delivery or without. A locker option needs a valid locker code from InPost's list, a courier option a Polish address, and COD a cart in PLN.

  • The locker picked at checkout

    The storefront shows InPost's Geowidget or its own locker search, and the code of the chosen point lands in the shipping method metadata and on the fulfillment.

  • A plan a person reads

    Before anything reaches ShipX, the admin shows the receiver, the locker or address, the size, the weight, the COD with its insurance and the exact API request. A button sends the plan.

  • A shipment exactly once

    One row per fulfillment, an atomic claim before the request, and an unclear answer never ends in a second parcel: the shipment is looked up in ShipX by its receiver and reference first.

  • Statuses and labels

    The webhook only says what changed, and the plugin reads the shipment from ShipX itself. The A6 or A4 PDF label goes through the backend, so the token never reaches the browser.

  • Events for the rest of the store

    Created, changed, delivered: every Medusa event carries a documented payload without personal data. E-mails can say "your parcel is in the locker", and an ERP can react without touching the plugin.

How it guards
your data

  • Two switches per writer

    The option is the hard switch, the toggle in Settings the day to day one, stored with who flipped it and when. Without both nothing reaches InPost, and fulfillments still record.

  • COD once per order

    The COD amount is what is still due, on the first live COD parcel of the order only. An order paid online never gets cash on delivery.

  • The token stays on the server

    The API key only rides the Authorization header to ShipX, masked in logs, errors and the admin. Receiver data is read from the order only when a plan is built.

  • Cancel only while ShipX allows it

    The status is read first, and only states InPost permits can be canceled. Shipments the plugin did not create are only tracked, never canceled or paid.

Setup
in three steps

The full list of options, events and API routes is in the package README on GitHub.

Paste it into Claude Code, Cursor or another AI assistant in your Medusa project: it installs and configures the integration, with writes off.

  1. 1
    Install the package from npm.
    npm install @koda-plus/medusa-plugin-inpost
  2. 2
    Add the plugin to medusa-config.ts.
                            const inpost = {
      apiToken: process.env.INPOST_API_TOKEN,
      organizationId: process.env.INPOST_ORGANIZATION_ID,
      webhookSecret: process.env.INPOST_WEBHOOK_SECRET,
      // sandbox: true,
      // Writes: off unless allowed here AND armed in the admin (allowed by default in demo mode, simulated).
      // shipmentWriter: true,           // create, pay a prepaid offer, order a pickup, cancel
      // fulfillmentStatusWriter: true,  // mark Medusa fulfillments shipped and delivered
      // demo: true, // sample shipments from your orders, nothing sent to InPost
    }
    
    plugins: [{ resolve: "@koda-plus/medusa-plugin-inpost", options: inpost }],
    modules: [
      {
        resolve: "@medusajs/medusa/fulfillment",
        options: {
          providers: [
            { resolve: "@medusajs/medusa/fulfillment-manual", id: "manual" },
            { resolve: "@koda-plus/medusa-plugin-inpost/providers/inpost", id: "inpost", options: inpost },
          ],
        },
      },
    ]
                          
  3. 3
    Run the migrations and open the integration in the Medusa admin.
    npx medusa db:migrate

Running for our clients

See our portfolio
  • soon
  • soon
  • soon
Free 15-minute call

Tell us about your project,
we'll tailor the rest to you

A 15-minute call is enough for us to know whether we are a fit for your project.
We start from what you need, not from an off-the-shelf solution.

See our demo

Contact us

Remigiusz in a navy shirt and glasses
I use iMessage I use WhatsApp
Adrian in a grey turtleneck and glasses
I use iMessage I use WhatsApp