Configuration
All configuration lives in two places:
.env— server-level secrets and connection strings (this page)- Admin → Settings — everything a store manager should touch day-to-day (business info, payment toggles, email sender, storage provider, AI keys). See the Settings guide.
Many integrations can be configured in either place: seeding reads the .env values once as defaults, and the admin Settings pages let you change them later without touching the server.
After editing .env in production
Re-run php artisan config:cache so the changes take effect.
Core
| Key | Description |
|---|---|
APP_NAME | Your store name (used in emails and titles) |
APP_ENV | production on a live site |
APP_DEBUG | Must be false in production — preflight enforces this |
APP_URL | Full public URL, e.g. https://shop.example.com |
APP_KEY | Set by php artisan key:generate, or written for you by the setup wizard — never share it |
APP_INSTALLED | false sends every request to the setup wizard; the wizard sets it to true when it finishes. Set it back to false to re-run the installer |
DEMO_MODE | true turns the store into a public read-only showcase — see below |
Demo mode
Set DEMO_MODE=true to publish the store as a showcase anyone can click through without being able to damage it:
- Nothing is hidden. Every page, button and action stays visible and clickable — admin included — so visitors see the whole product.
- Writes are rejected. Creating, editing and deleting data returns a "demo mode is active" message instead. This is a default-deny rule applied to every write request, not a per-screen setting.
- Sign-up and purchase still work. Visitors can register, sign in, add addresses, check out and pay through the gateway, so the buying flow can be demonstrated end to end.
- Contact details are masked. Emails and phone numbers render as
s***@***/+***78so a public demo cannot be scraped for real PII. - A demo bar is pinned to the bottom of every page, so nobody mistakes the demo for their live store.
The flag is read at runtime: flip it in .env, run php artisan config:clear (only needed if you cached the config), and the next request picks it up. No front-end rebuild is required.
Database
| Key | Description |
|---|---|
DB_CONNECTION | mysql |
DB_HOST / DB_PORT | Usually 127.0.0.1 / 3306 |
DB_DATABASE / DB_USERNAME / DB_PASSWORD | Your database credentials |
First admin account
Only used by the CLI install — the setup wizard asks for these on screen instead and ignores the keys. Read once by the seeder; see CLI installation step 6.
| Key | Description |
|---|---|
ADMIN_EMAIL | Email for the first super admin (default [email protected]) |
ADMIN_PASSWORD | Password for it — leave empty to get a generated one printed at seed time |
Transactional email (order confirmations, password resets) and marketing campaigns:
| Key | Description |
|---|---|
MAIL_MAILER | smtp for real delivery, log for testing |
MAIL_HOST / MAIL_PORT | Your SMTP server |
MAIL_USERNAME / MAIL_PASSWORD | SMTP credentials |
MAIL_FROM_ADDRESS / MAIL_FROM_NAME | Sender identity |
SMTP can also be configured from Admin → Settings → Email Config, including a test-send button.
Payments
Cash on Delivery works with zero configuration. Online gateways activate when their keys are present — via .env at seed time or later in Admin → Settings → Payments.
Stripe
| Key | Description |
|---|---|
STRIPE_SECRET_KEY | sk_live_… (or sk_test_…) |
STRIPE_PUBLISHABLE_KEY | pk_live_… |
STRIPE_WEBHOOK_SECRET | whsec_… — register the webhook in your Stripe dashboard |
STRIPE_CHARGE_CURRENCIES | Currencies Stripe should charge in |
PayPal
| Key | Description |
|---|---|
PAYPAL_ENABLED | true / false |
PAYPAL_MODE | sandbox or live |
PAYPAL_CLIENT_ID / PAYPAL_CLIENT_SECRET | REST API credentials |
PAYPAL_WEBHOOK_ID | For webhook signature verification |
bKash (Bangladesh)
| Key | Description |
|---|---|
BKASH_USERNAME / BKASH_PASSWORD | Merchant credentials |
BKASH_APP_KEY / BKASH_APP_SECRET | App credentials |
BKASH_SANDBOX | true for testing |
SSLCommerz (Bangladesh)
| Key | Description |
|---|---|
SSLCOMMERZ_STORE_ID / SSLCOMMERZ_STORE_PASSWORD | Store credentials |
SSLCOMMERZ_SANDBOX | true for testing |
SSLCOMMERZ_*_URL | Init / validation / refund / callback / IPN endpoints |
Register your webhooks
Each gateway needs its webhook/IPN URL registered in the provider's dashboard so payment confirmations reach your store. The exact URLs are listed in deploy/DEPLOYMENT.md § "Webhooks to register with each provider".
Media storage
Local disk works out of the box. For S3 or DigitalOcean Spaces:
| Key | Description |
|---|---|
STORAGE_PROVIDER | local, s3, … |
STORAGE_ACCESS_KEY_ID / STORAGE_SECRET_ACCESS_KEY | Provider credentials |
STORAGE_REGION / STORAGE_BUCKET_NAME | Bucket location |
STORAGE_ENDPOINT / STORAGE_PUBLIC_URL | For S3-compatible providers (Spaces, MinIO) |
STORAGE_FORCE_PATH_STYLE | true for most S3-compatible services |
Also configurable in Admin → Settings → Storage.
AI (all optional)
Claude — text features
Product copy, review moderation, support chatbot, fraud scoring, email copy, merchandising insights:
| Key | Description |
|---|---|
ANTHROPIC_API_KEY | Your Anthropic API key — get one at console.anthropic.com |
AI_MODEL | Model id (a sensible default ships in .env.example) |
AI_EFFORT / AI_MAX_TOKENS / AI_CACHE_TTL | Tuning knobs — defaults are fine |
AI_EMBEDDINGS_PROVIDER | Optional semantic search provider |
VOYAGE_API_KEY / VOYAGE_MODEL | Only if using Voyage embeddings |
AI Studio — image & video generation
Configure any subset; providers appear in the AI Studio UI when their key is present:
| Key | Provider |
|---|---|
GEMINI_API_KEY | Google Gemini |
OPENAI_API_KEY | OpenAI |
FAL_KEY | FAL |
REPLICATE_API_TOKEN | Replicate |
You pay providers directly
AI usage is billed by each provider to your account. StoreMine never proxies or meters your AI traffic.
Shipping & currency
| Key | Description |
|---|---|
STEADFAST_BASE_URL | Steadfast courier API (Bangladesh) — credentials go in Admin → Settings → Courier |
FX_PROVIDER / FX_BASE_URL | Exchange-rate source for php artisan currency:refresh (default: exchangerate.host) |
Queue & scheduler
| Key | Description |
|---|---|
QUEUE_CONNECTION | database by default; redis for higher volume |
CRON_SECRET | Protects HTTP-triggered scheduled endpoints |
Remember: the queue worker and the cron entry from After the wizard must be running in production — campaigns, emails and AI jobs all depend on them.