Packaging & Distribution

Version, package and publish your extension so admins can install it from the WemX marketplace.

Versioning

  • Bump $version in your main class for every release, using semantic versioning.
  • Set $wemxVersions to 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/ …
    └── LICENSE

Don'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

  1. Create a resource on app.wemx.net/marketplace and choose the right category: Server, Module, Payment Gateway, or a theme type.
  2. Upload a version with its ZIP, changelog and compatible WemX version.
  3. Set $marketplace_id in 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, RequireAdminReauthentication and permission: 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.

On this page