Product attributes
Custom attributes module for Medusa v2 with support for text, number, file types and units of measurement
Medusa Product Attributes
A flexible attribute system for Medusa v2 — text, number, file, boolean, with units and category inheritance
Features
| Feature | Description |
|---|---|
| Text Attributes | Arbitrary text values for products |
| Numeric Attributes | Numbers with units (kg, m, pcs, etc.) |
| File Attributes | File uploads: certificates, 3D models, manuals |
| Boolean Attributes | Yes/No values |
| Category Inheritance | Attributes cascade from parent to child categories |
| Global Attributes | Applied to every product automatically |
| Templates | Reusable blueprints — apply to any category in one click |
| Auto Slug | Labels are transliterated (Russian, Chinese, any script) |
| Smart File Naming | Uploaded images renamed to |
| i18n | English and Russian out of the box, extensible |
Requirements
| Dependency | Version |
|---|---|
| Medusa | ^2.13 |
| Node.js | >=20 |
| TypeScript | ^5.0 |
Quick Start
Installation
1. Add the plugin to configuration
2. Run migrations
npx medusa db:migrate3. Done!
The plugin automatically creates tables and registers admin widgets.
Screenshots
Category widget with inheritance

Product attribute values

Settings — Global Attributes & Templates

Usage
Admin
- Category attributes — open any category, the "Attributes" widget appears below details. Add custom attributes (inherited by subcategories), or pick from a template.
- Global attributes — Settings → Product Attributes → Globals tab. Applied to every product automatically.
- Templates — Settings → Product Attributes → Templates tab. Reusable blueprints.
- Product values — open any product, the "Characteristics" widget shows all inherited + global attributes with inputs.
API
Storefront (Store API)
The plugin ships a read-only module link between and , so attribute values are queryable straight from the Store API via the parameter — no extra setup in your app:
carries the attribute metadata (, , , ). The singular alias works as well.
The same relation is available anywhere Query is, e.g. in workflows or API routes:
Programmatic usage
Attribute types
| Type | Admin input | Stored in |
|---|---|---|
| text input | ||
| number input + unit badge | , | |
| upload button | (URL), | |
| select Yes/No |
Project Structure
Development
Contributing
Pull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.
Made with ❤️ for the Medusa community

