Packaging & Distribution
Version, package and publish your extension so admins can install it from the WemX marketplace.
Versioning
- Bump
$versionin your main class for every release, using semantic versioning. - Set
$wemxVersionsto the WemX versions you've tested against, or['*']. The integrated marketplace checks the version constraint you publish and refuses to install incompatible releases. - Ship new migrations as new files. Never edit a migration that's already been released, because existing installs won't run it again.
Packaging
Release a ZIP that unpacks to exactly one folder named after your extension, so admins can drop it into place:
Tickets.zip
└── Tickets/
├── Module.php
├── routes.php
├── Views/ …
└── LICENSEDon't use GitHub's automatic Source code archive, which unpacks to repo-name-tag/. Build the ZIP in your release pipeline instead.
Keep dependencies minimal. Extensions are loaded into WemX's own autoloader, and a bundled vendor/ folder can conflict with the versions WemX ships. Prefer Laravel's HTTP client over provider SDKs.
Publishing on the marketplace
- Create a resource on app.wemx.net/marketplace and choose the right category: Server, Module, Payment Gateway, or a theme type.
- Upload a version with its ZIP, changelog and compatible WemX version.
- Set
$marketplace_idin your main class to the resource's ID, so installations can be matched to updates.
Once a version is approved, admins can install it from Admin → Marketplace in one click, and are notified when you publish an update.
Quality checklist
- Provisioning and payment methods throw meaningful exceptions on failure.
- Credentials are only read from encrypted config, never logged or put in exception messages.
- Webhooks verify signatures, and
completed()is the only way you mark payments paid. - Admin routes use
admin,RequireAdminReauthenticationandpermission:middleware. - New permissions are seeded in a migration.
- Views use
client_view()/admin_view()and the theme's components. - Disabling or uninstalling doesn't delete customer data.
- Tested on a fresh install with SQLite and with MySQL.