Payments

Stripe, visible
in Medusa

A Stripe dashboard in the Medusa admin: volume, fees and net by payment method, every payment next to its order, disputes with their evidence deadlines, refunds, the balance and payouts. Plus health checks of the whole setup with a fix for each problem. The official provider keeps taking payments – this plugin only reads.

See it in the demo admin
Stripe: 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

  • A dashboard for 7 or 30 days

    Volume, Stripe fees and net, the success rate, refunds and open disputes, then a table by method: cards, BLIK, Przelewy24, Apple Pay and Google Pay.

  • Payments next to orders

    Every payment with its method, status, decline reason, Radar risk, fee and net, linked to the Medusa order and to the Stripe Dashboard. A payment whose cart never became an order glows red.

  • Health checks with a fix

    The provider registered, the key, the account, the payment methods, the webhook with its last deliveries, the wallet domains, the capture mode – each checked, with a verdict and what to do.

  • Disputes with deadlines

    Open disputes with the evidence deadline, the days left and the urgency, linked to the order and to the Dashboard where you answer them.

  • The order widget

    The PaymentIntent behind the order's payment: status, method, amount, Stripe fee and net, exchange rate, Radar risk, refunds and disputes. After a capture or refund in Medusa the plugin reads Stripe again.

  • Read only by construction

    The Stripe client has one method: a GET on a short list of paths. No code path can capture, refund or pay out – those stay in Medusa's order actions.

How it guards
your data

  • A read-only key

    A restricted key (rk_live_…, Read or None per resource) is recommended. It only rides the Authorization header, is masked everywhere, and the admin sees just its kind and last four characters.

  • Gentle on Stripe's limits

    It reads only when someone opens the page or clicks Refresh, never in the background. Reads are cached, ten admins at once mean one request, and a whole read has a 25 second budget.

  • Money in integers

    Amounts stay in minor units as Stripe sends them; sums are integer sums per currency, never floats, and two currencies are never added together.

  • No key, no crash

    Without a key the page shows the setup; a wrong key shows up as a failed check. The plugin never breaks the boot.

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-stripe
  2. 2
    Add the plugin to medusa-config.ts.
                            plugins: [
      {
        resolve: "@koda-plus/medusa-plugin-stripe",
        options: {
          apiKey: process.env.STRIPE_READ_KEY, // rk_live_..., Read or None per resource
          // demo: process.env.STRIPE_DEMO === "true", // sample data, no requests to Stripe
          // providerId: "stripe",                // the id of the official provider entry
          // backendUrl: "https://api.example.pl", // when the admin runs on another address
          // storefrontDomains: ["example.pl", "www.example.pl"],
          // cacheSeconds: 300,
        },
      },
    ]
                          
  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
  • biolchecksoon
  • soon
  • 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