Over 10 years in the industry

Wholesale e-⁠commerceand web applicationstailored toyour needs

We build websites and apps that work for your business, with no compromises and no limits. The system adapts to you!

10
years of experience in design and development
5
countries we collaborate in, from Poland to Spain
100%
ownership of code and data, no vendor lock-in
0%
commission on transactions with open source

We work across Poland, with connections to Germany, Czechia, the Netherlands, Latvia and Spain.

Partners

Who we work with and what came of it

We pick partnerships around the tools we roll out every day. That way the client gets everything from one team: the tool, the rollout and the link to the store.

We are an authorised InsERT partner. We roll out InsERT software, including Subiekt nexo, and connect it to the online store, so orders, stock and documents move between the systems without retyping.

What we built

  • Subiekt nexo integration for Medusa in two parts: an open store plugin, featured in the Medusa directory, and our own bridge, a service that runs next to Subiekt on Sfera, the official InsERT SDK. Store orders are created in Subiekt as documents, and stock, invoices and KSeF numbers flow back to the store.
  • Crème Bar: wholesale and retail orders reach Subiekt nexo through a .NET service built on the Subiekt SDK.

Medusa is an open-source commerce engine we build online stores and B2B wholesale platforms on. The Medusa team featured five of our plugins in its integrations directory: InPost, OLX, Fakturownia, Subiekt nexo and VAT Whitelist.

What we built

  • Medusa is the foundation of our work: our online stores, B2B wholesale platforms and stores that combine wholesale with retail run on it.
  • We also use it for e-learning platforms, not just classic commerce.
  • Open Medusa plugins that connect the store to Polish business tools.

We are listed in the Storesynk (formerly Shopyflow) experts directory, as the only company from Poland. Storesynk let us combine the friendly Webflow editor, where the client lays out pages by drag and drop, with Shopify's solid commerce engine.

What we built

  • Astriva, a ballistic protection maker, runs its own sales: the catalogue, cart, checkout and customer accounts work on Shopify.
  • The client updates product documentation and site content in the Webflow editor, without a developer.
  • The whole site works in four languages.
  • We took part in discussions with the Storesynk team about new features and fixes to the tool.

We help businesses
grow online

Our edge

We work at a pace
you cannot hire

AI agents give us a pace no new hire could. But we do not work alone: we partner with design and development agencies, and for selected projects we bring in people who know the industry or the technology. We check the code and everything that reaches the client against the instructions in our knowledge base.

Our latest project,
for a maker that builds fitness clubs

B2B website

tiguar: A fitness club equipment manufacturer

Our best-known client, a manufacturer that has been equipping fitness clubs across Europe for 25 years. A catalogue of ~400 products, case studies and paths for clubs, studios and distributors, plus EU4YA, the largest fitness event in Central Europe.

  • Next.js
  • React
  • Payload CMS
  • Railway
  • Tailwind CSS
  • Gemini API

This is just our latest launch.

See selected projects

We build solutions
for every industry

Every industry has its own rules, from size charts in fashion to pallets in the garden. We are not learning on your project: we have shipped these patterns before.

  • Kids and toys age categories, bundles and certificates
  • Food service wholesale for venues and recurring orders
  • Fashion and clothing size charts, variants and lookbooks
  • Automotive part fitment by year and model
  • Health and beauty beauty wholesalers and salon zones
  • Electronics specs, warranties and comparison tools
  • Food and drink expiry dates and cold-chain logistics
  • Home and garden pallet shipping and oversized products

What can we build for you?

References we
actually earned

Our list of reviews grows with every project we hand over. Clients post them on Clutch, an independent platform that rates IT companies.

5.0 See all reviews Koda Plus's average rating on Clutch over the last 12 months is 5.0

The vault: a knowledge base
that connects everything

Every deployment leaves a trace: standards, playbooks, decisions and battle-tested modules land in our vault. It covers Medusa and headless commerce, integrations with Subiekt, Allegro, Base and KSeF, B2B pricing, SEO and AEO, and our work with AI agents, who get that knowledge on day one, so no project ever starts from zero.

Every node in the vault 62

E-commerce platforms

  • Headless commerce

    In headless stores the Medusa backend exposes an API and the store is a separate app, usually in Next.js. One backend can serve wholesale and retail across markets with their own currencies, as at Crème Bar, and a Next.js front end runs at Oponykola, among others. For a simple single-channel store we say plainly it is overkill.

  • Medusa.js

    Medusa is our main platform for stores and wholesale shops: customer groups with price lists, separate sales channels and our own modules without touching the core. We write plugins for it: the Medusa team featured five in its directory, and you can click through most in our demo. Oponykola and Crème Bar run on it, among others.

  • Payload CMS

    We choose Payload when editors need a comfortable panel and content should stay in the system's own database. That is the case in the Wekert app, where the blog and the Next.js panel read content from PostgreSQL.

  • Shopify

    We build Shopify themes for the brand instead of buying ready ones, with custom blocks such as specs from metafields or “Buy now” straight to checkout. Shopify can also be the sales back end behind a Webflow front, as at Astriva. When a store outgrows the platform we move it on, like Oponykola to Medusa.

  • Storesynk

    Storesynk brings Shopify products into the Webflow CMS and adds variants, cart, discount codes and customer accounts without embedded widgets. Koda Plus is listed in Storesynk Experts as the only company from Poland. We deployed it at Astriva, in four languages.

  • Webflow

    We build Webflow sites on a structured class system, with CMS collections editors update without a developer and language versions through Localization. A unit's colour on a floor map can come straight from its CMS status. WJ Investment, JW, Astriva and Solski Communications were built this way, among others. We hold the Webflow CMS and Layouts certificates.

  • WooCommerce

    We do not build new stores on WooCommerce, we move them to Medusa or Shopify: an inventory of URLs, data and forgotten integrations, a 301 for every URL, products, customers and order history, and indexing checks after the switch.

B2B sales

  • B2B price lists

    Price lists in our Medusa wholesale shops are built on native price lists tied to customer groups, with quantity tiers and negotiated prices. The KODA SUPPLY demo runs B2B Standard and Premium plus a framework agreement, and price negotiation is a separate plugin of ours.

  • Net and gross prices

    In our Medusa wholesale shops a logged-in business sees net prices from its price list, and a retail buyer sees gross prices. The KODA SUPPLY demo works that way: net catalogue, 23% VAT added in the cart, and one rounding method from cart to invoice.

  • XML feeds

    We map wholesaler feeds onto store categories, match products by EAN or SKU and price them with margin rules. Before the nightly import we compare file size and item count with the previous run, so a truncated file cannot wipe half the catalogue.

  • Trade credit limits

    The balance and open invoices stay in the ERP, and the Medusa store pulls them in and enforces the limit: over it, the cart blocks, goes to the account manager for approval or offers prepayment. Trade credit is also one of our Medusa plugins.

  • Store migrations

    A migration starts with an inventory of data, integrations and URLs with traffic. Every URL gets a 301, we build the new store alongside the old one, and data goes through a trial run checked by the numbers. That is how we moved Oponykola from Shopify to Medusa and the Solski Communications blog from WordPress to Webflow.

  • Abandoned carts

    Abandoned cart reminders show customers their own items and go out at most once per cart, only for carts idle 24 to 72 hours. That is how our e-mails plugin works in the Medusa demo, and in UX audits we look for where buyers drop off.

  • Quick order

    In wholesale shops we add quick ordering above the cart: a list of SKUs pasted from a sheet, a file, a repeat of the last order or a saved cart for regular deliveries. Items are priced by the customer's own list, as you can see in the KODA SUPPLY demo.

  • Company registration by VAT ID

    Sign-up by tax ID is standard in our wholesale shops: address data fills itself, the status is checked on the VAT whitelist and EU companies in VIES. The account waits for approval. It works in the KODA SUPPLY demo, and VAT Whitelist is one of our plugins featured by Medusa.

Integrations

  • Allegro API

    We connect Allegro to stores through the API or via BaseLinker, depending on whether a ready connector can handle the price and stock rules. Product attributes are suggested from Allegro categories, and offers are read back on a schedule. We also have our own Allegro plugin for Medusa. Oponykola sells this way, among others.

  • BaseLinker

    BaseLinker runs the warehouse and marketplace sales, and the store syncs with it instead of counting stock separately. Our Medusa module queues operations, respects the API limits and logs every exchange. Oponykola works this way, and at Abrams BaseLinker ties the catalogue to the central warehouse.

  • Comarch Optima

    We connect Optima to stores and wholesale shops so customer price levels, discounts and limits work one to one in the store, and document numbers come back to the customer account. The data map follows Optima's limits on custom price lists and records.

  • dane.gov.pl

    Flat prices reach the dane.gov.pl register every day with no manual uploads: the dataset points to a fixed address on the developer's domain, and the portal pulls the daily CSV files itself. The price transparency law requires it. The WJ Investment and Firma Inwestycyjna JW sites work this way.

  • Fakturownia

    Fakturownia is the accounting layer of a store for us: order data reaches it with the buyer's tax ID, and the document is created on a status change, with no retyping. Our Fakturownia plugin for Medusa, featured by Medusa, issues one invoice per order and shows the KSeF status. Crème Bar uses it, among others.

  • InPost ShipX

    We build InPost on the ShipX API without all-in-one plugins: Geowidget in checkout, shipment, PDF or ZPL label and tracking. That is how our InPost plugin for Medusa works, featured by Medusa, and in the demo store you pick a locker at checkout.

  • KSeF

    The KSeF number comes back to the order: in our Subiekt nexo integration the bridge sends it to the store with the invoice, and the Fakturownia plugin shows the KSeF status in the Medusa admin. We plan for corrections, offline mode and separate B2B and B2C paths.

  • OLX

    We connect OLX in the same BaseLinker catalogue as Allegro, so the listing, the offer and the store share one stock level, with no separate sync per site. It matters for single-item stock, like the tyres and rims at Oponykola. We also have an OLX plugin for Medusa, featured by Medusa.

  • Przelewy24

    We plug Przelewy24 into Medusa as a payment provider with BLIK and bank transfers: the backend places the order on the gateway notification, and the return page waits for confirmation and checks the status itself if needed. Polish Crème Bar customers pay this way, next to Stripe.

  • Resend

    Resend sends the koda.plus contact form messages: a notification to the team and a confirmation to the sender, via the REST API from a Cloudflare function. Our Medusa e-mails plugin runs on it too, showing order, shipping and abandoned cart templates in the demo.

  • Sellasist

    We keep Sellasist as the place where the team handles orders and shipping. The AI agent takes no action there: cases that need it, such as returns or complaints, go to people. That is how it works at Abrams.

  • Stripe

    We connect Stripe through the Medusa payment module with Payment Element, and a webhook completes the order if the customer never returns from the bank. Our Stripe plugin shows fees, disputes and payouts in the Medusa admin, read only. At Crème Bar Stripe takes payments on every market, euro included.

  • Subiekt GT / nexo

    We connect Subiekt nexo to Medusa with our bridge built on Sfera: orders land in Subiekt as sales orders, and dispatch notes, invoices and KSeF numbers come back to the store. The plugin, featured by Medusa, shows its document queue in the demo. The Crème Bar store works with Subiekt nexo, among others.

Front-end

  • Astro

    koda.plus runs on Astro, hosted on Cloudflare: static HTML, local fonts, CSS and GSAP animation, and JavaScript only in the components that need it. We build client brand sites the same way when SEO and Core Web Vitals matter.

  • Figma

    We design in Figma ready for a 1:1 build: components, screen states and tokens that share names in Figma and code, and clients get the files unlocked. koda.plus was built that way, and for SpaceForm we settled the section layout in Figma before the build, since both investors and engineers read the site.

  • GSAP

    GSAP reveals koda.plus sections on scroll and choreographs the hero. At WJ Investment it splits headings into words and turns them in one by one, and at Solski Communications a line by each section heading grows from a single site-wide interaction.

  • Lenis

    We use Lenis on sites with a rich visual layer, where smooth scrolling supports the content, and only when it does not get in the way of reading. It runs on the Webflow site of the ballistic protection maker Astriva, among others, with its catalogue of plates and vests and its lab sections.

  • Next.js

    We choose Next.js when a site becomes an app: accounts, a data panel, integrations. Rendering is set per route, because making everything dynamic is the most expensive option. The Oponykola front end with its own catalogue index and the Wekert panel work this way, among others, while the AMARACH TIM site is fully pre-generated.

  • React

    We use React where the interface has state and logic: a cart with live stock, several payment paths, editors and planners in panels. On Astro sites like koda.plus we use it only where needed. It runs in the Crème Bar store, the Wekert panel and Koda Flow, our own product, among others.

  • Tailwind CSS

    We use Tailwind on React and Next.js projects with many repeated components: brand colours and fonts are defined once in the theme, so every card keeps the same look. The AMARACH TIM site was built this way. koda.plus, on the other hand, has its own styles with no CSS framework.

  • Tauri

    Koda Flow, our own product, runs on Tauri and React: a transparent Windows overlay, always on top and click-through, that reduces motion sickness when working on the move. A WebSocket server in the Rust layer receives motion from the phone.

  • three.js

    three.js powers the 3D plus on koda.plus, in the home hero, on service pages and on the About page. It loads lazily after the page, and with reduced motion turned on the scene does not load at all.

Infrastructure

  • Algolia

    We add Algolia to headless stores when built-in search is no longer enough: one index per language, typo tolerance and index updates right after a product changes in Medusa. Queries go through the backend, which picks the index by page language. That is how the three-language Crème Bar catalogue works.

  • Cloudflare

    koda.plus runs on Cloudflare: Astro with the Cloudflare adapter and a contact form as a server function behind Turnstile. Our Medusa demo store is served from there too, and Astriva's Webflow site is published through Cloudflare as cached HTML.

  • Medusa Cloud

    New Medusa stores and wholesale shops go on Medusa Cloud: usually the Launch plan, Scale with a separate worker for heavy ERP integrations. Clients approve changes on preview environments, and we move older Railway stores over without rewriting the app.

  • PostgreSQL

    PostgreSQL is the database behind every Medusa store we ship, and at Oponykola, Wekert and Abrams it runs on Railway next to the app. Data stays in a standard database, so changing hosting never means changing platform.

  • Railway

    We pick Railway when a project needs a process running nonstop, not just a static front end: a backend with a database, scheduled jobs, webhooks at any hour, PDFs in headless Chromium. It hosts the Oponykola backend and front end, the Abrams AI agent hub and the Wekert app, among others.

  • Supabase

    We pair Supabase with Webflow when a site needs its own database next to the CMS. It holds what the CMS cannot, such as the price history of every unit with change dates, linked to its CMS entry, and the daily dane.gov.pl dataset is built from it. The WJ Investment and Firma Inwestycyjna JW sites work this way.

  • Vercel

    Next to Cloudflare, Vercel is one of the two places we host Next.js front ends: the prerendered page is served from edge cache with no server to maintain. The client owns the code and access, so it can stay or move. The AMARACH TIM site runs this way.

SEO and AEO

  • AEO

    We start with robots.txt, separating model-training crawlers from search agents such as OAI-SearchBot and PerplexityBot. The answer goes right under a heading phrased as a question, and we regularly check the brand in AI answers against real customer questions and server logs.

  • Google Ads

    We do not run campaigns, we build their technical side. In the Wekert panel, read-only Google Ads API results sit next to site enquiries, and rules turn the metrics into short advice, for example on a campaign spending budget without conversions.

  • Google Search Console

    We set up Search Console with GA4 and Tag Manager on every launch. Its reports start every SEO audit, and after a store migration we watch indexing, 404s and redirects there for the first weeks.

  • IndexNow

    After every koda.plus deploy our script collects URLs from the sitemap and submits them to IndexNow. It fetches the sitemap past the Cloudflare cache, which can return the old one right after a deploy, and we pass retired 301 URLs to it directly.

  • llms.txt

    koda.plus has its own llms.txt: services linked to the offer, technologies, common questions, company details and a short English summary. We treat it as an extra, not a substitute for work on content and structured data.

  • Schema.org

    koda.plus publishes an Organization and WebSite graph plus BlogPosting on posts, and our audit script flags pages without JSON-LD. In stores we keep Product markup in line with feed price and stock, and on migrations we compare old and new structured data.

  • Technical SEO

    We check our own site with a script that walks every sitemap URL and verifies titles, descriptions, canonical, hreflang and JSON-LD. For clients we start from server logs and Search Console, and in stores we cut filter URLs that waste crawl budget.

  • Content strategy

    We run the koda.plus blog on topic clusters: phrases come from Google suggestions collected by our own script, and posts are based on what we did in real projects. AI helps with research and drafts, but the examples and editing are ours.

AI and process

  • AI agents

    An AI agent drafts answers from the catalogue, price lists and order history and hands harder cases to people. In-house we run several agents in parallel: each starts from the vault, and we check everything they deliver in code review. At Abrams (electronics, home and garden) one agent covers the store and Allegro.

  • Application security

    Security-focused AI agents review code and infrastructure at every stage, and our team approves the changes. The koda.plus form is protected by a honeypot and Turnstile, and the Abrams AI agent gets only the data a case needs and never acts on orders.

  • AI chatbot

    The AI chat answers from store policies and order data, and when a case needs action it hands it to the team with the channel it came from. Delivery and returns rules are written once for every channel. We deployed it at Abrams, where it talks to customers in the store and on Allegro.

  • Claude API

    On the Claude API we build agents in a tool loop: the model decides whether to search the knowledge base, check an order or hand the case to a person, and answers from company data, not memory. We also use Claude for our own code. For client projects we pick the model by their requirements.

  • Code review

    Several AI agents work with us in parallel, and we check everything they deliver against the vault instructions. Without our team's approval in code review nothing reaches production. We can also join a client's review process or audit existing code.

  • MCP (Model Context Protocol)

    Through MCP we give AI agents access to the tools and data a specific task needs, for example when analysing a company's business logic. On Medusa stores we can expose chosen data and operations through an MCP server, so the assistant stays within set permissions.

  • Obsidian

    The KODA Vault you are looking at is our Obsidian knowledge base: standards, playbooks and decisions from projects that AI agents get at the start of each job. For Wekert we built Obsidian-style notes where a checkbox becomes a task in the planner.

  • AI agent orchestration

    We split a project into slices such as price lists, ERP integration, tests and SEO, and each gets its own AI agent working in parallel. All start from the same vault, while assembly, architecture and code review approval stay with our team.

  • Deployment playbook

    Every project adds standards, decisions and proven modules to the vault, and AI agents get them at the start of the next one. That way lessons from one store, such as BaseLinker API limits or Subiekt integration, carry straight into the next.

  • End-to-end testing

    We test changes to live stores on an environment that mirrors production. Tests are a separate slice for an AI agent, and we review the result ourselves. Bigger features go first to selected customers, and there is always a rollback path.

Open the knowledge base

Frequently asked
questions

  • What does Koda Plus do?

    Koda Plus is a team that builds complete online sales systems: B2B wholesale and e-commerce stores (on Medusa.js, Shopify and Webflow, among others), websites and web applications, graphic design, process automation and SEO and AEO optimisation. All of it in one pair of hands, from the first design through to scaling up.

  • Where are you based and do you work remotely?

    Our office is in Wrocław, and part of the team works from the Tricity area. We deliver projects fully remotely for clients across Poland: communication, meetings and file handover all happen online.

  • How much does an online store or a website cost?

    The quote depends on scope: a landing page is one thing, a large B2B store with integrations is another. We don't impose technologies or packages: after a short, free call we prepare a quote matched to your goal and budget.

  • Do I get the full code and all the access once the project is finished?

    Yes. We hand over the entire source code and every access, because they belong to you. We don't lock clients in; you can keep developing the project with us or with any other team.

  • How long does a project take?

    A typical project takes 4 to 8 weeks, depending on complexity. Simpler websites are ready sooner, while larger stores with ERP, payment and logistics integrations take longer. We agree the timeline at the start and communicate progress at every stage.

  • What does the process look like from first contact to project kickoff?

    We start with a free online call to understand the scope, the integrations you need and your deadline. You then get a quote broken down into stages along with a schedule. Once you accept it, we sign the contract and set a start date. Throughout the project your point of contact is one of the founders, Remigiusz or Adrian, and nothing gets handed off to an account manager. We work in Polish and English.

  • What does the contract cover and how are stages settled?

    The contract covers scope, schedule, stage-based payments and the transfer of the economic copyright in the code to you, together with the fields of exploitation. Polish copyright law requires these to be listed explicitly and the contract itself to be in writing. We arrange the stages so you can see what you are paying for and in what order features get built. If the scope changes mid-project, we agree it separately before the work starts, not afterwards on an invoice.

  • I already have an in-house team or an agency. Can you work alongside them?

    Yes. We can take one specific area: the Medusa.js backend, an ERP integration, the frontend or automations, and work inside your repository, code review process and ticket system. We can also audit your existing codebase and hand over recommendations instead of rewriting everything from scratch. We agree on who owns what at the start, so nothing gets duplicated and deployments don't block each other.

  • What happens after launch? Do you maintain the store, and is there an SLA?

    After launch you can stay on a maintenance plan: monitoring, updates, fixes and further development. SLA terms and response times are agreed case by case, because a B2B wholesale platform running on ERP integrations needs something different from a company website. If your own team takes over, we run a full handover: documentation, environments and a walkthrough session for your developers.

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