My role
I work across the production systems that connect partners, products, orders and EV charging operations, building and owning customer-facing products and integrations, while maintaining and extending the platform behind them.
Website
Built & ownnordiccharge.com, Astro + React, English and Danish
Marketplace
Built & ownB2B storefront on WordPress + WooCommerce
Commerce integrations
Built & ownNordic Charge for WooCommerce, the partner-side plugin
API v2
Designed & builtThe Portal's machine-to-machine REST API
Partner Portal
Maintain & developExisting Laravel platform, now one of its main maintainers
How the systems connect
Marketplace
WordPress · WooCommerce
custom theme + B2B plugin
Partner storefronts
Shopify · WooCommerce
plugin & webhook intake
Partner Portal
Laravel · Filament · Livewire. Orders, installers, inventory, invoicing
Charging & logistics platforms
Monta · Zaptec · EOSVolt · 3PL shipping · Minuba for installers
Orders can enter the Partner Portal through several channels. The marketplace extends WooCommerce with custom functionality and talks to the Portal through API v2 using machine-to-machine OAuth authentication. Partners running their own Shopify or WooCommerce stores feed orders in through signed webhooks or the integration plugin. Larger partners running their own systems integrate directly against the Portal's REST APIs, the legacy API v1 or API v2, depending on their needs. The Portal orchestrates everything downstream, fulfilment pipelines, installer field operations, inventory and invoicing, and connects to charge-point platforms such as Monta, Zaptec and EOSVolt.
Partner Portal & API v2
The existing platform
The Partner Portal predates my involvement: a multi-tenant Laravel, Filament and Livewire platform covering order management, installer operations, team inventories and invoicing. Since joining in May 2025 I have become one of its primary maintainers, contributing several hundred commits across order workflows, partner operations and integrations.
API v2 Designed & built from scratch
API v2 is the Portal's machine-to-machine REST API for partner integrations, and the primary API path for every new partner integration:
- OAuth 2.0 client-credentials (Laravel Passport), no user context; each API client is bound to exactly one partner team, so team binding is the authorization boundary.
- Opaque public IDs, every resource is addressed by a ULID; internal numeric keys are never exposed.
- Cursor pagination across all list endpoints.
- Idempotent order creation, orders are deduplicated on two keys in a deliberate order, backed by a database unique constraint, so a store mid-migration between webhook intake and the plugin can't create duplicates: both paths recognise each other's orders. Race losers re-read and return the winning row instead of failing.
The API ships with generated reference docs, a Postman collection and a feature-test suite covering the full OAuth round-trip, team scoping, pagination and idempotency.
Marketplace
Built on WordPress + WooCommerce
The Nordic Charge B2B marketplace lets partners order charging equipment directly. It deliberately builds on WordPress and WooCommerce rather than a custom commerce engine, using the platform's existing commerce capabilities while keeping the partner-specific functionality custom.
What I built
I built the custom theme and B2B plugin end to end and continue to own both in production. Together they turn a stock WooCommerce install into a partner store:
- Portal-backed sign-in, partners log in with their Partner Portal credentials; the Portal remains the identity authority and accounts are provisioned locally on first login.
- Members-only storefront, guests see only the front page and a request-access form; products and prices are gated to authenticated partners.
- Invoice checkout, a payment gateway that fits B2B terms, with WooCommerce checkout-blocks support.
- Catalogue importer, an idempotent tool that mirrors the Portal's product catalogue into WooCommerce, collapsing colour ranges into variable products while keeping every variation mapped to its Portal counterpart.
The theme shares its design system with the public website, so the marketplace looks and feels like Nordic Charge across two very different stacks.
Commerce integrations
The problem
Before the integration plugin existed, WooCommerce orders reached Nordic Charge through a generic webhook, and matching what was actually ordered meant guessing from SKU strings and product titles.
The solution
I built and maintain Nordic Charge for WooCommerce, a plugin any partner store can install, built around explicit mapping instead of guessing. Merchants map their catalogue to Portal products once, with a parent/attribute model that keeps the mapping table small.
30
individual variation mappings
13
parent + attribute mappings
A charger with six colours across three installation tiers requires 30 variation-level mappings with a naive approach, versus 13 mappings using the parent/attribute model.
Reliability
Orders are submitted through API v2 with a strict split between terminal and retryable failures, bad data fails fast with a note naming the field; network and server errors retry on a backoff ladder without ever double-submitting. Submission state lives in HPOS-safe order meta, so every admin surface (order column, meta box, resubmit action) works on both classic and high-performance order storage.
Testing
The plugin ships with 400+ unit and integration tests, static analysis at PHPStan level 8, and a CI matrix across PHP and WooCommerce versions.
Website
Ownership
I built nordiccharge.com and am responsible for its development, deployments and ongoing maintenance.
Architecture
Astro and React, with around 26 routes across English and Danish, plus serverless contact and careers endpoints.
Content system
Non-technical colleagues publish insights and team updates through a Git-based CMS that commits directly to the repository. I also built a custom rehype plugin to transform the CMS's markup into styled callouts.
Accessibility
Internationalisation with locale fallbacks, reduced-motion support and keyboard-accessible navigation.
Deployment & infrastructure
GitHub Actions · Laravel Forge · DigitalOcean
I manage the deployment pipeline and production releases for the systems I own.