Skip to content

Environment Variables ​

One page for every variable that shapes how an Evolve instance behaves per environment: what it does, what the default is, and who writes it. The rule behind all of them is simple. The environment type sets the defaults, single variables in the .env override them.

Three writers touch the .env of an instance:

WriterWrites
Deployment (evolve:env:setup, deploy)the posture keys, from the declaration in config/evolve.php
Settings panel, developer roleposture, debug, banner, mail safety, preview protection, module switches
Settings panel, admin rolemail transport, integrations, secrets; public business settings go to the settings store instead, see below
By hand, on the serveranything, when no panel is reachable

Public business values (tracking IDs and consent, verification codes, site name, branding, mail addresses, company identity) live in the database settings store. Since 2.18 the panel writes them there and no longer to the .env. A stored value wins over the .env variable of the same setting; the .env remains the fallback for existing sites. A new installation leaves these variables out of its .env and sets the values in the panel. The starter's .env.example 2.19 follows that rule: secrets, infrastructure, posture and module switches only, grouped and commented.

Posture ​

Written by the deployment, editable by a developer in the panel (the type select writes both keys together). The environment consistency health check fails when they contradict each other.

VariablelivestagingdevelopmentEffect
EVOLVE_ENV_TYPElivestagingunsetEvolve's posture. Decides mail redirection, preview protection, noindex. When unset, inferred from APP_ENV (production is live, staging is staging, anything else is development). testing is read as staging.
APP_ENVproductionstaginglocalLaravel's switch. Debug output, page cache eligibility, local only helpers. Test sites run staging because Laravel reads testing as "unit tests are running".
APP_DEBUGfalsetruetrueStack traces in the browser. evolve:env:verify fails when it is on for live.
EVOLVE_ENV_BANNERtruetruetrueThe hint on every frontend page naming the environment, a small pill at the bottom centre that a visitor can shrink to a dot in the corner; only live never shows one. Set to false to hide it on a type that would.

Mail ​

VariableDefaultEffect
EVOLVE_MAIL_SAFETYunsetOverrides the type's mail default in both directions. false sends real mail from a staging site; true redirects on a live or development site. Unset means the type decides. A developer sets it in the Developers tab.
EVOLVE_MAIL_REDIRECTdev@racerfish.comWhere redirected mail goes. Original recipients travel in the X-Original-To header. Empty on a protected environment means the message is cancelled and a warning is logged.
MAIL_MAILER, MAIL_HOST, MAIL_PORT, MAIL_SCHEME, MAIL_USERNAME, MAIL_PASSWORDinstaller: smtp to localhost:1025How mail is sent. Editable in the Mail tab of the panel, per instance.
MAIL_FROM_NAME, MAIL_FROM_ADDRESSSender. Never a recipient since 2.18. Fallback for the sender fields of the Mail tab (settings store).
EVOLVE_MAIL_NOTIFICATION_ADDRESSunsetInternal recipient of leads from forms without an admin address. Without it (and without a stored value) those notifications are skipped. Fallback for the Mail tab (2.18).
EVOLVE_MAIL_REPLY_TO_ADDRESSunsetReply-To of mails to visitors when the form sets none. Unset means the sender. Fallback for the Mail tab (2.18).

Resulting behaviour per type, with defaults:

livestagingdevelopment
Outgoing mailreal recipientsredirectedas configured, normally Mailpit
To catch mail insteadEVOLVE_MAIL_SAFETY=trueEVOLVE_MAIL_SAFETY=true
To test real sendingEVOLVE_MAIL_SAFETY=false
To see content without sending to customersEVOLVE_MAIL_REDIRECT=you@agency.ch

More on the Mail page.

Preview protection and search engines ​

VariableDefaultEffect
EVOLVE_PROTECT_PASSWORDunsetOn staging, HTTP basic auth on every page as soon as a password is set. Never active on live or development. The health check endpoint stays open.
EVOLVE_PROTECT_USERpreviewThe basic auth user name.

Independent of the password, staging always sends X-Robots-Tag: noindex, nofollow and render a noindex robots meta tag. Live and development do neither.

Page cache ​

VariableDefaultEffect
APP_PAGE_CACHEfalseMaster switch, editable in the panel. Cached HTML is served by the web server before PHP runs.

The cache only writes when all of these hold: APP_PAGE_CACHE=true, APP_ENV is production or staging (evolve.page-cache.environments), and no preview password is set. The last rule matters: a protected site cannot serve cached pages, because the web server would hand them out without the basic auth check. evolve:env:verify warns when the cache is on for a testing environment. Since 2.12 it also never writes a page rendered for a logged-in user or one that sets a cookie of its own, see Page Cache.

Tracking ​

Tracking tags only fire on live. Staging and development render the consent notice but load no tag manager, no Hotjar, and send no server side conversions, so test traffic never reaches the customer's properties. Since v2.11.

VariableDefaultEffect
TRACKING_EMITunsetOverrides the type in both directions. true fires the tags on a staging site for a test run, false silences a live site. Unset means the type decides. A developer sets it in the settings panel.
GTM_ID, GA4 measurement id, pixel and tag idsPublic ids. Since 2.18 the Tracking tab saves them to the settings store; the variables are the fallback. They may be identical on staging and live; the type decides whether they fire.
TRACKING_CONSENT_VIA_CMPfalseA consent platform in the tag manager grants consent, so opt-in without the Evolve banner is valid (2.18). Fallback for the Tracking tab.
TRACKING_CMPunsetConsent platform Evolve loads and bridges into the Evolve consent cookie, cookiebot (2.19). Counts as a consent platform for opt-in. Fallback for the Tracking tab.
COOKIEBOT_IDunsetCookiebot domain group ID for TRACKING_CMP=cookiebot (2.19). Fallback for the Tracking tab.

Once a tracking ID is stored in the settings store, the stored value wins over the variable. The health check's tracking.sources says which one a site uses.

The tracking health check fails on live when GTM or GA4 is missing or malformed, or when TRACKING_EMIT=false silences a live site, and warns when TRACKING_EMIT=true is left on a staging site. HEALTH_CHECK_TRACKING=false turns it off for a site without tracking on purpose.

Security headers ​

Sent by the Evolve middleware on every web response since 2.12. Details on Security Headers.

VariableDefaultEffect
EVOLVE_SECURITY_HEADERStruefalse switches all Evolve security headers off.
EVOLVE_FRAME_OPTIONSSAMEORIGINValue of X-Frame-Options. Empty for a site embedded in an iframe on another domain.
EVOLVE_HSTSmax-age=31536000Value of Strict-Transport-Security, sent on live over https only. Empty disables it.
EVOLVE_CSPunsetA Content-Security-Policy. Unset sends none.
EVOLVE_CSP_REPORT_ONLYfalsetrue sends the policy as Content-Security-Policy-Report-Only. Start here.

Pages served from the static page cache bypass PHP; their headers come from the web server config.

Form spam protection ​

See Form Spam Protection.

VariableDefaultEffect
EVOLVE_HONEYPOT_THRESHOLD3Seconds a form has to be open before a submission is accepted. Applies with and without reCAPTCHA.
GOOGLE_RECAPTCHA_SITEKEY, GOOGLE_RECAPTCHA_SECRETunsetv3 or v2 Invisible keys. Set both or neither. Settings panel, Google tab.
GOOGLE_RECAPTCHA_SCORE0.5Minimum v3 score a submission needs. Settings panel, Google tab.

Queue ​

VariableDefaultEffect
QUEUE_CONNECTIONLaravel's, sync in most existing projectssync runs jobs inside the request. Any other connection (typically database) needs a worker; on Onlime a cron line, see Deployment. Since 2.12 it also decides whether image variants render in the request or in the worker (Image Rendering).

Modules ​

VariableDefaultEffect
EVOLVE_MODULE_<NAME>unsetOverrides the module's entry in config/evolve.php (EVOLVE_MODULE_BLOG=false switches the blog off), since 2.21 also for a module the file does not list. Written by the module switches in the Developers tab and, for every module, by evolve:install.

Deployment ​

Read on the developer machine, from the project .env, never on the server.

VariableDefaultEffect
DEPLOYMENT_DEFAULTliveEnvironment used when php artisan deploy gets no argument.
DEPLOYMENT_USER, DEPLOYMENT_HOST, DEPLOYMENT_PATH, DEPLOYMENT_PHP_BINSSH user, host, base path and PHP binary on the server.
DEPLOYMENT_TARGETwwwLegacy single target, honoured when no environments are declared.
DEPLOYMENT_SSH_MULTIPLEX, DEPLOYMENT_SSH_PERSISTfalse, 10mReuse one SSH connection across the deploy steps.

Health ​

VariableDefaultEffect
HEALTH_CHECK_ENVIRONMENTtrueEnables the environment consistency check.
HEALTH_CHECK_MODULE_SWITCHEStrueEnables the module switches check (2.21): modules without an explicit switch, a Brevo key with the email module off.
HEALTH_CHECK_EMAIL_RECIPIENT, HEALTH_WEBMASTER_ADDRESSRecipient of the daily mailer test message, and the alert address for failure notifications (also the fallback for the test message). Since 2.18 the alert address is edited on the Mail tab (settings store) and HEALTH_WEBMASTER_ADDRESS is its fallback. Never MAIL_FROM_ADDRESS. On staging both are subject to the mail redirect.
EVOLVE_HEALTH_CHECK_TOKENBearer token for the api/health-check system information endpoint that Fleet reads. Oh Dear uses OH_DEAR_HEALTH_CHECK_SECRET instead.
HEALTH_CHECK_QUEUEunsetUnset (or empty) is auto-detect: the queue check runs when the queue driver is not sync. true or false pins it. The Health tab of the settings panel offers Auto, On and Off; Auto removes the key again (since 2.12).

The full list of health toggles is on Health Checks.

Error tracking ​

Variables of sentry/sentry-laravel, read when the package is installed. Evolve tags events itself, see Error Tracking.

VariableDefaultEffect
SENTRY_LARAVEL_DSNunsetWhere errors are sent. evolve:env:verify warns on live when neither this nor SENTRY_DSN is set (since 2.12).
SENTRY_DSNunsetLegacy name, used when SENTRY_LARAVEL_DSN is not set.
SENTRY_RELEASEunsetA release of your own. Unset, Evolve reports evolve@<version>+<release directory>.

Shopify ​

Only relevant with the Shopify module. The full list is on Shopify.

VariableDefaultEffect
SHOPIFY_AUTO_IMPORTunsetInterval of the scheduled product and collection import (hourly, daily, ...).
SHOPIFY_PURGE_DELETED_AFTER_DAYSunsetSince 2.12. Days a product must stay confirmed as deleted in Shopify before the daily purge removes it. Unset: no scheduled purge, shopify:purge-deleted-products runs by hand only (30 days).

Modules and integrations ​

Every module and integration documents its own keys on its page. This table is the index.

KeysPage
EVOLVE_MODULE_<KEY>Modules
BLOG_*Blog
COMPANY_*, JOBS_OVERVIEW_PAGE, TEAM_OVERVIEW_PAGE, MEMBER_OVERVIEW_PAGECompany
EVENT_*Events
FAQ_OVERVIEW_PAGEFAQ
GOOGLE_MAPS_API_KEY, GOOGLE_GEOCODING_API_KEYLocator
PROJECT_*Projects
SCOUT24_*, HEALTH_CHECK_SCOUT24Scout24
SHOPIFY_*, HEALTH_CHECK_SHOPIFYShopify
EMAIL_BRAND_COLOR, EMAIL_CONTAINER_WIDTH, EMAIL_ASSET_BASEMail templates (core since 2.22)
other EMAIL_*, BREVO_API_KEYEmail Campaigns, Brevo
MCP_*MCP Server
CHATBOT_*AI Chatbot
EVOLVE_MODULE_REGION, EVOLVE_REGION_REMOVE_DEFAULT_PREFIXRegions
OPENAI_*, LLM_PROVIDEREditor AI, OpenAI
GTM_ID, ANALYTICS_*, FACEBOOK_*, PINTEREST_TAG_ID, LINKEDIN_*, HOTJAR_SITE_ID, TRACKING_*, APP_COOKIE_CONSENTTracking and Consent
GOOGLE_SITE_VERIFICATION, BING_SITE_VERIFICATION, PINTEREST_SITE_VERIFICATIONSEO and Head
GOOGLE_RECAPTCHA_*, EVOLVE_HONEYPOT_THRESHOLDForm Spam Protection
VIMEO_*, VIDEO_DRIVER, VIDEO_RESOLVER_URLVimeo
IMAGE_DRIVER, IMAGE_ALLOW_IDS, IMAGE_RECOGNITIONMedia library, Image Rendering
HEALTH_*, OH_DEAR_HEALTH_CHECK_SECRET, SCHEDULE_HEARTBEAT_URL, EVOLVE_HEALTH_CHECK_TOKENHealth Checks
SENTRY_*Error Tracking

Other keys ​

Keys the package reads that belong to no feature page.

VariableDefaultEffect
APP_EVOLVE_LOCALEdeDefault language of the panel. Users switch their own in the profile.
APP_LOGIN_IMAGE_ID, APP_BACKEND_THEME_COLORunset, #E78401Panel branding: the login screen image (a media ID) and the brand colour on the logo and loaders. Since 2.18 Settings > General saves them to the settings store group branding; the variables are the fallback.
APP_INFO_BARtrueThe info bar on the frontend for logged-in panel users (edit links, cache button).
APP_AUTO_TRANSLATEfalseThe auto-translate button in block fields, through Google Cloud Translation. Needs GOOGLE_APPLICATION_CREDENTIALS.
ANALYTICS_PROPERTY_ID, GOOGLE_APPLICATION_CREDENTIALSunsetPage views on the dashboard and in the page list, read from the GA4 Data API with a service account JSON file. The path is absolute or relative to the project root; the same file serves Cloud Vision and Cloud Translation. The package ships no service account 2.19: without the file the dashboard shows a notice instead of loading, and image recognition and auto-translate fail with a clear message. Create the account in Google Cloud with the Analytics Data API enabled and add its email as a viewer of the GA4 property.
ACTIVITY_LOGGER_ENABLED, ACTIVITY_LOGGER_DB_CONNECTIONtrue, unsetThe activity log (spatie/laravel-activitylog). Off, the Activity screen and the health check's content block go empty.
IPSTACK_API_ACCESS_KEY, IPSTACK_TEST_IPunsetIP geolocation through ipstack, used by IpGeoLocator to place a visitor in a country.
SLACK_WEBHOOKunsetDeploy notifications (release deployed, release rolled back) to a Slack channel.
REALFAVICONGENERATOR_API_KEYa shared keyThe favicon generator in the panel. Override when the shared key is rate-limited.
GOOGLE_PAGESPEED_KEYunsetReserved; nothing reads it in 2.16.
STRIPE_API_SECRET, STRIPE_API_PUBLICunsetNot read by Evolve. Present in services.php for projects that use Laravel Cashier.
GOOGLE_TRACKING_IMPLEMENTATION, ANALYTICS_ANONYMIZE_IPgtag, falseDeprecated with the GTM path. Kept for published configs; only the legacy globals read them.

Checking an environment ​

bash
php artisan evolve:env:verify staging   # posture keys against the declaration
php artisan evolve:env:diff             # key names across local and remote .env files

The Health tab of the panel shows the same posture verdict at runtime, so a wrong server .env is visible without a terminal.