Build your first module
End-to-end path from empty package to a module running on a sandbox tenant.
Artifact-first (default): pack a signed bundle and install via Control — no Core redeploy required.
- Create modules/my-integration/ with package.json depending on @avanora/module-sdk.
- Add module.manifest.json (v2) declaring key, permissions, navigation, apiRoutes, and configSchemaPath.
- Add module.config.schema.json (JSON Schema) for the auto-rendered settings UI.
- Implement src/index.ts exporting ModuleDefinition with install / upgrade / uninstall hooks.
- Implement dist/routes.js handlers mounted at /api/v1/m/<module-key>/...
- Run avanora-module validate, pack, and sign.
- Upload in Control → Verify → Sandbox install on a dev tenant.
- Verify RBAC: users without your permission keys receive 403 on module APIs.
Legacy builtin path
First-party core modules (CRM, Sales, …) still embed logic in apps/client-platform. Do not use that path for new marketplace modules — see extension registry.
Validate locally
Use avanora-module verify on your tarball and exercise endpoints with a tenant session against /api/v1/m/<key>/health. See sample endpoints and the sample manifest.
Next steps
Deep dives: manifest fields, lifecycle hooks, debug & sandbox.