
A production-ready ecommerce plugin for Strapi CMS with zero manual setup, offering complete backend functionality out of the box.
released May 4, 2026
npm install @webbycrown/webbycommerceA complete, production-ready ecommerce solution for Strapi CMS. This plugin provides a comprehensive backend for managing ecommerce functionality without requiring developers to manually create content types, routes, or controllers. Simply install, configure, and start building your online store.
NPM Package: @webbycrown/webbycommerce
Strapi Market: https://market.strapi.io/plugins/@webbycrown-webbycommerce
Watch Demo: https://webbycommerce-nextjs.vercel.app
πΊ Learn how to use WebbyCommerce Plugin with our step-by-step guide
Direct link: https://www.webbycrown.com/guides/webbycommerce-strapi-ecommerce-guide/
βΆοΈ Watch Full Video on YouTube
This plugin is designed to be a drop-in ecommerce backend layer for Strapi:
npm install @webbycrown/webbycommerceAdd the plugin to your config/plugins.js:
module.exports = ({ env }) => ({
webbycommerce: {
enabled: true,
resolve: require.resolve("@webbycrown/webbycommerce"),
},
});If you're developing locally, you can enable it from the local path:
module.exports = ({ env }) => ({
webbycommerce: {
enabled: true,
resolve: "./src/plugins/webbycommerce",
},
});You can populate your store with sample products/categories/etc using any of the following options:
ynpx strapi-ecommerce-setupRun this from your Strapi project root. When prompted "Would you like to seed example data? (y/n):", answer y.
This command will set STRAPI_PLUGIN_ADVANCED_ECOMMERCE_SEED_DATA=true in your Strapi projectβs .env.
Restart Strapi to seed demo data.
n).env flag (programmatic / CI-friendly)Add this to your Strapi projectβs .env and then start Strapi:
STRAPI_PLUGIN_ADVANCED_ECOMMERCE_SEED_DATA=truenpm run developAfter the demo data is seeded once, set it back to false (or remove it) to avoid reseeding on every startup.
After installation, navigate to Settings β Users & Permissions β Roles and select the Public role (or any role you want to grant access).
Under the WebbyCommerce section, enable the Enable permission to allow access to ecommerce API endpoints.
Navigate to Settings β WebbyCommerce in the Strapi admin panel. You'll find several configuration tabs:
webbycommerce)
/api/ecommerce, /api/v1, /api/shopThe plugin automatically extends the user schema with ecommerce-specific fields. The plugin will attempt to automatically add OTP fields to the user schema when it starts up.
Required Fields:
username (string, required, unique)email (email, required)phone_no (string, required, unique)first_name (string, required)last_name (string, required)Optional Fields:
display_name (string)company_name (string)OTP Fields (required if using OTP authentication):
otp (integer, nullable) - Stores the OTP codeisOtpVerified (boolean, default: false) - Tracks if OTP has been verifiedThe plugin automatically adds OTP fields to the user schema on startup. If you see an error about OTP fields not being available, you may need to manually extend the schema.
If the automatic schema extension doesn't work, create a schema extension file in your main Strapi project:
Create the directory structure:
src/extensions/users-permissions/content-types/user/Create schema.json in that directory with the following content:
{
"kind": "collectionType",
"collectionName": "up_users",
"info": {
"name": "user",
"description": "",
"singularName": "user",
"pluralName": "users"
},
"options": {},
"pluginOptions": {},
"attributes": {
"otp": {
"type": "integer",
"required": false,
"private": true
},
"isOtpVerified": {
"type": "boolean",
"default": false,
"required": false,
"private": true
}
}
}Restart Strapi to apply the schema changes.
The plugin creates an Address content type automatically with the following fields:
Required Fields:
type (integer, 0=billing, 1=shipping)first_name (string)last_name (string)country (string)city (string)street_address (text)postcode (string)phone (string)email_address (email, required for billing addresses)Optional Fields:
company_name (string)region (string)Relations:
user (manyToOne β plugin::users-permissions.user)All API endpoints are documented in the Strapi admin panel under Settings β WebbyCommerce β API Collections. Each endpoint includes:
The base URL depends on your configured route prefix:
http://localhost:1337/api/webbycommercehttp://localhost:1337/api/{your-prefix}Most endpoints require a JWT token. Include it in the Authorization header:
Authorization: Bearer YOUR_JWT_TOKENWhen Default authentication method is selected:
POST /api/auth/local
Content-Type: application/json
{
"identifier": "user@example.com",
"password": "password"
}POST /api/auth/local/register
Content-Type: application/json
{
"username": "user1234",
"email": "user@example.com",
"password": "password"
}When OTP authentication method is selected:
POST /api/{prefix}/auth/login-register
Content-Type: application/json
{
"email": "user@example.com",
"type": "email"
}Response:
{
"message": "OTP sent to email.",
"userId": 1,
"isNewUser": false,
"emailSent": true
}POST /api/{prefix}/auth/verify-otp
Content-Type: application/json
{
"email": "user@example.com",
"otp": "123456",
"type": "email"
}Response:
{
"message": "Login successfully!",
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"username": "user1234",
"email": "user@example.com",
"phone_no": null
}
}GET /api/{prefix}/auth/profile
Authorization: Bearer YOUR_JWT_TOKENResponse:
{
"user": {
"id": 1,
"username": "user1234",
"email": "user@example.com",
"phone_no": "+1234567890",
"first_name": "John",
"last_name": "Doe",
"display_name": "John Doe",
"company_name": "WebbyCrown Solutions",
"confirmed": true,
"blocked": false,
"role": {
"id": 1,
"name": "Authenticated",
"type": "authenticated"
},
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
}Note: All fields (except password) are always returned, using null for missing values.
PUT /api/{prefix}/auth/profile
Authorization: Bearer YOUR_JWT_TOKEN
Content-Type: application/json
{
"first_name": "John",
"last_name": "Doe",
"email": "user@example.com",
"phone_no": "+1234567890",
"display_name": "John Doe",
"company_name": "WebbyCrown Solutions",
"currentPassword": "oldpassword",
"newPassword": "newpassword"
}Required Fields:
first_namelast_nameemail (must be unique)phone_no (must be unique)Optional Fields:
display_namecompany_namecurrentPassword and newPassword (only available when Default authentication method is enabled)Response:
{
"message": "Profile updated successfully.",
"user": {
"id": 1,
"username": "user1234",
"email": "user@example.com",
"phone_no": "+1234567890",
"first_name": "John",
"last_name": "Doe",
"display_name": "John Doe",
"company_name": "WebbyCrown Solutions",
"confirmed": true,
"blocked": false,
"updatedAt": "2024-01-01T12:00:00.000Z"
}
}GET /api/{prefix}/addresses
Authorization: Bearer YOUR_JWT_TOKENQuery Parameters:
type (optional): Filter by type (0=billing, 1=shipping)Response:
{
"data": [
{
"id": 1,
"type": 0,
"first_name": "John",
"last_name": "Doe",
"company_name": "WebbyCrown Solutions",
"country": "United States",
"region": "California",
"city": "San Francisco",
"street_address": "123 Main Street",
"postcode": "94102",
"phone": "+1234567890",
"email_address": "john@example.com",
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
]
}GET /api/{prefix}/addresses/:id
Authorization: Bearer YOUR_JWT_TOKENPOST /api/{prefix}/addresses
Authorization: Bearer YOUR_JWT_TOKEN
Content-Type: application/json
{
"type": 0,
"first_name": "John",
"last_name": "Doe",
"company_name": "WebbyCrown Solutions",
"country": "United States",
"region": "California",
"city": "San Francisco",
"street_address": "123 Main Street",
"postcode": "94102",
"phone": "+1234567890",
"email_address": "john@example.com"
}Required Fields:
type (0=billing, 1=shipping)first_namelast_namecountrycitystreet_addresspostcodephoneemail_address (required for billing addresses, type=0)Optional Fields:
company_nameregionSingle Address Mode:
403 ForbiddenMultiple Address Mode:
PUT /api/{prefix}/addresses/:id
Authorization: Bearer YOUR_JWT_TOKEN
Content-Type: application/json
{
"street_address": "456 Updated Street",
"city": "Los Angeles"
}All fields are optional. Only provided fields will be updated.
DELETE /api/{prefix}/addresses/:id
Authorization: Bearer YOUR_JWT_TOKENensureEcommercePermission utilityControllers:
auth.js: Authentication and profile managementaddress.js: Address CRUD operationscontroller.js: Plugin settings managementshipping.js: Shipping CRUD operationsproduct.js: Product CRUD operationsorder.js: Order CRUD operationscart.js: Cart CRUD operationspayment.js: Payment CRUD operationsreview.js: Review CRUD operationswishlist.js: Wishlist CRUD operationswebhook.js: Webhook CRUD operationscoupon.js: Coupon CRUD operationsUtilities:
check-ecommerce-permission.js: Permission validationsend-email.js: Email sending (SMTP or Strapi email plugin)User Extensions:
plugin::users-permissions.userAddress Content Type:
api::address.addressTest endpoints using:
Check logs for errors:
# Strapi logs will show plugin-specific errors with [webbycommerce] prefixAuthorization: Bearer <token> headerconfig/plugins.jsadmin/src and server/src directly; removed dist-first packaging) for Strapi Marketplace compatibility.π First production-ready release of WebbyCommerce, a complete ecommerce backend plugin for Strapi CMS.
β¨ Added
WebbyCrown
Share your work with the community and get it listed in the Strapi ecosystem for everyone to discover and use.
Submit
