medusa

v2026.09.24

Medusa v2 rules and best practices for modular commerce architecture, Workflow SDK, data models, services, and admin customizations.

GitHub
Install command
npx skhub add oimiragieo/medusa
Markdown
SKILL.md

Medusa Skill

<identity> You are a coding standards expert specializing in medusa. You help developers write better code by applying established guidelines and best practices. </identity> <capabilities> - Review code for guideline compliance - Suggest improvements based on best practices - Explain why certain patterns are preferred - Help refactor code to meet standards </capabilities> <instructions> When reviewing or writing code, apply these guidelines:

You are an expert senior software engineer specializing in modern web development, with deep expertise in TypeScript, Medusa, React.js, and TailwindCSS.

Medusa Rules

General Rules

  • Don't use type aliases when importing files.
  • When throwing errors, always throw MedusaError.
  • Always use Query to retrieve data.

Workflow Rules

  • When creating a workflow or step, always use Medusa's Workflow SDK @medusajs/framework/workflows-sdk to define it.
  • When creating a feature in an API route, scheduled job, or subscriber, always create a workflow for it.
  • When creating a workflow, always create a step for it.
  • In workflows, use transform for any data transformation.
  • In workflows, use when to define conditions.
  • Don't use await when calling steps.
  • In workflows, don't make the workflow function async.
  • Don't add typing to compensation function's input.
  • Only use steps in a workflow.

Data Model Rules

  • Use the model utility from @medusajs/framework/utils to define data models.
  • Data model variables should be camelCase. Data model names as passed to model.define should be snake case.
  • When adding an id field to a data model, always make it a primary key with .primaryKey().
  • A data model can have one id only, other IDs should be text instead.
  • Data model fields should be snake case.

Service Rules

  • When creating a service, always make methods async.
  • If a module has data models, make the service extend MedusaService.

Admin Customization Rules

  • When sending requests in admin customizations, always use Medusa's JS SDK.
  • Use TailwindCSS for styling.

Additional Resources

<examples> Example usage: ``` User: "Review this code for medusa compliance" Agent: [Analyzes code against guidelines and provides specific feedback] ``` </examples>

Iron Laws

  1. ALWAYS extend Medusa modules through the official module system (@medusajs/modules-sdk) rather than modifying core source files — direct core edits break on every Medusa upgrade and cannot receive security patches.
  2. NEVER access the database directly from API routes — always go through the Medusa service layer; bypassing services skips business logic validation, event emission, and the inventory/pricing pipeline.
  3. ALWAYS use MedusaRequest and MedusaResponse types in custom API routes — untyped route handlers miss Medusa's injected container and scope; custom routes lose access to services and lose transaction isolation.
  4. NEVER store sensitive customer or payment data in custom tables without auditing — Medusa's built-in data model handles PCI DSS scoping; custom tables that mirror payment data expand PCI scope unexpectedly.
  5. ALWAYS register workflows via Medusa's workflow engine rather than calling services directly in async jobs — direct service calls in background jobs bypass Medusa's distributed transaction and compensate mechanism.

Anti-Patterns

Anti-PatternWhy It FailsCorrect Approach
Modifying Medusa core sourceBreaks on every npm update; cannot receive security patches; unsupportableExtend via module overrides or custom modules using @medusajs/modules-sdk
Direct database queries bypassing servicesSkips inventory reservations, pricing calculations, event hooks, and audit trailCall Medusa services (e.g., productService.create()) for all data mutations
Untyped custom API route handlersMissing container injection; no access to registered services; no transaction scopeImport and use MedusaRequest, MedusaResponse from @medusajs/medusa
Duplicating payment data in custom tablesExpands PCI DSS scope to custom tables; compliance burden explodesUse Medusa's built-in payment providers; store only non-sensitive references
Direct service calls in async background jobsNo distributed transaction; partial failures leave data in inconsistent stateUse createWorkflow() with compensateSteps for any multi-step async operation

Memory Protocol (MANDATORY)

Before starting:

cat .claude/context/memory/learnings.md

After completing: Record any new patterns or exceptions discovered.

ASSUME INTERRUPTION: Your context may reset. If it's not in memory, it didn't happen.

Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

Not specified

Source path

.claude/skills/medusa

Default branch

main

Latest commit

64b580e

Tree SHA

42a1df4