LaraClassifier
A classified ads web application built on Laravel and Bootstrap. LaraClassifier is a modular, responsive CMS for online classifieds and listing platforms, with multi-language support, payment gateway add-ons, location-based listings, custom fields per category, and an admin panel with role-based permissions.
This documentation walks you through installation, common server-side errors, upgrade steps, and the configuration of mail, SMS, social login, payments, captcha, image processing, localization, backups, and more. Use the sidebar to jump to a topic.
System Requirements
Server
Before installing, make sure the following components are enabled on your server:
- PHP 8.3 or greater (with all default PHP functions enabled, including
exec(),escapeshellarg(), etc.) - MySQL 5.7+ (or MariaDB 10.3+) is required (with full privileges)
- BCMath PHP Extension
- Ctype PHP Extension
- cURL PHP Extension (version 7.34.0 or greater)
- DOM PHP Extension
- Fileinfo PHP Extension
- Filter PHP Extension
- Hash PHP Extension
- JSON PHP Extension
- Mbstring PHP Extension
- OpenSSL PHP Extension
- PCRE PHP Extension
- PDO PHP Extension
- Session PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
- GD PHP Extension (version 2.0+) or Imagick PHP Extension (version 6.5.7+)
- Zip PHP Extension (and
\ZipArchiveclass) - Rewrite Module Enabled
open_basedirmust be disabled in the PHP.ini
File & Folder Permissions
/bootstrap 775
/storage 775 (recursively)
Supported Web Servers
One of the following server types can be used to host the app:
- Apache: fully supported.
- Nginx: fully supported.
- LiteSpeed (or OpenLiteSpeed): permissions and firewall management need to be properly handled. LSCache is not supported.
- Varnish: the server cache management needs to be properly handled. Strong server configuration and programming knowledge are required.
Installation
Before starting the installation, check the system requirements first.
Install on Apache
- Create a new MySQL (or MariaDB) database from your cPanel (or similar hosting manager) using phpMyAdmin (or a similar tool). Add a user to manage the database with full privileges.
-
After creating the database, unzip the file you downloaded from CodeCanyon and upload the contents of the LaraClassifier folder to
your server root, usually
/path/to/www/,/path/to/html/,/path/to/httpdocs/or/path/to/public_html/.Important: Always use a desktop application like FileZilla to upload files via FTP, rather than web-based file managers, to avoid issues with corrupted or improperly uploaded files.Important: Make sure the .htaccess file got copied properly from the download to the main LaraClassifier folder on your server.This is what the files should look like on your server:
-
public_html/# or "www", "html", "httpdocs", "domain.tld"
- app/
- bootstrap/
- config/
- database/
- docs/
- extensions/
- lang/
- packages/
-
public/# may be the document root
- assets/
- dist/
- images/
- vendor/
- .htaccess# keep all hidden files
- index.php
- resources/
- routes/
- storage/
- tests/
- vendor/
- .htaccess# keep all hidden files
-
public_html/# or "www", "html", "httpdocs", "domain.tld"
- Go to the installation URL:
http://yourdomain.com/install. - Follow the web installation wizard.
Install on Nginx
- Create a new MySQL (or MariaDB) database from your cPanel (or similar hosting manager). Add a user to manage the database with full privileges.
-
Upload all the LaraClassifier package files to your server root and set your server configuration like this:
... root "/path/to/www/public"; ... location / { try_files $uri $uri/ /index.php?$query_string; } ...or
... root "/path/to/public_html/public"; ... location / { try_files $uri $uri/ /index.php?$query_string; } ...Check this link for more information about the Nginx server configuration.
- Restart Nginx.
- Go to the installation URL:
http://yourdomain.com/install. - Follow the web installation wizard.
Install on Localhost
- Create a local virtual host using a domain name (e.g.
http://mysite.localhost) instead ofhttp://localhost/mysite.- This can be easily done using Laravel Herd (macOS & Windows) or MAMP PRO (macOS & Windows) or Laragon (Windows only).
- Or with XAMPP (Windows, macOS & Linux):
- Restart your server.
- Create a new MySQL (or MariaDB) database. Add a user to manage the database with full privileges.
- Go to the installation URL:
http://mysite.localhost/install. - Follow the web installation wizard.
Installation Notes
- The script doesn't have an "install" folder. The installation is handled by a Controller.
- Loading times during the installation process may seem long, but this is by design: pause times of 1–2 seconds are used to avoid asynchronous execution issues across different server configurations.
Purchase Code (License Key)
Your purchase code, also called license key, proves that your copy of LaraClassifier is genuine. It is requested during installation, and again every time you activate a paid add-on or a paid theme.
Where the purchase code is used
- Web installer: the Site Info step asks for the purchase code of LaraClassifier itself.
- Admin panel → Settings → General → Application → Purchase Code: to add or replace it later.
/.envfile:PURCHASE_CODE=yourpurchasecode(equivalent to the setting above).- Admin panel → Add-ons and Admin panel → Themes: activating a paid add-on or a paid theme asks for that item’s own purchase code, not the one of LaraClassifier.
Where to find your purchase code
Our products are sold on three platforms. The way you receive your purchase code depends on where you bought the product.
| Platform / Marketplace | How you get the purchase code | Where to find it again |
|---|---|---|
| bedigit.com Store In-site purchase (Shop) |
Generated automatically when the order is paid, then sent by email, either in its own license email, or inside the order confirmation email. | My Account → My Licenses on bedigit.com |
| Gumroad | Created as soon as Gumroad notifies us of the sale, then sent in a separate email, in addition to the Gumroad receipt. | The license email, your Gumroad Library, and My Account → My Licenses on bedigit.com |
| Envato Market CodeCanyon |
Issued by Envato, not by us, and never sent by email: you download it yourself from your Envato account. | Envato account → Downloads → License certificate & purchase code |
1. bedigit.com Store (in-site purchase)
When you buy from the bedigit.com store:
- As soon as the order’s payment status becomes Paid, a license key is generated automatically for every licensed item in the order (one key per purchased unit: buying 3 units gives 3 distinct keys).
- The key is emailed to the address used on the order. Depending on the store configuration, it arrives either in a dedicated license email or inside the order confirmation email.
- The key is also stored in your account permanently: log in and go to My Account → My Licenses. Keys are masked in the list; open the license detail page to reveal and copy the full key.
- The same page lists the domains the license is activated on, and lets you deactivate a domain to free an activation slot (useful when you move the site to a new domain).
- Your invoice is available under My Account → My Orders.
2. Gumroad
When you buy from our Gumroad store, you receive two separate emails:
- The Gumroad receipt, sent by Gumroad, which gives you access to the product files.
- A license key email, sent by bedigit.com, which contains your purchase code. This email is generated as soon as Gumroad notifies us of the sale (Gumroad “ping”), so it usually arrives within a few seconds of the payment.
If the Gumroad product has Gumroad’s own license-key feature enabled, that key is reused as your purchase code and it is also visible in your Gumroad receipt and under Library → your purchase on gumroad.com. Otherwise a key is generated for you and delivered only by email.
3. Envato Market (CodeCanyon)
Envato purchase codes are issued and delivered by Envato Market. They are never emailed by us, so there is nothing to look for in your spam folder: you retrieve the code from your Envato account.
- Log in to your Envato / CodeCanyon account.
- Open the Downloads page.
- Find the item, open the Download dropdown, and choose License certificate & purchase code (PDF or text file).
- The purchase code is written in that certificate.
An Envato purchase code looks like this: 12345678-90ab-cdef-1234-567890abcdef (8-4-4-4-12 characters).
Official Envato article: Where Is My Purchase Code?
I did not receive (or I lost) my purchase code
- Search your mailbox for “license”, “purchase code” or the product name, and open your spam / junk folder. This solves the majority of cases for Store and Gumroad purchases.
- bedigit.com Store or Gumroad: log in to bedigit.com and open My Account → My Licenses. Every key ever issued to your account is listed there.
- Envato: open Downloads → License certificate & purchase code in your Envato account.
- Still stuck? Open a ticket on our Help Center with your order number (Store), Gumroad sale ID or buyer email (Gumroad), or Envato username and item name (Envato).
SSL / HTTPS
The protocol used by the website is driven by a single entry: APP_URL in the /.env file. Once your SSL certificate is installed on your
server, set it to the https address of your site:
APP_URL=https://domain.tld
With an https:// value, the application automatically:
- generates every link, asset and file URL (listings pictures, users avatars, logos…) with the
https://protocol, - redirects any request received over
http://to itshttps://equivalent, with a301status code.
There is nothing else to enable, no separate option in the /.env file and none in the Admin panel. Sites installed in a sub-directory simply
include it in the value (e.g. APP_URL=https://domain.tld/classifieds).
Behind a Load Balancer, Proxy or CDN
When the SSL certificate is handled upstream (load balancer, reverse proxy, Cloudflare…) and the traffic reaches PHP over plain HTTP, keep
APP_URL set to the https:// address. The application reads the X-Forwarded-Proto header sent by the proxy, so the
redirect is not triggered again on requests that are already secure for the visitor.
Reverting to HTTP
If the certificate expires or has to be removed, set APP_URL back to the http:// address of your site. The redirection and the
https:// links stop immediately: there is no other entry to revert.
- Always clear the application cache after changing
APP_URL, since cached pages and data hold absolute URLs generated with the previous protocol:php artisan cache:clear, or with the Clear Cache button of your Admin panel. - The
FORCE_HTTPSentry used by the previous versions is no longer read. If it is still present in your/.envfile, it can be removed safely.
Error 403
Error 403 on Apache
- Make sure that Apache's
mod_rewriteis enabled on your server. - Make sure that the
AllowOverrideApache directive is set toAllin your server'sapache2.conffile (or in the delegate file for apache configuration on your server). - Make sure that the
/.htaccessand the/public/.htaccessfiles are uploaded on your server.
Error 403 on Nginx
- If you have a 403 error on your Nginx environment, please check these articles to learn more about the Nginx configuration:
- If the error persists, contact your hosting provider for more information and to get suitable help.
Error 403 on LiteSpeed
This error is related to LiteSpeed (LiteSpeed Web Server) or similar servers like OpenLiteSpeed.
- If you receive error 403, this usually means the script's file contents are not yet called before the error occurs. You have to fix this on your server (by
contacting your hosting provider for suitable help).
NOTE: Usually this error is caused by wrong file permissions related to your hosting provider rules. See: - If the issue persists after fixing file permissions, you must disable
mod_securityon your server: - Otherwise, if restrictions cannot be properly configured, we strongly recommend moving to a classic web server.
Error 403 related to Firewalls
This error is related to services like Cloudflare, Imunify360, etc.
- This kind of service is often discreet and sometimes only blocks pages or static files (such as CSS or JS files). If pages display without CSS styles and in a disordered way, it is very likely that the protection service of your server has not been configured to authorize requests coming from the files of your new website. Review this configuration on your server or contact your host for suitable help.
- If you receive 403 errors after seeing a security page, this means a service like Cloudflare or Imunify360 is installed on your server and blocks some of the script's requests. Whitelist all the script's requests, or contact your hosting provider for suitable help.
- Otherwise, we strongly recommend adding all the script's files in the service's whitelist, or removing/disabling the service on your server to avoid request bans.
Upgrade to new versions
1. SSH Upgrade Method
- Put your website under maintenance from the Admin panel → System Info → Maintenance. Don't log out as an admin user.
- Clear the website cache from the Admin panel → System Info → Clear Cache.
- Download the latest version from CodeCanyon.
- Copy the
.zipfile to the root of your server (same place where files were uploaded during installation). - Rename this zip file to
laraclassifier.zipon the server. - Delete the
vendordirectory from your server (so there are no old unused files left from previous versions). - Use a terminal (console) to log into your website's root folder.
- Once in your website's root folder, run:
unzip -o laraclassifier.zip -x ".htaccess" -x "public/.htaccess" -x "public/dist/front/custom.css" - Ensure to never delete or replace the
/.envand the/storage/installedfiles. - Wait for the command to complete.
- (If you have installed any add-ons) update them to their latest version.
- Visit
https://domain.tld/upgradeand clickUpgrade Now. - Once the update completes, your website will go live automatically and you will be redirected back to the homepage.
2. Traditional Upgrade Method
- If you have made any CSS customization, back up your
/public/dist/front/custom.cssfile and overwrite its latest version after update. (If you didn't make any CSS customization, you can skip this step.) - If you have made any translations, back up your language files in the
/lang/folder and merge their content after update. (If you didn't make any translations, you can skip this step.)
- Put your website under maintenance from the Admin panel → System Info → Maintenance. Don't log out as an admin user.
- Clear the website cache from the Admin panel → System Info → Clear Cache.
- Download the latest version from CodeCanyon.
- Copy the
.zipfile to the root of your server (same place where files were uploaded during installation). - Delete the
vendordirectory from your server (so there are no old unused files left from previous versions). - Extract the
.zipfile into the website's root folder by overwriting old files. Ensure to never delete or replace the/.envand the/storage/installedfiles. - (If you have installed any add-ons) update them to their latest version.
- Visit
https://domain.tld/upgradeand clickUpgrade Now(make sure you are logged in as admin). - Once the update completes, your website will go live automatically and you will be redirected back to the homepage.
Upgrade Notes
- See Purchase Code (License Key) to find your code, whether you bought on the bedigit.com Store, on Gumroad or on Envato Market.
- Add a new entry for your purchase code in the
/.envfile:PURCHASE_CODE=yourpurchasecode, or log in to your Admin panel → Settings → General → Application → Purchase Code and edit the line to add your Purchase Code.
- Exception to v7.1.0: Upload/replace the
/storage/app/public/app/default/folder on your server before or after running the upgrade URL. - v5.1+: Activate all purchased add-ons using their purchase code from the Admin panel → Add-ons.
- If your website is running on v4.8 or lower: Before starting the upgrade, move all contents of the
/public/uploads/directory to/storage/app/public/. - If your website is running on v4.3 or lower, upgrading to v4.4:
- You will lose all your
Admin panel → Settingsentries and will need to set up your website again. - You will lose all current internal messages (which were also sent by email to their receivers).
- If you re-activate the listing review (approval) option, all existing listings will be approved automatically.
- You will need to (uninstall and) re-install all the script's add-ons after the upgrade.
- You will lose all add-on data and settings (except payment add-on transaction entries).
- You will lose all your
- If your website is running on v3.4 or lower: Before starting the upgrade, you have to:
- Add this entry:
APP_VERSION=X.Xin the/.envfile (e.g.APP_VERSION=3.4if your current version is 3.4). - Add a new entry for your purchase code in the
/.envfile:PURCHASE_CODE=yourpurchasecode. - (If exists) change
DB_PREFIX=toDB_TABLES_PREFIX=in the/.envfile. - (If exists) remove the
SESSION_DRIVER=fileandSESSION_DOMAIN=.mysite.comentries from the/.envfile.
- Add this entry:
Mail Sending (SMTP)
Short for Simple Mail Transfer Protocol, SMTP is a protocol for sending e-mail messages between servers. Most e-mail systems that send mail over the Internet use SMTP to send messages from one server to another; the messages can then be retrieved with an e-mail client using either POP or IMAP. In short, SMTP is used to send emails to your site users.
You can use any SMTP service provider:
- Your own hosting SMTP server
- Mailgun
- Postmark
- Amazon SES
- Sparkpost
- Gmail, Yahoo, or another e-mail provider
Own SMTP Server
Admin panel setup
- Go to your Admin panel → Settings → Mail.
- Set Mail Mailer, Mail Host, Mail Port, Mail Encryption, Mail Username and Mail Password.
- Save your changes.
Or use the /.env file
- Log into your FTP account.
- Open and edit
/.env. - Paste your SMTP server details:
MAIL_MAILER=smtp
MAIL_HOST=your-mail-host
MAIL_PORT=your-mail-port
MAIL_USERNAME=your-mail-username
MAIL_PASSWORD=your-mail-password
MAIL_ENCRYPTION=your-mail-encryption
- Replace
your-mail-host,your-mail-port,your-mail-username,your-mail-password, andyour-mail-encryption. - Save and upload the file.
/.env file settings override those of the admin panel. Don't forget to change your sender email address in Admin
panel → Settings → General → Mail → Email Sender to match an allowed
email address of your SMTP server.
Mailgun
Admin panel setup
- Go to your Admin panel → Settings → Mail.
- Set Mail Mailer, Mailgun Domain, Mailgun Secret, Mail Host, Mail Port, Mail Encryption, Mail Username, and Mail Password.
- Save your changes.
Or use the /.env file
- Log into your FTP account.
- Open and edit
/.env. - Remove all current Mail configuration variables.
- Add the lines below:
MAIL_MAILER=mailgun
MAILGUN_DOMAIN=your-mailgun-domain
MAILGUN_SECRET=your-mailgun-secret
MAILGUN_ENDPOINT=api.mailgun.net
MAIL_HOST=your-mailgun-smtp-host
MAIL_PORT=your-mailgun-smtp-port
MAIL_USERNAME=your-mailgun-smtp-username
MAIL_PASSWORD=your-mailgun-smtp-password
MAIL_ENCRYPTION=your-mailgun-smtp-encryption
/.env file settings override those of the admin panel. Don't forget to change your sender email address in Admin
panel → Settings → General → Mail → Email Sender to match an allowed
email address of your SMTP server.
Postmark
Admin panel setup
- Go to your Admin panel → Settings → Mail.
- Set Mail Mailer, Postmark Token, Mail Host, Mail Port, Mail Encryption, Mail Username, and Mail Password.
- Save your changes.
Or use the /.env file
- Log into your FTP account.
- Open and edit
/.env. - Remove all current Mail configuration variables.
- Add the lines below:
MAIL_MAILER=postmark
POSTMARK_TOKEN=your-postmark-token
MAIL_HOST=your-postmark-smtp-host
MAIL_PORT=your-postmark-smtp-port
MAIL_USERNAME=your-postmark-smtp-username
MAIL_PASSWORD=your-postmark-smtp-password
MAIL_ENCRYPTION=your-postmark-smtp-encryption
/.env file settings override those of the admin panel. Don't forget to change your sender email address in Admin
panel → Settings → General → Mail → Email Sender to match an allowed
email address of your SMTP server.
Amazon SES
Admin panel setup
- Go to your Admin panel → Settings → Mail.
- Set Mail Mailer, SES Key, SES Secret, and SES Region.
- Save your changes.
Or use the /.env file
- Log into your FTP account.
- Open and edit
/.env. - Remove all current Mail configuration variables.
- Add the lines below:
MAIL_MAILER=ses
SES_KEY=your-ses-key
SES_SECRET=your-ses-secret
SES_REGION=your-ses-region
/.env file settings override those of the admin panel. Don't forget to change your sender email address in Admin
panel → Settings → General → Mail → Email Sender to match an allowed
email address of your SMTP server.
Sparkpost
Admin panel setup
- Go to your Admin panel → Settings → Mail.
- Set Mail Mailer, Sparkpost Secret, Mail Host, Mail Port, Mail Encryption, Mail Username, and Mail Password.
- Save your changes.
Or use the /.env file
- Log into your FTP account.
- Open and edit
/.env. - Remove all current Mail configuration variables.
- Add the lines below:
MAIL_MAILER=sparkpost
SPARKPOST_SECRET=your-sparkpost-secret
MAIL_HOST=your-sparkpost-smtp-host
MAIL_PORT=your-sparkpost-smtp-port
MAIL_USERNAME=your-sparkpost-smtp-username
MAIL_PASSWORD=your-sparkpost-smtp-password
MAIL_ENCRYPTION=your-sparkpost-smtp-encryption
/.env file settings override those of the admin panel. Don't forget to change your sender email address in Admin
panel → Settings → General → Mail → Email Sender to match an allowed
email address of your SMTP server.
SMS APIs
This functionality allows verifying user mobile numbers and lets sellers be contacted by SMS.
How to set up
- Admin panel → Settings → Mail → SMS Driver to set the default SMS API.
- You can use both Vonage or Twilio as your SMS provider API.
Vonage
Admin panel setup
- Go to your Admin panel → Settings → SMS.
- Set Vonage Key, Vonage Secret, and Vonage From.
- Save your changes.
Or use the /.env file
VONAGE_KEY=your-vonage-key
VONAGE_SECRET=your-vonage-secret
VONAGE_SMS_FROM=your-sender-number
Twilio
Admin panel setup
- Go to your Admin panel → Settings → SMS.
- Set Twilio Account SID, Twilio Auth Token, and Twilio From.
- Save your changes.
Or use the /.env file
TWILIO_ACCOUNT_SID=your-twilio-account-sid
TWILIO_AUTH_TOKEN=your-auth-token
TWILIO_FROM=your-sender-number
Other SMS Configurations
- Admin panel → Settings → SMS → Enable Phone Verification to enable/disable mobile phone number verification.
- Admin panel → Settings → SMS → Enable SMS Message to enable/disable SMS sending between users.
Social Login
APP_URL in /.env matches your site URL. It should be set automatically, but you might need to do it manually in some rare cases.
- Register for a regular Facebook account, if you don't already have one.
- Open developers.facebook.com and Create a New App.
- Get the new app settings.
Now, set up your admin panel:
- Go to your Admin panel → Settings → Social Authentication.
- For Facebook: set Facebook Client ID and Facebook Client Secret.
- Save your changes.
Or place all the config values or API keys in the /.env file:
FACEBOOK_CLIENT_ID=your-facebook-client_id
FACEBOOK_CLIENT_SECRET=your-facebook-client_secret
- The
/.envfile settings override those of the admin panel. - The OAuth redirect URI is:
APP_URL/auth/connect/facebook/callback. - Replace
APP_URLwith its value (from/.env). Example:https://domain.tld/auth/connect/facebook/callback.
- Register for a regular LinkedIn account, if you don't already have one.
- Open linkedin.com/developer/apps and Create a New App.
- Get the new app settings.
Now, set up your admin panel:
- Go to your Admin panel → Settings → Social Authentication.
- For LinkedIn: set LinkedIn Client ID and LinkedIn Client Secret.
- Save your changes.
Or place all the config values or API keys in the /.env file:
LINKEDIN_CLIENT_ID=your-linkedin-client_id
LINKEDIN_CLIENT_SECRET=your-linkedin-client_secret
- The
/.envfile settings override those of the admin panel. - The OAuth redirect URI is:
APP_URL/auth/connect/linkedin/callback. - Replace
APP_URLwith its value (from/.env). Example:https://domain.tld/auth/connect/linkedin/callback.
Twitter (OAuth 2.0)
- Register for a regular Twitter account, if you don't already have one.
- Open apps.twitter.com and Create a New App.
- Get the new app settings.
Now, set up your admin panel:
- Go to your Admin panel → Settings → Social Authentication.
- For Twitter: set Twitter Client ID and Twitter Client Secret.
- Save your changes.
Or place all the config values or API keys in the /.env file:
TWITTER_OAUTH_2_CLIENT_ID=your-twitter-oauth-2-client_id
TWITTER_OAUTH_2_CLIENT_SECRET=your-twitter-oauth-2-client_secret
- The
/.envfile settings override those of the admin panel. - The OAuth redirect URI is:
APP_URL/auth/connect/twitter-oauth-2/callback. - Before configuring your Twitter app in the script, change its Permissions (on developer.twitter.com) by enabling the Request email address from users option.
- Replace
APP_URLwith its value (from/.env). Example:https://domain.tld/auth/connect/twitter-oauth-2/callback.
Twitter (OAuth 1.0)
- Register for a regular Twitter account, if you don't already have one.
- Open apps.twitter.com and Create a New App.
- Get the new app settings.
Now, set up your admin panel:
- Go to your Admin panel → Settings → Social Authentication.
- For Twitter: set Twitter Client ID and Twitter Client Secret.
- Save your changes.
Or place all the config values or API keys in the /.env file:
TWITTER_CLIENT_ID=your-twitter-client_id
TWITTER_CLIENT_SECRET=your-twitter-client_secret
- The
/.envfile settings override those of the admin panel. - The OAuth redirect URI is:
APP_URL/auth/connect/twitter/callback. - Before configuring your Twitter app in the script, change its Permissions (on developer.twitter.com) by enabling the Request email address from users option.
- Replace
APP_URLwith its value (from/.env). Example:https://domain.tld/auth/connect/twitter/callback.
Google (deprecated)
- Register for a regular Google account, if you don't already have one.
- Open console.developers.google.com and Create a New App.
- Get the new app settings.
Now, set up your admin panel:
- Go to your Admin panel → Settings → Social Authentication.
- For Google: set Google Client ID and Google Client Secret.
- Save your changes.
Or place all the config values or API keys in the /.env file:
GOOGLE_CLIENT_ID=your-google-client_id
GOOGLE_CLIENT_SECRET=your-google-client_secret
- The
/.envfile settings override those of the admin panel. - The OAuth redirect URI is:
APP_URL/auth/connect/google/callback. - Replace
APP_URLwith its value (from/.env). Example:https://domain.tld/auth/connect/google/callback.
Google Maps
You have to activate Google Maps Embed API and Google Maps JavaScript API in your Google Console.
Admin panel setup
- Go to your Admin panel → Settings → Others.
- Set the Google Maps key.
- Save your changes.
Or use the /.env file
GOOGLE_MAPS_JAVASCRIPT_API_KEY=your-google-maps-javascript-api-key
Captcha
Recaptcha
reCAPTCHA is a free CAPTCHA service that helps protect your site against spam, malicious registrations, and other forms of attacks where computers try to disguise themselves as humans. reCAPTCHA comes in the form of a widget that you can easily add to your blog, forum, or registration.
How to set up
- Visit google.com/recaptcha/admin.
- Follow the steps by selecting the reCAPTCHA version. Get your site key and secret key.
Admin panel setup
- Go to Admin panel → Settings → Security.
- Enable the feature from the Enable reCAPTCHA field.
- Set reCAPTCHA version, reCAPTCHA site key, and reCAPTCHA secret key.
- Save your changes.
Or use the /.env file
RECAPTCHA_VERSION=your-recaptcha-keys-version
RECAPTCHA_SITE_KEY=your-recaptcha-site_key
RECAPTCHA_SECRET_KEY=your-recaptcha-secret_key
- Replace
your-recaptcha-keys-versionby v2 or v3. - Replace
your-recaptcha-site_keyandyour-recaptcha-secret_keyby your keys.
/.env file settings override those of the admin panel.
Image Processing
The script supports two image processors:
- GD
- Imagick
GD is a basic image-resizing driver for PHP and is suited only to basic websites. It has memory issues and doesn't perform well at all conditions. For pro-photography or higher quality images, prefer Imagick. Make sure your server has Imagick installed.
Imagick
- Log into your FTP account.
- Open and edit
/.env. - Find:
IMAGE_DRIVER=gd - Change it to:
IMAGE_DRIVER=imagick
Localization
How can I enable Geolocation?
- Visit Admin panel → Settings → Localization.
- Check the Enable Geolocation field.
- Select a GeoIP Driver. By selecting a GeoIP driver/service, its website link (and if required, API/license key/token fields) will be shown.
- (If available) get the GeoIP service API key/token (or license key) and insert it in the geolocation settings form.
- By selecting maxmind.com (Database) as GeoIP service:
- Go to dev.maxmind.com/geoip/geoip2/geolite2/.
- Download the latest binary version of the
GeoLite2-City.mmdbdatabase. - Extract it in the Maxmind database folder at
/storage/database/maxmind/: resulting in/storage/database/maxmind/GeoLite2-City.mmdb. You can replace the current file (if it exists) to update the Maxmind database.
Note: The lite (free) versions of the Maxmind databases are not accurate. See the MaxMind GeoLite FAQ for more information. - If you want to redirect users to their country's website based on their IP address, leave Default Country blank.
Important: When you reset this option by setting a default country, clear all your browser's session and cookies (and other data like hosted-app data and cache) to see the effect of the change.
SVG Maps
The script uses Simplemaps SVG maps (simplemaps.com/resources/svg-maps). Maps for some countries (Kosovo, some islands, etc.) are not available.
For some countries you may need to edit the SVG files to change state or province names. All SVG map files are in /public/images/maps/.
There are free (commercial use) and paid licenses, so you can buy a license for some missing SVG maps and hire a local developer to add them for your website (based on the current code). You can also disable SVG maps from your Admin panel.
Countries Data
Geonames Database
The script uses the Geonames database (geonames.org, their most structured database) for cities and administrative divisions data.
This database is not complete for any country. You can update it from your Admin panel → International → Countries → Admin. Division x or Cities by adding new data (respecting the Geonames data format), modifying existing data, or deleting entries.
From v3.1+ you have to update the countries locations database from your Admin panel → International → Countries.
The script does not support certain countries (Kosovo, some islands, etc.) automatically because their data is not reliable. You will need to add the missing or incorrect data manually from your admin panel.
Your own database
If you want to use your own data instead of the Geonames data, you can delete all Geonames data by using phpMyAdmin to flush the cities,
subadmin1, and subadmin2 tables before adding new data from the Admin panel.
Languages
How can I add new languages?
- Go to your Admin panel → Languages.
- Click Add language.
- Go to the translation folder at
/lang. - The script will already have duplicated
/lang/en/to/lang/<code>/.
- Don't forget to translate the database translatable entries from the Admin panel (Listings → Categories, Plans, Report Type, etc.).
- If needed, duplicate (manually, in the same directory) or edit the date language file in
/vendor/nesbot/carbon/src/Carbon/Lang/.
How can I change the default language?
- Go to your Admin panel → Languages.
- Create a new language entry and check the Default field. Or edit an existing language and check Default.
- Save your changes.
/config/app.php and change the fallback_locale value
to your default language code (e.g. de). Save your files on your server.
How can I edit translations?
- Go to the translation folder at
/lang/(each language has its language code as folder name). - Open the folder of the language you wish to translate and edit its files (e.g.
global.phpcontains 90% of the site's texts,mail.phpfor email contents, etc.). - To translate a file, change the values, not the keys, of the PHP array.
- Save your files on your server.
How can I disable languages?
- Go to your Admin panel → Languages.
- Select a language and edit it.
- Uncheck Active and save.
How can I delete languages?
- Go to your Admin panel → Languages.
- Select a language and delete it.
/lang/<code> will also be removed.
Plans & Limits
The number of listings a user can have, the number of pictures per listing, and how long an activated listing stays online are defined in two layers: the free tier (what every non-paying user and every non-promoted listing gets) and the paid plans stacked on top of it.
| Limit | Setting | Free tier: replaced by (when active) | Paid plans applied on top |
|---|---|---|---|
| Listings Limit per User | Admin panel → Settings → Listing Form | Free subscription plan | The user's paid subscription plan |
| Pictures Limit per Listing | Admin panel → Settings → Listing Form | Free promotion and/or free subscription plan | The author's paid subscription plan, the listing's paid promotion plan, and the plan selected while posting |
| Activated Listings Expiration (Publication Duration) | Admin panel → Settings → Cron | Free promotion and/or free subscription plan | The author's paid subscription plan and the listing's paid promotion plan |
1. The free tier (free plans)
- A plan whose price is
0.00is the free plan of its type (only one per type, or one per currency when plans are paid in the country currency). - When a free plan is active and one of its limit fields is filled, that value replaces the related setting for all the users without a paid subscription and all the listings without a paid plan (e.g. listings posted without selecting a plan, or by selecting the free plan).
- Leave a free plan's field empty (or deactivate the plan) to keep using the setting.
- When both free plans (promotion and subscription) define the same limit, the highest value is used.
- The other options of a free plan (promotion duration, ribbon, badge, external ads, etc.) have no effect, and no payment is made.
2. The paid plans
- A valid paid plan (active payment, within its validity dates) replaces the free tier value with its own value.
- When several plans apply at the same time (free tier, a subscription and a promotion), the highest value is used. So buying a plan can only extend what a user or listing already gets, never reduce it.
- A paid plan's limit must be at least the free tier value: this is checked when the plan is saved.
- An empty paid plan field means "same as the free tier".
- When the paid plan expires, the free tier values apply again.
- A payment made for a free plan (e.g. approved through the Offline Payment add-on) is not a paid plan: the free tier applies.
Example
With the Activated Listings Expiration setting at 30 days, an active free promotion plan with a publication duration of 45
days, and a paid subscription plan with 60 days:
- A listing of a user without a subscription is archived after 45 days (the free plan replaces the setting).
- A listing of a subscribed user is archived after 60 days, and after 90 days if it is also promoted with a paid promotion plan of
90days.
- The hints of the related fields (on the plans form and on the Listing Form and Cron settings pages) show the current values, and tell when a setting is currently replaced by a free plan.
- The publication duration is applied by the Listings Purge command: see Cron Job.
- More information: How Plan Limits Work.
Cron Job
The application relies on the Laravel task scheduler for its periodic maintenance: purging expired listings, sending saved-search alerts, cleaning up cache files, taking backups, etc. Without the cron job below, none of these tasks run, and among other things the cache files are never cleaned up (see Cache & Disk Space).
How can I start the Scheduler?
Add the following Cron entry to your server. It must run every minute:
* * * * * cd /path/to/public_html && {PHP_BIN_PATH} artisan schedule:run >> /dev/null 2>&1
For shared hosting (when the cron tool only accepts a file path), use:
* * * * * {PHP_BIN_PATH} /path/to/public_html/utils/schedule-run.php >> /dev/null 2>&1
This Cron will call the Laravel command scheduler every minute. When schedule:run is executed, Laravel evaluates your scheduled tasks and runs the ones that
are due. Running it every minute doesn't mean that the tasks run every minute: each task keeps its own frequency (see the table below).
{PHP_BIN_PATH}: the PHP CLI binary used by your website's PHP version, e.g./usr/bin/php8.3,/usr/bin/php,/usr/local/bin/php. Runwhich phpover SSH to find it. On cPanel, it is often/usr/local/bin/phpor/opt/cpanel/ea-php83/root/usr/bin/php./path/to/public_html/: replace this path with your real path (the folder that contains theartisanfile).- On cPanel: go to Cron Jobs, select Once Per Minute (* * * * *) in Common Settings,
and paste the command (without the leading
* * * * *). - On Plesk: go to Scheduled Tasks, add a task of type Run a command with the cron style
* * * * *. - Don't hesitate to ask your hosting provider for more information.
What does the Scheduler run?
| Task | Command | Frequency | Condition |
|---|---|---|---|
| Listings Purge (auto-archives and deletes listings after expiration) | listings:purge | Every hour | Always |
| Saved-search alerts sending | alerts:send-notifications | Every hour | Always |
| Expired password-reset tokens clean up | auth:clear-resets | Every 15 minutes | Always |
| Cache Purge (deletes the expired and outdated cache files) | expired-cache:purge | Every day at 5:00 | Always |
| Theme CSS cache clean up | theme:prune-cache | Every day at 5:15 | Always |
| Full data cache clear | cache:clear | Every Sunday at 6:00 and 6:15 | Unless disabled (see below) |
| Views cache clear | view:clear | Every Sunday at 6:00 | Only when enabled (see below) |
| Backups | backup:run / backup:clean | As configured | Admin panel → Settings → Backup |
| Queue worker ("poor man's queue") | queue:scheduled-work | As configured | Database or Redis queue, and enabled under Admin panel → Settings → Optimization |
The times are evaluated in the website's time zone.
Scheduler options (/.env)
CACHE_MANAGER_FORCE_CLEAN_UP=false: disables the weekly full data cache clear (not recommended). The daily Cache Purge still runs.VIEW_CACHE_AUTO_CLEAN_UP=true: enables the weekly views cache clear (disabled by default).
How can I check that the cron job works?
Over SSH, from the website's root folder:
php artisan schedule:listlists the scheduled tasks with their next due date.php artisan schedule:runruns the tasks due now, exactly as the cron job does.php artisan expired-cache:purgeruns the Cache Purge immediately and reports what it deleted.
Without SSH access, add a temporary cron job that writes its output to a file (e.g. replace >> /dev/null with
>> /path/to/public_html/storage/logs/cron.log), wait a few minutes, then check that file. Revert the change once done.
More information about Cron Job
How does the Listings Clear command work?
After setting it up to run every hour (for example), there are 2 cases to consider:
1. Regular Listings
Configure these options under Admin panel → Settings → Cron:
- Unactivated Listings Expiration: after this time (in days), unactivated listings are deleted.
- Activated Listings Expiration: after this time (in days), activated listings are archived. An active free plan with a publication duration replaces this value (see Plans & Limits).
- Archived Listings Expiration: after this time (in days), archived listings are removed.
2. Premium / Paid Listings
- After the Plan duration (set under Admin panel → Plans → [EDIT] → Duration), Premium Listings become Regular Listings.
- An activated listing is archived after its publication duration: the highest value between the free tier (free plans or setting), the author's
paid subscription plan and the listing's paid promotion plan (see Plans & Limits).
Note:
- For site owners that have installed the Offline Payment add-on, pushed listings as premium (manual promotions of listings from the admin panel) will never expire. You will need to un-feature them (remove the promotion manually) first.
- Then, the Regular Listings rules (described in #1) are applied to clear the website database.
Cache & Disk Space
To speed up the website, data read from the database (listings, categories, cities, pages, settings, etc.) is cached. Configure the caching system under Admin panel → Settings → Optimization → Data Caching System:
- Caching Driver: where the cached data is stored.
File(default) stores it in/storage/framework/cache/data/;RedisandMemcachedstore it in memory;Nonedisables the cache (not recommended). - Cache Expiration Time: how long (in seconds) a cached item is kept, e.g.
86400for 24 hours.
How the File driver uses the disk
With the File driver, each cached item is a file. When some data is modified (a listing is posted or edited, a category is changed, etc.), the
related cached items become outdated and are replaced by new files. The files of the outdated items are deleted:
- Right away, when the data is modified (up to 1000 files at a time, to keep the admin and front forms fast).
- Otherwise, by the daily Cache Purge task of the Scheduler, which also deletes the expired files.
- And every week, by the full data cache clear of the Scheduler.
With a working cron job, the size of the cache directory stays stable: it grows with the number of pages visited during the cache expiration time, and goes back down on each clean up.
File driver.
The cache directory is too big: how can I get the disk space back?
- Clear the cache: Admin panel → System Info → Clear Cache, or over SSH:
php artisan cache:clear. This is safe: the cache is rebuilt automatically as pages are visited. - If the directory is really huge and the command times out, you can also delete the content of
/storage/framework/cache/data/manually (keep thedatafolder itself). - Make sure the cron job is configured, so that it doesn't happen again.
To check the size of the cache directory over SSH: du -sh storage/framework/cache/data
Recommendations
- If Redis is available on your server, prefer the
Redisdriver: it is faster, uses no disk space, and manages the cache expiration by itself. - Don't set a very long Cache Expiration Time with the
Filedriver: the longer the expiration, the more files are kept on the disk. Between 1 hour (3600) and 24 hours (86400) is a good range for most websites.
Backup
Before using this feature, set your MySQL dump binary path with the variable DB_DUMP_BINARY_PATH in /.env.
Example with MAMP on macOS: DB_DUMP_BINARY_PATH=/Applications/MAMP/Library/bin/. Set only the path, without mysqldump.
If local disk is used, the backups are stored on your server in /storage/backups/.
/storage/backups/ directory is NOT the MySQL dump binary (mysqldump) path. If you don't know your server's
mysqldump path, contact your host for more information.
Manual Backup
Go to Admin panel → Backups to make backups manually.
Automatic Backup
Go to Admin panel → Settings → Backup to schedule backups and their clearing-up policy.
Backup Storage
Go to Admin panel → Settings → Backup to select a storage type for the backups.
For local storage, select Local Only and save the form. For cloud storage, select Cloud Only or Local and Cloud and save the form.
Local Only: backup is stored on the website server only.Cloud Only: backup is stored on the cloud storage only.Local and Cloud: backup is stored both on the website server and on the cloud storage.
Cloud Storage
FTP
Add the config below in your /.env file and set FILESYSTEM_CLOUD=ftp:
FILESYSTEM_CLOUD=ftp
FTP_HOST=your-ftp-host
FTP_USERNAME=your-ftp-username
FTP_PASSWORD=your-ftp-password
FTP_PORT=21
FTP_ROOT=/path/to/storage/root/
FTP_PASSIVE=true
FTP_SSL=true
FTP_TIMEOUT=30
SFTP
Add the config below in your /.env file and set FILESYSTEM_CLOUD=sftp:
FILESYSTEM_CLOUD=sftp
SFTP_HOST=your-sftp-host
SFTP_USERNAME=your-sftp-username
SFTP_PASSWORD=your-sftp-password
SFTP_SSH_PRIVATE_KEY=
SFTP_HOST_FINGERPRINT=
SFTP_MAX_TRIES=
SFTP_PASSPHRASE=
SFTP_PORT=22
SFTP_ROOT=/path/to/storage/root/
SFTP_TIMEOUT=30
Amazon S3
Add the config below in your /.env file and set FILESYSTEM_CLOUD=s3:
FILESYSTEM_CLOUD=s3
AWS_ACCESS_KEY_ID=your-s3-access-key
AWS_SECRET_ACCESS_KEY=your-s3-secret-key
AWS_DEFAULT_REGION=your-s3-region-code
AWS_BUCKET=your-s3-bucket
AWS_URL=
AWS_ENDPOINT=
AWS_USE_PATH_STYLE_ENDPOINT=
Dropbox
Add the config below in your /.env file and set FILESYSTEM_CLOUD=dropbox:
FILESYSTEM_CLOUD=dropbox
DROPBOX_ROOT=path/to/storage/root
DROPBOX_AUTHORIZATION_TOKEN=your-dropbox-authorization-token
DigitalOcean
Add the config below in your /.env file and set FILESYSTEM_CLOUD=digitalocean:
FILESYSTEM_CLOUD=digitalocean
DIGITALOCEAN_KEY=your-s3-access-key
DIGITALOCEAN_SECRET=your-s3-secret-key
DIGITALOCEAN_REGION=your-s3-region-code
DIGITALOCEAN_BUCKET=your-s3-bucket
DIGITALOCEAN_URL=
DIGITALOCEAN_ENDPOINT=
DIGITALOCEAN_USE_PATH_STYLE_ENDPOINT=
DIGITALOCEAN_FOLDER=
DIGITALOCEAN_CDN_ENDPOINT=
API
By default, the API uses an access token set in /.env with the variable APP_API_TOKEN=. Its value needs to be added in the header of all API
requests with X-AppApiToken as key.
The front end of the script consumes the API via cURL (through the Laravel HTTP Client / Guzzle), while the admin panel communicates directly with the database.
- Set a configuration that authorizes all requests with
https://yourdomain.tld/api/as URL base. - If a proxy is needed to communicate with your server, set it with its port separated by
:in/.envwith the variableAPP_API_PROXY=:APP_API_PROXY=proxy-host:proxy-portAPP_API_PROXY=proxy-ip-address:proxy-portAPP_API_PROXY=http://username:password@proxy-ip-address:proxy-port
- Only the OfflinePayment and Watermark add-ons are stateless, so they can be used with the API.
- All other add-ons cannot be used with the API, even though they continue to work with the web client.
How To
How is user registration managed?
When options like Email Address Verification (Admin panel → Settings → Mail) or Enable Phone Verification (Admin panel → Settings → SMS) are enabled, users must verify their email address or mobile phone number accordingly. Users cannot log in until they complete the verification process.
- If only Email Address Verification is enabled, the user can log in once they verify their email address.
- If only Enable Phone Verification is enabled, the user can log in once they verify their phone number via the SMS code.
- If both options are enabled, the user must verify both email and phone before they can log in.
- If neither option is enabled, the user is automatically logged in after registration and can log in without any verification.
How are ads/listings published?
- Admin Approval Not Required
When options like Email Address Verification or Enable Phone Verification are enabled, users must verify their email address or mobile phone number accordingly. Ads will appear in the "Pending Approval" section until users complete verification.
- If only Email Address Verification is enabled, the ad is published once the user verifies their email address.
- If only Enable Phone Verification is enabled, the ad is published once the user verifies their phone number via the SMS code.
- If both options are enabled, the user must verify both email and phone for the ad to go public.
- If neither option is enabled, the ad goes public on the website after publication, without any verification.
- Admin Approval Required
When the Allow listings to be reviewed by Admins option (Admin panel → Settings → Listing Form) is enabled, ads remain in the "Pending Approval" section even after users verify their email and/or phone. These ads require admin approval to be published. Once approved by the admin, the ad goes live.
Important: When a user selects a promotion plan to publish an ad, its publication will bypass admin approval after payment (i.e. the ads will go public after promotion plan payment). More information about plan payments here.
How can I set the default country?
- Go to your Admin panel → Settings → Localization and set Default Country with your country code (only ISO alpha-2 codes are accepted). From v2.x or above the script sets the default country during installation.
How can I set the default currency?
- The default currency is that of the current country, except the Plan's currency, which you set from Admin panel → Settings → Plans.
How can I set up the plans?
- Go to your Admin panel → Plans.
- Select a plan and edit it.
- You can add new plans or delete current plans in the latest version.
- To understand how the free and paid plans replace the limit settings, see Plans & Limits.
- More information: Configuring the Plans.
How can I set up the advertising code (e.g. AdSense)?
- Go to your Admin panel → Advertising.
- Edit the top and bottom code.
- The code will be displayed on the search result pages and the listing page.
How can I set up reCAPTCHA?
- Go to your Admin panel → Settings → Security.
- Turn ON or OFF Enable reCAPTCHA.
- Set reCAPTCHA public key and reCAPTCHA private key.
- Save your changes.
Please see more features by visiting Admin panel → Settings.
Recover from an Admin Lockout
If a value saved from the admin panel prevents you from signing back in (e.g. a wrong reCAPTCHA key, an unreachable SMTP host, a queue driver pointing at a backend that no longer exists, etc.), you do not need to touch the database by hand. LaraClassifier ships with two complementary recovery levers.
Option 1: Force .env values (temporary bypass)
Add a SETTINGS_FORCE_ENV entry to your /.env file listing the settings group(s) whose database values should be ignored at boot. The app will then read those settings from .env (or the config/ defaults) instead of from the database, letting you boot the application again and reach the admin panel.
# Examples (in /.env)
SETTINGS_FORCE_ENV=security # ignore DB security settings (e.g. CAPTCHA lockout)
SETTINGS_FORCE_ENV=mail # ignore DB mail settings (broken SMTP creds)
SETTINGS_FORCE_ENV=queue,security # ignore multiple groups at once
SETTINGS_FORCE_ENV=all # ignore every DB-side override (last resort)
Available group names:
general: app name, dates, Google Maps API keys, cookie consent togglecache: cache driver (file, Redis, Memcached) and its parametersqueue: queue driver (sync, database, Redis, SQS) and its parameterslocale: default language, date / number formatsmail: SMTP driver, host, credentials, From addresssms: Twilio / Vonage credentialssecurity: reCAPTCHA / hCaptcha keys, login throttlingsocial_auth: Facebook / Google / LinkedIn / Twitter OAuth keysbackup: backup destination, schedule, retention
After editing .env, clear the config cache:
php artisan config:clear
SETTINGS_FORCE_ENV is a temporary bypass. The bad row is still in your settings table; it will start being used again as soon as you remove the .env entry. Once you've regained access, fix the offending value from the admin panel (or via Option 2 below), then remove SETTINGS_FORCE_ENV from .env so future admin saves take effect again.
Option 2: Reset a setting from the CLI (permanent)
The settings:reset Artisan command rewrites a single setting row directly in the database, exactly as if the admin had saved the value from the panel. It is the correct way to permanently fix a bad value, after running it you can (and should) remove any matching SETTINGS_FORCE_ENV entry from .env.
# Disable a boolean setting (the default value for *_enabled keys is "0")
php artisan settings:reset captcha_enabled
# Set an explicit value
php artisan settings:reset queue_driver --value=sync
php artisan settings:reset mail_driver --value=log
php artisan settings:reset optimization_cache_driver --value=file
The command will:
- Show you the current value of the setting and the new value it is about to write.
- Ask for confirmation before saving.
- Preserve the row's settings group (so the value stays in the same admin sidebar tab); if the row does not yet exist, it is created in the
generalgroup. - Trigger the regular save side effects (env-mirror to
/.envfor queue / cache / SMS keys, cache regeneration, etc.) so the change takes effect immediately.
Common recovery recipes:
| Symptom | Command |
|---|---|
| Locked out by a broken CAPTCHA | php artisan settings:reset captcha_enabled |
| Broken SMTP credentials | php artisan settings:reset mail_driver --value=log |
| Queue driver pointing at a dead backend | php artisan settings:reset queue_driver --value=sync |
| Cache driver pointing at an unreachable Memcached / Redis | php artisan settings:reset optimization_cache_driver --value=file |
php artisan itself fails because of the bad setting), start by running Option 1 to bring the app back up, then run Option 2 to fix the row, then remove the SETTINGS_FORCE_ENV line.
Credits
- Laravel: laravel.com
- MaxMind: maxmind.com
- GeoNames: geonames.org
- Simplemaps: simplemaps.com
- and more…