This guide walks through deploying and configuring the Zenmove-powered moving quote site so you can start collecting moving quote requests.
Requirements
Server
- Apache or Nginx web hosting
- PHP 7.4 or higher (PHP 8.x recommended)
- cURL extension enabled
- JSON extension enabled
- Writable web root directory
- FTP, cPanel, or SSH access
Credentials
- Zenmove API token (from your Zenmove dashboard)
- A domain or subdomain (e.g. quotes.yoursite.com)
- SMTP credentials if using email lead routing
- Cloudflare account for CAPTCHA (optional)
Step 1: Upload the Files
- Download and extract mymove.zip
- Upload all extracted files to your web root directory:
/public_html//www//htdocs/
- Confirm the following files and folders are present before continuing:
lang/en.php— English content stringslang/fr.php— French content stringsinstall.php— setup wizardindex.php,quote.php,about.php,contact.php,how-it-works.php,privacy.phpheader.php,footer.php,lang.phpcustom.css
Note: Do not create config.php manually. The setup wizard generates it for you in the next step.
Step 2: Run the Setup Wizard
Open your browser and navigate to:
https://yourdomain.com/install.php
The wizard walks through all configuration in one form. Complete each section:
1. Core Settings
- Company name
- Site URL (must include https and no trailing slash)
- Zenmove API token
2. Branding and Assets
- Brand primary colour (used for buttons, headers, and gradients)
- Logo URL and favicon URL
- Homepage hero background image URL (optional)
- Sub-page header background image URL (optional)
- Footer background image URL (optional)
- Toggle to show or hide the header strip on sub-pages
3. Lead Routing and Email
Choose how submitted quote requests are handled. See the Lead Routing section below for a full explanation of each mode.
SMTP settings are required when your routing mode sends email notifications.
4. Privacy
- Enable or disable the privacy policy agreement checkbox on the quote form
5. Conversion Features
- Announcement bar — a dismissible strip shown at the top of every page
- Testimonials section — customer review cards on the homepage
6. Languages
- English is always active and cannot be deselected
- Enable French to show a language toggle on the site
- Additional languages can be added manually after installation
7. Security (Cloudflare Turnstile)
- Paste your Turnstile site key and secret key to enable CAPTCHA on the quote and contact forms
- Leave both fields empty to disable CAPTCHA
8. Social Media and SEO
- Enable Open Graph tags for social sharing previews
- Set a custom title, description, and image URL
Click Install and Configure Site. The wizard writes config.php and creates installed.lock, then blocks further access automatically.
Note: To re-run the wizard, delete both config.php and installed.lock from the server first.
Lead Routing Options
The LEAD_MODE setting in config.php controls what happens when a visitor submits the quote form. There are four modes:
Marketplace Only — sell_all
define('LEAD_MODE', 'sell_all');
All leads — both domestic and international — are submitted directly to the Zenmove marketplace. Moving companies in the Zenmove network receive the request and contact the customer. No email is sent to you.
Use this mode if you want to operate purely as a Zenmove referral partner with no inbox management.
Hybrid — sell_international
define('LEAD_MODE', 'sell_international');
International move requests are submitted to the Zenmove marketplace. Domestic move requests (local and long distance) are sent to your inbox via SMTP instead.
Use this mode if you handle domestic leads yourself but want to pass international moves to Zenmove's specialist network.
SMTP configuration is required for this mode.
Email Only — email_only
define('LEAD_MODE', 'email_only');
All leads are sent to your inbox via SMTP. Nothing is submitted to the Zenmove marketplace. You manage all quote requests directly.
Use this mode if you are operating as an independent moving company and want all enquiries delivered to your own team.
SMTP configuration is required for this mode.
Both — both
define('LEAD_MODE', 'both');
All leads are submitted to the Zenmove marketplace and you also receive an email notification for every submission. The customer gets covered by the full mover network while you maintain visibility of every request in your inbox.
Use this mode if you want maximum coverage — leads are handled by Zenmove and you stay informed of every enquiry.
SMTP configuration is required for this mode.
SMTP Configuration
Required for sell_international, email_only, and both modes. Add the following to config.php or configure through the setup wizard:
define('SMTP_HOST', 'smtp.yourdomain.com');
define('SMTP_PORT', 587);
define('SMTP_ENCRYPTION', 'tls');
define('SMTP_USERNAME', 'you@yourdomain.com');
define('SMTP_PASSWORD', 'your_smtp_password');
define('SMTP_FROM_EMAIL', 'noreply@yourdomain.com');
define('SMTP_TO_EMAIL', 'leads@yourdomain.com');
Important: SMTP_FROM_EMAIL must be a verified sender address with your mail provider. Using an unverified address will cause delivery failures.
Step 3: Verify the Site
Visit your domain in a browser:
https://yourdomain.com
Check that each page loads without errors:
/— Homepage/quote.php— Quote request form/how-it-works.php— Process explainer/about.php— About page/contact.php— Contact form/privacy.php— Privacy policy
Step 4: Test Lead Submission
- Go to
/quote.phpand fill in the form with test data - Submit and confirm the success screen appears
- Verify the result based on your routing mode:
- sell_all or both: lead appears in your Zenmove dashboard
- email_only or both: notification email arrives at
SMTP_TO_EMAIL
Turnstile note: Site keys are domain-locked. If testing on a local or staging domain, either add that domain to your Cloudflare Turnstile widget's allowed list, use Cloudflare's test keys (1x00000000000000000000AA / 1x0000000000000000000000000000000AA), or leave the keys empty to bypass CAPTCHA during testing.
Step 5: Customize Content and Branding
Site Text
All visible content is stored in language files, not in the page templates. Edit the files in the lang/ folder:
lang/en.php— all English contentlang/fr.php— all French content
Keys are grouped by page with comments. Update headlines, body copy, testimonials, and the privacy policy text in these files.
Testimonials
Replace the three placeholder reviews before going live. In lang/en.php, update the values for:
testimonial_1_name,testimonial_1_loc,testimonial_1_texttestimonial_2_name,testimonial_2_loc,testimonial_2_texttestimonial_3_name,testimonial_3_loc,testimonial_3_text
Privacy Policy
The included privacy.php contains a template policy. You must review and customize it to comply with the regulations that apply to your business — GDPR, PIPEDA, CCPA, or others. All policy content is editable in lang/en.php under the privacy_ keys. Once finalized, remove the template warning block from privacy.php.
Styling
All custom styles are in custom.css in the root directory. The brand primary colour is applied automatically from BRAND_COLOR in config.php and does not need to be changed in the CSS directly.
Adding a New Language
- Copy
lang/fr.phpto a new file, e.g.lang/es.php - Translate every value — keep all array keys identical
- Set
'lang_name'to the native language name, e.g.'Español' - Add the language code to
LANG_ENABLEDinconfig.php:
define('LANG_ENABLED', ['en', 'fr', 'es']);
The language toggle appears automatically when more than one language is enabled.
Step 6: Secure the Installation
- Enable HTTPS — an SSL certificate is required for form submissions and Cloudflare Turnstile
- Confirm
installed.lockexists in the root directory — this blocks the setup wizard from running again - Restrict direct browser access to
config.phpvia your server configuration or.htaccess:
<Files "config.php"> Require all denied </Files>
- Disable directory listing on your server
- Set file permissions — files: 644, folders: 755
Warning: Never expose config.php publicly. It contains your API token and SMTP credentials.
Step 7: Add Tracking and Advertising
- Add Google Analytics (GA4) or Google Tag Manager to
header.phpjust before the closing</head>tag - Add Meta Pixel or other tracking scripts in the same location
- Use UTM parameters on all paid traffic destination URLs:
https://yourdomain.com/quote.php?utm_source=google&utm_medium=cpc&utm_campaign=moving
Troubleshooting
Form not submitting
- Verify the API token in
config.phpis correct - Confirm cURL and JSON PHP extensions are enabled
- Check that outbound HTTPS connections are permitted on your server
Blank or broken page
- Temporarily add
ini_set('display_errors', 1);to the top ofindex.phpto surface PHP errors - Check your server's PHP error log
- Confirm PHP 7.4 or higher is active — some hosts default to older versions
Leads not appearing in Zenmove
- Confirm
LEAD_MODEis set tosell_allorboth - Verify the API token and base URL are correct
- Confirm
ZM_API_VERIFY_SSLis set totruein production
Emails not arriving
- Confirm
LEAD_MODEisemail_onlyorboth - Verify all SMTP settings in
config.php - Confirm
SMTP_FROM_EMAILis a verified sender address with your mail provider - Check spam and junk folders for the first few test deliveries
Turnstile CAPTCHA not loading
- The site key is domain-locked — add your domain to the allowed list in the Cloudflare Turnstile dashboard
- For testing, use Cloudflare's test keys or clear both key fields in
config.phpto disable CAPTCHA
Language toggle not appearing
- The toggle only displays when two or more codes are listed in
LANG_ENABLED - Confirm the matching
lang/xx.phpfile exists for each language code in the array
Your Zenmove-powered site is ready to collect moving quote requests. Leads are routed according to your chosen mode, content is fully translatable through the language files, and the setup wizard can be re-run at any time by removing config.php and installed.lock.