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:

File & Folder Permissions

/bootstrap        775
/storage          775 (recursively)

Supported Web Servers

One of the following server types can be used to host the app:

Installation

Before starting the installation, check the system requirements first.

Install on Apache

Install on Nginx

Install on Localhost

Installation Notes

Note:
  • 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.

One product = one purchase code. LaraClassifier, each paid add-on and each paid theme are sold separately, and each one has its own purchase code. A code issued for one product cannot activate another one.

Where the purchase code is used

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
Check your spam folder. For both bedigit.com Store and Gumroad purchases, the license key is delivered by email. Automated license emails are very often filtered, so if the message is not in your inbox, look in your spam / junk folder before contacting support, and add our sender address to your contacts or allow list.

1. bedigit.com Store (in-site purchase)

When you buy from the bedigit.com store:

  1. 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).
  2. 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.
  3. 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.
  4. 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).
  5. Your invoice is available under My Account → My Orders.
Note: the license email is sent to the email address recorded on the order. If you used a different address than your account address, check that mailbox (inbox and spam folder) as well.

2. Gumroad

When you buy from our Gumroad store, you receive two separate emails:

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.

Tip: use the same email address on bedigit.com as the one used for the Gumroad purchase. Your Gumroad keys are then linked to your account automatically and stay available under My Account → My Licenses, even if you registered on bedigit.com after the purchase. You can also add a Gumroad key manually from My Account → My Gumroad Licenses.

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.

  1. Log in to your Envato / CodeCanyon account.
  2. Open the Downloads page.
  3. Find the item, open the Download dropdown, and choose License certificate & purchase code (PDF or text file).
  4. 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?

Note: each Envato license covers one single installation. Renewing item support does not change your purchase code: the code stays the same for the lifetime of the license.

I did not receive (or I lost) my purchase code

  1. 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.
  2. 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.
  3. Envato: open Downloads → License certificate & purchase code in your Envato account.
  4. 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:

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.

Note:
  • 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_HTTPS entry used by the previous versions is no longer read. If it is still present in your /.env file, it can be removed safely.

Error 403

Error 403 on Apache

Error 403 on Nginx

Error 403 on LiteSpeed

This error is related to LiteSpeed (LiteSpeed Web Server) or similar servers like OpenLiteSpeed.

This error is related to services like Cloudflare, Imunify360, etc.

Upgrade to new versions

Important: For both upgrade methods, make sure you have backed up your website (files and database) before starting the upgrade.
Note: The script's loading times during installation and upgrade processes may seem long, but this is by design: pause times of 1–2 seconds avoid asynchronous request execution issues across different server configurations.

1. SSH Upgrade Method

  1. Put your website under maintenance from the Admin panel → System Info → Maintenance. Don't log out as an admin user.
  2. Clear the website cache from the Admin panel → System Info → Clear Cache.
  3. Download the latest version from CodeCanyon.
  4. Copy the .zip file to the root of your server (same place where files were uploaded during installation).
  5. Rename this zip file to laraclassifier.zip on the server.
  6. Delete the vendor directory from your server (so there are no old unused files left from previous versions).
  7. Use a terminal (console) to log into your website's root folder.
  8. Once in your website's root folder, run: unzip -o laraclassifier.zip -x ".htaccess" -x "public/.htaccess" -x "public/dist/front/custom.css"
  9. Ensure to never delete or replace the /.env and the /storage/installed files.
  10. Wait for the command to complete.
  11. (If you have installed any add-ons) update them to their latest version.
  12. Visit https://domain.tld/upgrade and click Upgrade Now.
  13. Once the update completes, your website will go live automatically and you will be redirected back to the homepage.

2. Traditional Upgrade Method

Caution:
  • If you have made any CSS customization, back up your /public/dist/front/custom.css file 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.)
  1. Put your website under maintenance from the Admin panel → System Info → Maintenance. Don't log out as an admin user.
  2. Clear the website cache from the Admin panel → System Info → Clear Cache.
  3. Download the latest version from CodeCanyon.
  4. Copy the .zip file to the root of your server (same place where files were uploaded during installation).
  5. Delete the vendor directory from your server (so there are no old unused files left from previous versions).
  6. Extract the .zip file into the website's root folder by overwriting old files. Ensure to never delete or replace the /.env and the /storage/installed files.
  7. (If you have installed any add-ons) update them to their latest version.
  8. Visit https://domain.tld/upgrade and click Upgrade Now (make sure you are logged in as admin).
  9. Once the update completes, your website will go live automatically and you will be redirected back to the homepage.

Upgrade Notes

No users, data, uploads or settings will be lost on your site when applying updates.
Important: If your server or hosting provider uses any kind of file caching (supercacher, opcache, Cloudflare cache, etc.) you will need to clear that cache after updating, otherwise some changes from the update might not work properly.
If you receive an error related to the Purchase Code:
  • 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 /.env file: PURCHASE_CODE=yourpurchasecode, or log in to your Admin panel → Settings → General → Application → Purchase Code and edit the line to add your Purchase Code.
Version-specific upgrade notes:
  • 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 → Settings entries 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).
  • If your website is running on v3.4 or lower: Before starting the upgrade, you have to:
    • Add this entry: APP_VERSION=X.X in the /.env file (e.g. APP_VERSION=3.4 if your current version is 3.4).
    • Add a new entry for your purchase code in the /.env file: PURCHASE_CODE=yourpurchasecode.
    • (If exists) change DB_PREFIX= to DB_TABLES_PREFIX= in the /.env file.
    • (If exists) remove the SESSION_DRIVER=file and SESSION_DOMAIN=.mysite.com entries from the /.env file.

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:

Note: Some hosting providers block port 25 or 465. In that case, change your SMTP email server or contact your hosting provider.

Own SMTP Server

Admin panel setup

Or use the /.env file

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
Note: The /.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

Or use the /.env file

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
Note: The /.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

Or use the /.env file

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
Note: The /.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

Or use the /.env file

MAIL_MAILER=ses
SES_KEY=your-ses-key
SES_SECRET=your-ses-secret
SES_REGION=your-ses-region
Note: The /.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

Or use the /.env file

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
Note: The /.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

Vonage

vonage.com

Admin panel setup

Or use the /.env file

VONAGE_KEY=your-vonage-key
VONAGE_SECRET=your-vonage-secret
VONAGE_SMS_FROM=your-sender-number

Twilio

twilio.com

Admin panel setup

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

Social Login

Important: Make sure 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.

Facebook

  1. Register for a regular Facebook account, if you don't already have one.
  2. Open developers.facebook.com and Create a New App.
  3. Get the new app settings.

Now, set up your admin panel:

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
Note:
  • The /.env file settings override those of the admin panel.
  • The OAuth redirect URI is: APP_URL/auth/connect/facebook/callback.
  • Replace APP_URL with its value (from /.env). Example: https://domain.tld/auth/connect/facebook/callback.

LinkedIn

  1. Register for a regular LinkedIn account, if you don't already have one.
  2. Open linkedin.com/developer/apps and Create a New App.
  3. Get the new app settings.

Now, set up your admin panel:

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
Note:
  • The /.env file settings override those of the admin panel.
  • The OAuth redirect URI is: APP_URL/auth/connect/linkedin/callback.
  • Replace APP_URL with its value (from /.env). Example: https://domain.tld/auth/connect/linkedin/callback.

Twitter (OAuth 2.0)

  1. Register for a regular Twitter account, if you don't already have one.
  2. Open apps.twitter.com and Create a New App.
  3. Get the new app settings.

Now, set up your admin panel:

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
Note:
  • The /.env file 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_URL with its value (from /.env). Example: https://domain.tld/auth/connect/twitter-oauth-2/callback.

Twitter (OAuth 1.0)

  1. Register for a regular Twitter account, if you don't already have one.
  2. Open apps.twitter.com and Create a New App.
  3. Get the new app settings.

Now, set up your admin panel:

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
Note:
  • The /.env file 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_URL with its value (from /.env). Example: https://domain.tld/auth/connect/twitter/callback.

Google (deprecated)

  1. Register for a regular Google account, if you don't already have one.
  2. Open console.developers.google.com and Create a New App.
  3. Get the new app settings.

Now, set up your admin panel:

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
Note:
  • The /.env file settings override those of the admin panel.
  • The OAuth redirect URI is: APP_URL/auth/connect/google/callback.
  • Replace APP_URL with 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

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

Admin panel setup

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
Note: The /.env file settings override those of the admin panel.

Image Processing

The script supports two image processors:

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

Important: Make sure Imagick is installed on your server. If not, contact your hosting provider.

Localization

How can I enable Geolocation?

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.

Note: The script doesn't have any data import tool.

Languages

How can I add new languages?

Notes:
  • 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?

Note: To prevent missing translations in the new default language, open /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?

Important: The Admin panel does not support the RTL direction.

How can I disable languages?

How can I delete languages?

Important: By deleting the language, the language files folder /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)

2. The paid plans

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:

Note:
  • 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).

Note:
  • {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. Run which php over SSH to find it. On cPanel, it is often /usr/local/bin/php or /opt/cpanel/ea-php83/root/usr/bin/php.
  • /path/to/public_html/: replace this path with your real path (the folder that contains the artisan file).
  • 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?

TaskCommandFrequencyCondition
Listings Purge (auto-archives and deletes listings after expiration)listings:purgeEvery hourAlways
Saved-search alerts sendingalerts:send-notificationsEvery hourAlways
Expired password-reset tokens clean upauth:clear-resetsEvery 15 minutesAlways
Cache Purge (deletes the expired and outdated cache files)expired-cache:purgeEvery day at 5:00Always
Theme CSS cache clean uptheme:prune-cacheEvery day at 5:15Always
Full data cache clearcache:clearEvery Sunday at 6:00 and 6:15Unless disabled (see below)
Views cache clearview:clearEvery Sunday at 6:00Only when enabled (see below)
Backupsbackup:run / backup:cleanAs configuredAdmin panel → Settings → Backup
Queue worker ("poor man's queue")queue:scheduled-workAs configuredDatabase or Redis queue, and enabled under Admin panel → Settings → Optimization

The times are evaluated in the website's time zone.

Scheduler options (/.env)

How can I check that the cron job works?

Over SSH, from the website's root folder:

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:

2. Premium / Paid Listings

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:

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:

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.

Important: If the cron job is not configured, the expired files are never deleted, and the cache directory keeps growing. On a busy website, it can take several gigabytes. Always configure the cron job when using the File driver.
Note: Earlier versions refreshed a large part of the cache on every listing visit (to update the visits counter), and on every user login. The outdated files were only deleted once expired, which made the cache directory grow very quickly on busy websites (up to several gigabytes per day). This is fixed: visits and logins no longer refresh the cache, and outdated files are deleted as described above. After upgrading, run the Clear Cache action once (see below) to get the disk space back.

The cache directory is too big: how can I get the disk space back?

  1. 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.
  2. If the directory is really huge and the command times out, you can also delete the content of /storage/framework/cache/data/ manually (keep the data folder itself).
  3. 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

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/.

Important: The /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.

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

The API endpoints documentation is available from Admin panel → API Docs (for super-admin users).

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.

Notes:
  • 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.

How are ads/listings published?

  1. 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.
  2. 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?

How can I set the default currency?

How can I set up the plans?

How can I set up the advertising code (e.g. AdSense)?

How can I set up reCAPTCHA?

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:

After editing .env, clear the config cache:

php artisan config:clear
Important: 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:

  1. Show you the current value of the setting and the new value it is about to write.
  2. Ask for confirmation before saving.
  3. 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 general group.
  4. Trigger the regular save side effects (env-mirror to /.env for queue / cache / SMS keys, cache regeneration, etc.) so the change takes effect immediately.

Common recovery recipes:

Symptom Command
Locked out by a broken CAPTCHAphp artisan settings:reset captcha_enabled
Broken SMTP credentialsphp artisan settings:reset mail_driver --value=log
Queue driver pointing at a dead backendphp artisan settings:reset queue_driver --value=sync
Cache driver pointing at an unreachable Memcached / Redisphp artisan settings:reset optimization_cache_driver --value=file
Tip: If the application cannot boot at all (so 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