CodeCanyon Buyer Guide
Welcome to Tenanto! This guide is specifically designed for CodeCanyon marketplace buyers to help you get started quickly.
Table of Contents
- Installation from CodeCanyon
- License Activation
- Quick Start
- Test Coverage & Quality Assurance
- Support Channels
- Frequently Asked Questions
- Refund Policy
Installation from CodeCanyon
Step 1: Download the Package
- Log in to your CodeCanyon account
- Go to Downloads section
- Find Tenanto and click Download
- Choose All files & documentation for the complete package
Step 2: Extract the Archive
# Extract to your projects directory
unzip tenanto-v1.0.0.zip -d /path/to/your/projects/
# Navigate to the project
cd /path/to/your/projects/tenanto
Step 3: Environment Setup
Option A: Docker (Recommended)
# Copy environment file
cp .env.example .env
# Start Docker containers (includes PHP, nginx, PostgreSQL, Redis, Horizon,
# scheduler, Mailhog, and the Vite dev server - 8 services total)
docker compose up -d
# Install PHP dependencies (frontend runs automatically in the vite container)
docker compose exec app composer install
# Generate application key
docker compose exec app php artisan key:generate
# Run migrations
docker compose exec app php artisan migrate --seed
No Node.js required on the host. The
viteDocker service installs its own dependencies (npm ci) and serves frontend assets with hot module replacement athttp://localhost:5273. Production builds (npm run build) are only needed when deploying without theviteservice.
Option B: Traditional Server
Ensure your server meets requirements:
- PHP 8.3+ (8.4 recommended)
- PostgreSQL 16+
- Redis 7+
- Composer 2.x
- Node.js 20+ (required for
npm run buildduring production deploy) - PHP extensions: zip, intl, gd, pcntl, pdo_pgsql, redis
# Install dependencies
composer install --optimize-autoloader --no-dev
npm ci && npm run build
# Configure environment
cp .env.example .env
php artisan key:generate
# Configure database in .env, then:
php artisan migrate --seed
Step 4: DNS Configuration
Add entries to your hosts file:
Linux/macOS: /etc/hosts
Windows: C:\Windows\System32\drivers\etc\hosts
127.0.0.1 tenanto.local
127.0.0.1 admin.tenanto.local
127.0.0.1 demo.tenanto.local
127.0.0.1 acme.tenanto.local
Step 5: Access Your Installation
The seeder creates accounts using the password from your DEMO_DEFAULT_PASSWORD env variable. With the unmodified .env.example, that value is ChangeMe-DemoPass!. Change it before going public - either edit .env and re-run php artisan migrate --seed, or run php artisan demo:reset-passwords after editing .env.
| Panel | URL | Default Credentials |
|---|---|---|
| Marketing landing | http://tenanto.local | - |
| System Admin Panel | http://admin.tenanto.local/admin | [email protected] / ChangeMe-DemoPass! |
| Tenant Panel | http://demo.tenanto.local/app | [email protected] / ChangeMe-DemoPass! |
| API base URL | http://tenanto.local/api/v1 | (Bearer token after login) |
| Mailhog (test inbox) | http://localhost:8025 | - |
If any URL fails with "site cannot be reached", your hosts file entries from Step 4 above are missing or wrong. Run
getent hosts tenanto.local(Linux/macOS/WSL2) orResolve-DnsName tenanto.local(PowerShell) to verify they resolve to127.0.0.1.
Step 6: Verify Your Installation
Quick sanity check that your install is healthy:
# Health endpoint should return 200 "OK"
curl -i http://tenanto.local/health
# All 8 Docker services should be "Up" and healthy
docker compose ps
# Run the PHP test suite - every test should pass
docker compose exec app php artisan test
# Optional: run the full E2E suite (takes several minutes)
npx playwright test --project=chromium
If php artisan test is green and the health endpoint returns 200 OK, your installation is ready for customization.
License Activation (Optional)
License Types
| License | Sites | Support | Updates |
|---|---|---|---|
| Regular | 1 end product | 6 months | Lifetime |
| Extended | 1 SaaS product | 12 months | Lifetime |
Activation Process
Tenanto includes an optional license system you can use for your own customers. It is disabled by default and does not enforce CodeCanyon purchase codes.
-
Enable Licensing (Optional)
# .env file LICENSE_ENABLED=true LICENSE_SECRET_KEY=your-very-long-secret-key-here LICENSE_VALIDATION_MODE=offline -
Generate a License
docker compose exec app php artisan license:generate --tier=pro [email protected] --name="Customer Name" -
Validate a License
docker compose exec app php artisan license:validate TENANTO-PRO-A1B2C3D4E5F6-XY7Z --domain=example.com
Multi-Site Licensing
If you need to deploy Tenanto on multiple sites:
- Each site requires a separate Regular or Extended license
- Contact support for volume licensing options
Quick Start
Creating Your First Tenant
Via Admin Panel:
- Go to http://admin.tenanto.local
- Navigate to Tenants > Create
- Enter tenant name and slug (e.g., "Acme Corp" / "acme")
- The tenant will be accessible at
http://acme.tenanto.local
There is no built-in tenant:create CLI command in the boilerplate. Create tenants through the admin panel or seed/import them through your own project workflow.
Setting Up Stripe Billing
- Create a Stripe account at https://stripe.com
- Get your API keys from Stripe Dashboard
- Configure in
.env:STRIPE_KEY=pk_test_xxx STRIPE_SECRET=sk_test_xxx STRIPE_WEBHOOK_SECRET=whsec_xxx - Create products/prices in Stripe and update:
STRIPE_PRICE_BASIC=price_xxx STRIPE_PRICE_PRO=price_xxx STRIPE_PRICE_ENTERPRISE=price_xxx
Removing the Example Module
The Projects/Tasks module is provided as an example. To remove it:
# Remove migrations (before running migrate)
rm database/migrations/*_create_projects_table.php
rm database/migrations/*_create_tasks_table.php
# Remove domain code
rm -rf app/Domain/ExampleApp
# Remove Filament resources
rm -rf app/Filament/Tenant/Resources/ProjectResource*
rm -rf app/Filament/Tenant/Resources/TaskResource*
# Remove tests
rm -rf tests/Feature/ExampleApp
rm -rf tests/Unit/Domain/ExampleApp
# Remove API routes and controllers
# Edit routes/api.php to remove project/task routes
rm -rf app/Http/Controllers/Api/V1/ProjectController.php
rm -rf app/Http/Controllers/Api/V1/TaskController.php
Test Coverage & Quality Assurance
Tenanto is built with enterprise-grade quality assurance. Unlike many marketplace scripts, we include comprehensive test suites that you can run to verify your installation works correctly.
Automated Tests
| Test Type | Coverage | Description |
|---|---|---|
| PHP Unit/Feature Tests | 600+ test methods | Backend logic, services, models |
| Tenant Isolation Tests | 30+ dedicated tests | Data never leaks between tenants |
| Playwright E2E Tests | 480+ scenarios across 15 project configurations | Full browser-based testing |
What's Tested
Backend (PHPUnit):
- Multi-tenant isolation (data never leaks between tenants)
- Authentication & authorization (roles, permissions)
- Billing & subscription logic
- API endpoints (full CRUD coverage)
- License system validation
Frontend (Playwright E2E):
- Complete user journeys across chromium, firefox, and webkit (plus mobile viewports)
- Admin panel CRUD operations
- Tenant panel workflows
- API integration tests
- Error handling & edge cases
Running Tests
# PHP tests
docker compose exec app php artisan test
# E2E tests (requires Node.js)
npx playwright install # First time only
npx playwright test
# Interactive E2E mode
npx playwright test --ui
The buyer package includes the test source files and the required config files (tests/, e2e/, phpunit.xml, playwright.config.ts).
CI-Ready (for Teams)
If you use CI/CD, Tenanto is ready out of the box:
- Sample GitLab CI configuration is included in
docs/deployment.md - Test commands and QA workflows are documented in
docs/e2e-testing.md
Why This Matters
- Confidence: Know your installation is working correctly
- Upgrades: Verify nothing breaks after updates
- Customization: Test your changes before deploying
- Security: Tenant isolation is verified by automated tests
Support Channels
Getting Help
| Channel | Response Time | Best For |
|---|---|---|
| 24-48 hours | General questions, bugs | |
| CodeCanyon Comments | 48-72 hours | Pre-sale questions |
| Documentation | Immediate | How-to guides |
Support Contact: publish your real support address and set SUPPORT_EMAIL in .env before distributing the package.
What's Included in Support
Covered:
- Installation assistance
- Bug reports and fixes
- Configuration questions
- Clarification on documentation
Not Covered:
- Custom feature development
- Third-party integrations
- Server/hosting setup
- Code customization
Reporting Bugs
When reporting a bug, please include:
-
Environment details:
- PHP version (
php -v) - Laravel version (
php artisan --version) - Database type and version
- Docker or traditional setup
- PHP version (
-
Steps to reproduce:
- Exact steps taken
- Expected behavior
- Actual behavior
-
Error logs:
- Check
storage/logs/laravel.log - Browser console errors
- Network tab responses
- Check
Frequently Asked Questions
Installation
Q: Docker containers won't start
Check if Docker Desktop is running and ports 80, 443, 5432 are available. See Troubleshooting Guide
Q: "Class not found" errors after installation
Run
composer dump-autoloadand clear caches:php artisan config:clear php artisan cache:clear php artisan view:clear
Q: Database connection refused
Ensure PostgreSQL is running and credentials in
.envmatch your setup. Docker users: usedbas host, notlocalhost.
Configuration
Q: How do I change the default domain?
Edit
config/tenancy.php:'central_domains' => ['yourdomain.com'],Update
.env:APP_URL=https://yourdomain.com
Q: Can I use MySQL instead of PostgreSQL?
Not currently. Tenanto uses PostgreSQL-specific features (e.g.
jsonbcolumns), so MySQL is not supported out of the box.
Q: How do I enable custom domains for tenants?
Set in
config/tenancy.php:'mode' => 'both', // subdomain + domainThen assign domains via Admin panel or database. Domain assignment is validated against the tenant's current plan, so the tenant must have the
custom_domainfeature enabled.
Billing
Q: How do I test Stripe integration?
Use Stripe test mode keys (pk_test_, sk_test_) and test card numbers:
- Success:
4242 4242 4242 4242- Decline:
4000 0000 0000 0002
Q: How do I add custom subscription plans?
- Create price in Stripe Dashboard
- Add to
config/billing.php:'custom_plan' => [ 'stripe_price_id' => env('STRIPE_PRICE_CUSTOM'), 'features' => [...], ],
- Add enum case in
SubscriptionPlan.php
Customization
Q: How do I add a new tenant module?
See Example Module Guide for step-by-step instructions.
Q: How do I customize the admin panel theme?
Edit
app/Providers/Filament/AdminPanelProvider.php:->colors([ 'primary' => Color::Blue, ]) ->brandLogo(asset('images/logo.svg'))
Q: How do I add API endpoints?
See API Documentation for patterns and examples.
Updates
Q: How do I update to a new version?
See Upgrading Guide for detailed instructions.
Q: Will updates break my customizations?
Core files may change. We recommend:
- Keep customizations in separate files when possible
- Use Laravel's extension points (Events, Observers, Middleware)
- Review CHANGELOG.md before updating
Refund Policy
Tenanto follows CodeCanyon's standard refund policy:
Refund Eligible:
- Item is "not as described"
- Item doesn't work as promised
- Item has a security vulnerability
- Support not provided as promised
Not Refund Eligible:
- Changed your mind
- Doesn't meet expectations not in description
- Bought by mistake
- Don't have expertise to use it
For refund requests, contact CodeCanyon support directly through their Help Center.
Version History
See CHANGELOG.md for complete version history.
Additional Resources
Thank you for purchasing Tenanto!
If you find this product useful, please consider leaving a rating on CodeCanyon. Your feedback helps us improve and helps other developers discover Tenanto.