# Documentation

## Table of contents

# About

Welcome to SEO Studio! This is a small script that contains specialized tools for search engine optimization. These tools make a great offering to your visitors and customers.

## Requirements

Before installing, please ensure that you have a web server which meets these requirements:

- PHP: `8.0.0+` (recommended) or `5.6.1+` (minimum)

- PHP extensions: `mysqli` & `curl`

- MySQL: `5.5+`

You will also need an empty MySQL database to install the script into. Please do not use a database that is shared with another platform at the same time. Please ensure it is indeed empty before installing.

Please note that if you install the script in an environment with a PHP version older than `8.0`, your installation may stop receiving automatic updates in the next few years until you upgrade to `8.0` or newer.

## Installation

Installation is very simple!

Inside the download from codecanyon.net, there is a folder called `Upload These Files`. Open this folder and look for the `install.php` file. Upload this file to your website and open it in your browser. Then follow the on-screen instructions to complete the installation.

💡
When you finish installing the script, all of the tools should work out of the box without further configuration. However, you’re not done. Make sure to visit the quick start wizard in the script’s admin panel to finish setting up the script after installation.

### Common installation questions

- How do I upload the file?

  You’ll want to use a file manager to upload the file. This can be done with a software application such as FTP or SFTP. It can also be done with some web hosting control panels, such as cPanel with their file manager interface.

  Because the process for this will vary depending on your web hosting company, if you’re not sure how to upload the file, please contact your web host’s support team and ask them how you can upload a PHP file.

- What folder do I upload the file into?

  The answer to this depends on the setup of your server. In most cases, you will want to upload it into a folder called `public_html` which you will often see as soon as you open the file manager. Some file managers will even start inside this folder by default.

  If you’re setting up the server manually, it will depend on the web server package and your server distribution, but these files typically go inside `/var/www/html`.

  You will want to upload the `install.php` file so that it resides inside the target folder. This means the resulting path should look something like this:

  - `/home/username/public_html/install.php`
  - `/var/www/html/install.php`

  If you’re not sure which folder corresponds to your website’s home page, ask your web host.

- Can I install into a subdirectory or subdomain?

  Yes, this script will work inside subdirectories and subdomains. You’ll simply need to upload the `install.php` file inside the directory for the subdirectory or subdomain and then proceed as normal.

  If you’re not sure how to create a subdirectory or a subdomain, contact your web host.

- How do I open the file in my browser?

  Assuming you uploaded it into the correct folder, you can then access it in your browser by manually typing the URL to your website and adding `/install.php` to the path.

  For example: `https://example.com/install.php`

  In some cases, if your website is empty other than the `install.php` script, you can also open the home page of your website and you will see an index where the installer file is listed. Simply click on it to proceed.

- How do I create a database for the installation?

  This process varies greatly by web host, control panel, and the configuration of your server, so I recommend contacting your web host if you’re not sure.

  Most likely, your web host will have some online documentation showing you how to create a MySQL database. You will need to create a MySQL user, attach it to the database, and grant it all permissions for that database.

- What do I enter for the database options?

  The hostname is almost always `localhost` unless your web host has told you otherwise.

  You will create or receive the other parameters (database name, username, password) when you create the database. If unsure, ask your web host.

  If your database server is running on a port different than `3306`, then you should specify it as part of the hostname using a colon, for example: `localhost:3307`

- Do I need to activate the product?

  The installer will ask you to sign in with your Envato account. This will activate the product automatically.

  Product activation does not unlock any features. It only grants access to automatic updates, free search proxying, and one-click cron job setup.

  You can skip this step if you’d like — click the green sign-in button and then click on the deny button to proceed with the installation.

  You can also activate after installation if desired. You’ll see prompts throughout the admin panel allowing you to activate easily at any time.

- Do I need to configure file permissions on the server?

  No. The installer will configure file permissions on its own. Please do not modify file permissions after installation unless you know what you’re doing, as that may break automatic updates.

- How do I install script updates?

  You should never attempt to install an update on your own. Instead, log into the admin panel for your script, go to the updates page, and check for updates there. If updates are available, click the install button and they will be installed for you.

  You might periodically receive update notifications from CodeCanyon. You should still use the admin panel’s update system to install the update, rather than downloading it from CodeCanyon.

  💡
  Tip: If you’ve received an update notification, but your admin panel shows that no updates are available, don’t panic! This just means the update was automatically installed by your script because you have automatic updates enabled in the settings.

### Common installation issues

- The installer says it encountered an unexpected error, is it safe to proceed?

  No, it is not safe to proceed. This often means something is so drastically wrong with the server that the installer died while it was checking if the requirements were met.

  Please contact support and send me the URL to your installer: https://codecanyon.net/user/baileyherbert

  If you’re experienced with web development, you can open your developer console to the network tab and check the response in the failed request for more information on what’s wrong. If you believe it’s safe to ignore, then you can proceed, or contact me if unsure.

- I’m receiving an error on the database step.

  If you’re seeing an access denied error, check if it says “using password: yes”. If it does say “yes”, then the password you entered is incorrect. If it says “no” or is missing, then the username or database name is incorrect.

  Make sure that you’ve attached the username to the database. This is something you typically have to do manually. After attaching them, you will be asked to select permissions. Grant the user all permissions for the database, and then try again.

  If you’re seeing a connection error, double check the hostname and try again. If it still fails, contact your web host and send them the error message as well as a screenshot of the database credentials you’re entering into the script.

- I’m having trouble verifying my license.

  If you see an option to skip the activation step, click it. You’ll be able to activate the product later from the admin panel, so don’t worry about it too much.

  If you don’t see an option to skip, please contact support: https://codecanyon.net/user/baileyherbert

- The installer appears to be stuck at the “installing” step?

  Please don’t worry, the installer is almost certainly not frozen.

  I distribute small updates for this script “over the air” and only submit major updates to CodeCanyon.

  Most likely, the installer is currently installing a large number of small updates for your script, which can take 2-3 minutes depending on the number of updates and the server’s internet speed.

  Please allow up to 15 minutes for the installation to finish. Do not close the page until it has completed.

- I’m receiving an error when activating the free Google proxying or Instant Cron?

  In most cases, these errors are caused when a security plugin on your server, or an intermediary like Cloudflare, blocks my server from connecting to your server because it looks like a robot.

  Check with your security plugin, intermediary, or web host to see if there’s a way to exclude blocking requests from my user agent:

  > Mozilla/5.0 (compatible; Baileybot; +https://bailey.sh)

## Support

If you’re having trouble with the installation, or need help with anything else, please visit my profile at the following link and send me a message using the contact form on the right side:

https://codecanyon.net/user/baileyherbert

## Developers

If you’re a developer, please do not use the `Source` folder included in the product download. This folder exists for reference only and is not suitable for installation.

Instead, please the `install.php` file on your local web server and run it in your browser to install the application in the same directory. Then, you can delete the installer files and commit the remaining files if desired. Follow the above installation instructions if needed.

- Should I activate the product on a local installation?

  If you would like to be able to easily install updates into the locally-installed script later, then yes, you should activate it locally. If you don’t need updates, you don’t need to activate it.

  You will still need to attempt the activation step, but you can either deny the permission on the Envato side, or click the cancel button if presented with the license management screen.

  If necessary, you may contact me via the support link above and I can register an additional license under your account so that you may activate both the production and development versions of your website at once.

- Why is the installer encrypted?

  This is a common question, so I’ll put this here. The installer is not encrypted. It’s simply packaged into a bundle for ease of upload, and compressed as well as encoded to avoid corruption during file transfers in ASCII modes.

  The bundle can be unpacked (expanded) with my command line tool here: https://github.com/baileyherbert/packr

  For example, you can run the `packr expand install.php installer` command in the same working directory to extract all of its files into the `installer` folder.

  You can also read any of the encoded strings by decoding them (base64) and then inflating them (gzip). Some of the data is binary, such as the archive for the application’s files.

🚨
Attention all developers! Please make sure to disable the “send errors to the developer” option in the script if you intend to customize the code.

# Tools

## Google & Bing SERP

These tools will test a provided keyword against your website in order to find your rank on the search results page. They will check up to `100` results depending on the query and position of your target website. The number of results may increase in the future.

## Top Search Queries

This tool uses spyfu.com to find a website’s most popular search queries in a small number of popular regions around the world. The following columns are displayed:

- Rank – The average rank of the website in search results for the query.

- Volume – The average monthly search volume for that query in the region.

- CPC – The broad cost-per-click for advertising that query in the region if available. If no data is displayed in this column, then the keyword is not advertised enough in that region, or Google AdWords did not provide data for it during the last index.

- Difficulty – An estimation of how difficult it is to rank for this keyword, on a scale from 0 to 100.

- Clicks – An estimation of how many clicks your website receives from this keyword.

- Homepages – The average number of top results for this keyword that point to a home page.

## Indexed Pages

This tool checks both Google & Bing to determine the number of indexed pages.

## Robots.txt

This tool parses and displays the rules in your `robots.txt` file, organized into a table. It also displays any sitemaps from the `robots.txt` file, followed by the raw text.

## Sitemap

This tool looks for sitemaps on a domain like a web crawler would, and shows the following information for each:

- Status – The HTTP status code for the sitemap.

- Type – The format of the sitemap.

- Entries – The number of location entries inside the sitemap.

- Visibility – A rating for how easy it was to discover the sitemap. For example, a score of 100% shows that the sitemap was immediately discovered upon crawling, while a score of 70% means that it took a considerable number of HTTP requests to discover the sitemap.

This tool is capable of reading sitemaps in the `XML` or `RSS` format. It will discover sitemaps from the `robots.txt` file, and will attempt to load the root `sitemap.xml` file. It will also follow a single layer of nested sitemaps from inside the `sitemap.xml` file.

## Submit Sitemaps

This tool can be used to easily submit a root sitemap to Google and Bing. It is recommended to instead use the Webmaster Tools for the respective services if possible, as those requests are likely prioritized and their statuses can be tracked.

## High Quality Backlinks

This tool shows up to `250` backlinks for the target website. For a backlink to show on this page, it must have a page authority score of at least `20` and a domain authority score of at least `50`.

## New Backlinks

This tool shows up to `250` backlinks that were discovered in the last two months for the target website, sorted by newest first.

## Poor Backlinks

This tool checks the last `500` backlinks to be discovered for the target website to see if they are low quality, risky, or spammy. For a backlink to show on this page, it must have a page authority score below `7` and must not be marked as `nofollow`. These rules might change in the future.

## Top Referrers

This tool shows the top `100` domain names which link to your website, sorted by the number of backlinks. It also shows the number of `dofollow` links, the domain’s authority score, and the date at which the first backlink was discovered.

## Check Domain Authority

This tool estimates the authority of a domain name.

This is a score which estimates the link’s popularity and importance, and is determined by the number and quality of incoming links to the page (both internal and external). It’s calculated logarithmically on a scale from 0 to 100 and is updated for all domains at least once per month.

## Check Page Authority

This tool estimates the authority of a specific page on a domain name. The scoring works just like described in the tool above.

## Crawlability Test

This tool allows you to test specific pages on your website to see if they can be crawled and indexed by the various search engines. It looks at rules defined in meta tags and the website’s `robots.txt` file.

## Mobile Support Test

This tool checks a website’s source code to detect whether or not it will be considered responsive or mobile friendly by a search engine. It checks meta tags, stylesheets, and embedded styles. Please note that this is a best guess tool, and may not always be fully accurate.

## Headers

This tool shows the headers of a specific page on your website. It also checks for redirection and explains whether the redirection is permanent or temporary.

## Speed Test

This tool uses pingdom.com to test the performance of a website at one of a selection of regions across the world.

The results of the test will be displayed, including the overall load time, a score of the website’s performance, the total size of the page as transmitted over the network, and the number of HTTP requests it took to load.

The response codes for the various content will also be displayed. In general, you will want to avoid redirections (`301` and `302`) and any erroneous requests in the `400`s or `500`s.

Finally, it will show a breakdown of the types of content which make up the page’s size and request count.

## Link Analysis

This tool analyzes and shows a breakdown of the links on a webpage. You will see the anchor text, link location, the type (external or internal) and whether it or not search engines can follow it.

## Keyword Density

This tool analyzes a webpage and shows a breakdown of the density of its keywords. It will analyze the page’s title, meta tags, and body content.

Each phrase will show the number of occurrences on that page, whether or not the phrase is in the title and description, as well as a computed weight score for the phrase.

💡
The keywords on a page with the highest weights will likely be indexed with more strength than other keywords. The actual percentages are meaningless except in comparison to other keywords — whether the top keyword’s weight is 2% or 20% makes no difference.

## Extract Meta Tags

This tool analyzes a webpage and shows its meta tags. It also indicates whether each tag is used by Google and Bing.

## Keyword Research

This tool finds keyword suggestions based on your input keyword and region using a combination of Google Suggest and Surfer SEO. It shows the cost-per-click and search volume in the specified region for each keyword.

## Competition

This tool performs a Google search with the specified query and checks up to `200` results for the rank of your website. It will then show your website with the surrounding results, and will show a comparison of backlink and authority data for those results.

# Administration

## Accessing the admin panel

To access the admin panel you must sign into the public website as an account with admin privileges. Then a dark gray bar will appear at the top of the screen with a link to the admin panel.

## Configuring the script

The Settings page in the admin panel has various subsections which allow you to change the configuration of the website. Each ambiguous item will have an encircled question mark (?) which you can hover with your mouse to learn more about.

### Configuring tool caching

The Settings > Cache subsection allows you to configure tool caching. Most data-driven tools cache their results into the database, while site-driven tools like Keyword Density will avoid caching their results at all.

You can configure the duration to store cached results on this page in days, or disable caching completely. When configuring a number of days, it will only apply to tools that need caching (data-driven tools).

Running the script with a cache is recommended. If desired, set the cache to 1 day to maintain freshness. Also make sure the cron job is running as it will clean the cache periodically.

### Configuring outgoing mail

The Settings > Mail subsection configures the outgoing mail server settings. If you’re on a server that supports sending email, such as a cPanel server, the default `Built-in PHP mail()` option should work for you. Try the “send a test email” feature and check your spam inbox just in case.

For servers that do not support email, or for advanced users, you can configure a mail service from the available options: SMTP, Mailgun, and SendGrid.

You will also see the following options:

- From Address – The email address that emails will be sent from. If you’re using a service like SMTP, MailGun, or SendGrid, make sure this matches the username or sender email on the account to avoid the spam folder.

- From Name – The display name for the sender. This can be set to anything, like the name of your brand or website.

### Configuring email templates

The Settings > Email templates subsection allows you to customize the plain-text email templates that the script uses when sending various messages to users.

### Configuring permalinks

The Settings > Permalinks subsection allows you to enable permalinks (pretty URLs) on the public website on supported servers. To enable it, the script will first perform an eligibility check where it tests a temporary directory on the server to make sure permalinks won’t cause any fatal errors.

Once enabled, you can customize the permalink paths across the script.

Please note that the permalinks will be written directly to the `.htaccess` file in the root directory of the script. If something goes wrong and the website starts displaying an error after changing permalinks, try renaming this file to `.htaccess.old` to access the website again.

### Configuring rate limiting

The Settings > Rate limiting subsection allows you to block or CAPTCHA users who are sending too many requests for tools, login, and contact form submissions.

On this page, you will see a table of number inputs. Each column in this table represents a time interval, while each row represents a type of user action. If a user performs any action more than the specified number of times within each interval, they will be rate limited for the specified duration (in minutes).

💡
Examples The default rate limits for the “tools” action are `15` (1 min), `40` (5 min), `75` (15 min), `100` (30 min), `125` (1 hour). Here are some examples of how these intervals will be applied: Example 1. A visitor has used the “domain authority” tool 15 times in the last minute, but only 30 times in the last 5 minutes. They have reached the 1-minute interval and are now rate limited. Example 2. A visitor has used the “domain authority” tool only 3 times in the last minute, but 75 times in the last 15 minutes. They have reached the 15-minute interval and are now rate limited. Example 3. A visitor has used the “domain authority” tool 14 times in the last minute, 39 times in the last 5 minutes, and 74 times in the last 15 minutes. They have not hit any intervals, and are not rate limited. In examples 1 and 2, the users are blocked for the duration configured in the last column of the table. By default, this is 120 minutes (or 2 hours). When a CAPTCHA service is configured, the user can complete a CAPTCHA to immediately circumvent the block.
🚨
The default rate limits are extremely generous. If you are concerned about bots, please reduce the intervals as necessary.

## Changing the website’s appearance

The admin panel has a Customize section in the sidebar which is dedicated to changing the appearance of the website. You will find three subsections under this section:

- Branding – Configure the logo and favicon for the public website.

- Navigation – Add custom navigation links to the header.

- Colors – Customize the color scheme of the website to match your branding.

For now, this is as much as we can customize the appearance. There are additional customization features planned for the future, but no immediate guarantees.

## Changing the website’s content

The admin panel has a content section in the sidebar which is dedicated to changing the content of the website, such as the text, tools, and advertising banners.

### Translating the website

The Content > Languages subsection allows you to create and manage languages for the website. When multiple languages exist at the same time, a language selector bar will automatically appear at the top of the website. You can edit or set a language as the default by clicking the ••• button.

To create a new language, click the Create new button at the top right of the page. Give the language a name, a display direction, a default Google domain, and set the locales. Then translate each row on the screen and click the Create button at the very bottom to finish.

💡
When creating a new language, you will see an option to Auto translate to a specific language. This will use Google Translate and is a recommended way to start quickly. However, please check the results of this tool for completeness, as not all phrases may be translated at this time.

### Editing pages

The Content > Pages subsection allows you to edit one of the script’s default pages. It is not possible to fully customize these built-in pages, but you will find many customization options. In addition to editing page titles and meta tags, you will find the following specialized options:

- Home – Easily edit the translations for the home page content.

- Tools – Manage tool categories, descriptions, and sorting.

- Terms of Service – Create a terms of service page & require agreement from users.

- Privacy Policy – Create a privacy policy page & require agreement from users.

💡
You will find a language dropdown at the top right while editing a page. When multiple languages are installed at once, you can toggle between the languages to customize the page for each. All page customizations are done on a per-language basis.

### Editing tools

The Content > Tools subsection allows you to manage the tools on the system, including:

- Enabling and disabling tools

- Changing tool icons

- Changing tool names

- Setting page titles and meta tags for tools

- Adding custom content to tool pages

- Generate tool embedding snippets

With these options it is possible to further personalize your website, and to further increase the content value and search indexability.

### Embedding tools onto another website

It is quite common that this script is installed into a hidden subdirectory on a WordPress website, and then the tools are embedded individually onto the main WordPress website, effectively turning this script into a WordPress plugin.

To embed a tool, go to Content > Tools and click the Embed tools button at the top right. Select the tool that you’d like to embed and customize the options to suit your needs, then click Generate. You will want to copy and paste the resulting snippet onto another website.

📢
I have found that some web hosts will enforce an `X-Frame-Options` header on the website, which prevents these embeds from working on other domains. This will often manifest with the embed showing a “Refused to connect” error. If you are experiencing this issue, please contact your web host and ask them to remove this header.

### Inserting ad banners

The Content > Advertising subsection allows you to insert ad banners into the script. I do not recommend any specific advertising vendor. However, if you have an approved advertising account, you may insert your ad banner snippet codes into the slots shown in this section.

You will find various slot sizes, such as `728x90` and `120x600`. Generate banner codes with your advertising vendor that are equal to or slightly less than the specified sizes. Do not exceed these sizes in either direction to ensure a consistent layout.

There is a Preview mode available for your convenience. Simply enable this mode and view the public website to see where the various ad banner slots will appear. Please note that this is not fully accurate, as the slots can rearrange slightly based on which slots are filled and which are empty.

💡
Make sure to disable Preview mode when you are finished previewing! Otherwise your ad banners will not appear.

You will also find a settings section on this page, where you can limit the number of ad banners that will be shown on a single page at once, as well as disable advertising banners for certain user groups (such as for premium users).

## Managing cloud services

### Setting up the cron job

The Services > Cron subsection helps configure or track the status of the application’s cron job. This cron job is a small script that must run periodically. It will perform various important functions:

- Cleaning up the database (e.g. of expired cache)

- Checking for and installing new updates

- Sending usage telemetry to the developer

There are two ways to activate the cron job:

- Remotely – I’ve designed a cloud-based system that will run your cron job over the internet every few hours. It’s free, all you need to do is click the Activate button.

- Manually – If you’re experienced with setting up cron jobs, you can set it up locally with the instructions on this page.

So which method is best? Well, the remote method is most ideal if you have a high traffic website, because my system will always run your cron job immediately after a new update is released. This means if a new update is released to fix a broken tool, for example, your downtime will be minimal.

Please note that the remote method only works on public web servers. In some cases, firewalls or security services (such as Cloudflare) may prevent the connection, in which case the script will tell you that it cannot activate the service.

Finally, please note that enabling the remote service will send the public URL of your website to me, the developer (it’s required in order to run the cron job remotely, after all). This information is normally private to me, but I won’t abuse it in any way, I promise! 👍

### Setting up custom proxies

The Services > Proxies subsection allows you to import HTTP proxies into the script. When importing proxies, you can choose which service(s) they can be used for. In most cases, you will want to enable proxying for all services, unless your proxies have a transfer cap.

If a connection error is encountered, the script will temporarily disable the proxy and will use another. If too many proxies fail or no working proxies are available, the user will be shown an error.

We recommend enabling rate limiting (from Settings > Rate limiting) when using proxies to prevent bots from using up your resources.

We also recommend enabling the script’s free automatic search proxies (detailed in the section below) when using custom proxies. These will be used as fallbacks if your proxies go offline or are being used too frequently.

💡
How many proxies do I need? The script will use proxies in a round-robin fashion for each service. This means all proxies will be used once before the script reuses any of them. We recommend that you base your calculations around Google, since it’s the most likely service to encounter a rate limit with. The tools that use Google include: `Google SERP`, `Indexed Pages`, and `Competition`. In general, you want to have enough proxies that no single IP address will be used to scrape from Google more than once per 5 minutes (in a worst case scenario) when your tools are seeing peak demand. If possible, aim for one request per 10 minutes during normal traffic/demand.
🚨
What happens if I don’t have enough proxies? If the number of available proxies is insufficient to handle your website’s demand, then your proxies may end up sending more than one request to Google per 5 minutes. If this continues for too long, the proxies will be rate limited. When a proxy is rate limited, the script will temporarily disable the proxy for that specific service. This timeout can last for more than an hour and will reduce the number of available proxies further, potentially compounding the problem. For this reason, it’s recommended to enable the script’s free automatic search proxies (detailed in the section below) when using custom proxies. These will be used as fallbacks if your proxies go offline or are being used too frequently.

### Setting up free automatic search proxying

This script comes with a built-in service at Services > Search that offers free, automatic proxying of Google & Bing searches with a daily quota.

When enabled, the script will continue to use your server’s own IP address for scraping from these search engines. However, if your server’s IP is being used too often (and the risk of being rate limited is elevated) then it will temporarily switch to using our network of servers.

Enabling this service will opt your own server into the network to perform occasional queries for other users, in exchange for an increased daily quota. Work is being done to make this an option, check back soon if you don’t want to opt your server into the network.

🚨
Before you activate, read this! It’s important to read the terms of the service. They’re not so much terms as they are an explanation of how it works. In short, by opting into the service, the script will automatically proxy searches (when necessary) using a network of servers. However, in doing so, you will also make your own server available as a part of the network to very periodically perform a search for the network. It’s sort of like torrenting, but for searching the web, and is the best solution I could come up with that was free. As your server handles more queries for the network, your quota will increase further over time, allowing you to request more queries from the network. If this sounds alright to you, then go ahead and give it a try. You can disable it at any time.
💡
Developers who are curious about this offering, read here! If you are concerned about this being abused, please do not worry. The searches are performed on your server using the `includes/execute/google.php` file. This file is a bundle, just like the script’s installer, whose source code can be read entirely using Packr. The script is hard-coded to only accept requests for a specific list of search engines, and it authenticates each request to ensure it is coming from my servers. In addition, I act as a middleman for all requests, so your server IP or domain is never exposed.

## Installing updates

The Updates section in the admin sidebar allows you to check for and install the latest updates. This is the only recommended way to install updates to the script.

💡
When updates are available, you can click on the More options button to see each available update in detail, including the files it will modify. You can also download the update’s files as an archive, but this is only for auditing and is not intended for installation.

It is recommended to enable the Automatically update Studio setting in the Settings > Configuration subsection of the admin panel, and to ensure the cron job is running periodically. This will automatically install updates to keep your tools working, as they do sometimes break.

You can monitor when updates are installed automatically in two ways:

- The admin dashboard will show each version that was installed automatically in the activity log.

- The updates page will show each update under the View history menu.

## Managing users & groups

The Users section in the admin sidebar allows you to manage users and groups, and to monitor the usage of your website’s tools.

### Managing users

The Users > Users subsection shows a list of users registered in the system. By default, you will see your default administrative account as the first user. Click on an email address or the ••• button to view and edit the user’s profile.

While viewing a user’s profile, you will see a list of the websites saved to their account and a list of their recent tool usage. You’ll also find options at the top right to change their password, override their email address, and assign them to a new group.

You can also create new users, and export a list of users as a CSV file, from the top right of the users list.

### Managing user groups

The Users > Groups subsection shows a list of groups registered in the system. Groups are a way to organize your users and to change what permissions they have. Other parts of the application, such as the advertising system or extensions, can change their behavior for specific groups.

### Monitoring tool usage

The Users > Tool usage subsection shows a complete list of recent tool usage by both your registered users and visitors.

For each row, you will find the unique ID of the tool, the domain name that was entered into the tool (if applicable) as well as any extra tool input (where applicable), and the time at which this usage occurred. You can hover over the time to see a full timestamp.

## Extensions

### Setting up a contact page

The application includes a free, built-in extension which adds a contact page to the public website when enabled. You can enable this extension from Settings > Extensions > Easy Contact Page.

Once enabled, if the extension has not yet been configured, a message will appear at the top of the admin panel saying:

> The contact page will not work until you configure the extension.

In this case you must head into the extension’s settings, either by clicking the Settings button from the extension list, or by clicking on the configure the extension link in the notification bar as was quoted above.

Then configure the following options on the extension:

- Subject – The subject of the email that will be sent to you when the form is submitted.
  - Example: New contact form submission from Website Name

- Send messages to – Enter the email address where you’d like to receive form submissions.

Finally, make sure that your system is configured to send email by going to Settings > Mail and sending a test email, or you can test the contact form on the website to see if it works.

### Setting up subscription plans

The application includes an experimental extension which adds pricing plans to the script. These pricing plans can be assigned recurring or one-time fees which will be charged using PayPal. If this sounds interesting to you, please review the following warnings first:

🚨
An extended license from CodeCanyon is required to use this extension in production, however it is still available on regular licenses for testing, experimentation, and trial. Please contact Envato Support to upgrade your license if necessary.
🚨
There isn’t a live demo with this extension because it’s purely experimental. This application is not intended for commercialization due to the web scraping nature. Please review your local laws on commercial use of scraped data, and use at your own risk!
🚧
This extension was only intended as a proof-of-concept, though it has been used by many websites successfully. If you’re a developer, please feel free to reference the extension’s code and build upon it.

First, enable the extension under Settings > Extensions from within the admin panel. You will see an extension named Subscriptions & Plans, with a button to enable it.

Once the extension is enabled, two new links will appear in the left admin sidebar under a category named Subscriptions. Follow the below instructions to set up the extension:

1. Click on the Subscriptions > Options link in the admin sidebar and configure the extension’s settings. You will need to enter your PayPal account’s business email address and set the currency code to match your account.

2. Click on the Subscriptions > Plans link in the admin sidebar. You will see that a default Free plan has been configured automatically. The following instructions will assume that you wish to enter a free plan. Even if you don’t want this, you should still try it out for learning.
   1. Click the Edit button on the Free plan.
   2. Note that the plan has been assigned to the default user group, which is normally named Standard unless you have customized it. This extension uses user groups to determine which plan a user is on. This means each plan must be assigned its own unique group.
   3. The Allowed tools section will grant users on this plan access to all of the selected tools. By default, all of the tools will be selected. Edit this field and select which tools you want users to access for free. Hold the Ctrl key to select multiple tools.
   4. The Pricing section allows you to define the cost for one-time, monthly, and annual subscriptions to this plan.
      1. Setting all of the costs to 0 will make the plan free.
      2. However, if you set a cost greater than 0 for one field, setting the others to 0 will disable them. For example, if monthly cost is $20, and annual cost is $0, then users can pay monthly but not annually.
   5. The Options section allows you to change the behavior of the plan. In nearly all cases, you will want to set the When a user purchases this plan, move them to the following group field to match the user group defined in step b.
   6. Click the Save button.

Now with the Free plan configured as desired, it’s time to create a new premium plan. These instructions will create a new plan named “Pro” which costs $9 /month or $90 /year.

1. Create a new user group at Users > Groups named “Pro”. Leave all permissions at their default selections unless desired and click the Create group button.

2. At the top right of the Subscriptions > Plans page, click the New plan button.

3. Enter the name “Pro”.

4. Select the “Pro” group.

5. Select the tools that this group will have access to. Hold the Ctrl key to select multiple. You will also need to make sure you select all of the tools that the lesser plan(s) have access to. In this case, make sure to also select everything that you selected in the Free plan configured above.

6. Enter a monthly cost of `9` and an annual cost of `90`.

7. Under the When a user purchases this plan, move them to the following group option, select the “Pro” group.

8. Click the Save button.

Now visit the public website and head over to the new Pricing page in the header. You should see your two plans with a breakdown of their enabled tools and their prices.

I recommend creating a new standard account on the website for testing. Go ahead and sign out, then register a new account from the pricing page by clicking “sign up” under the free plan. In the below section, I’ll show you how to manage that user’s subscription from the admin panel.

### Managing user subscriptions

When the subscriptions extension is active, the Users > Users subsection of the admin panel will have additional options when viewing a user’s profile. Click on the user you’d like to manage.

At the top of their profile will appear a subscription section showing their current plan and details about the subscription, such as when it expires, when they first subscribed, and when their last payment was received.

To change the user’s plan, click on the Change plan button and select the new plan. By default, their current expiration date will be transferred to the new plan. If you are moving a user from the Free plan to a premium plan, this means their premium plan will never expire.

To change the user’s expiration date, click on the Manual adjust button. If the user’s subscription is currently set to never expire, you should first click the Expire now button. Then, click on either the +1 month or the +1 year button to set or add to the duration of the subscription.

## Debugging

Due to the dynamic nature of this application, errors do periodically occur. In most cases, the application will handle those errors silently and the page will work as expected. If something isn’t working quite right in the application, here are some things you can try.

### Viewing the error log

Open the Help > Diagnostics subsection of the admin panel. You will find an Errors section near the bottom of this page which shows recent errors that have occurred in the script.

### Running diagnostic tests

If there is a problem in the script, the diagnostics in the admin panel might be able to detect the issue and provide further details. Open the Help > Diagnostics subsection of the admin panel and click the Start button near the top.

## Activation

### Activating the application

To activate the application from the admin panel, go to the Help > Diagnostics admin subsection and click the activate button on the right side. You will be prompted to sign in with your Envato account, after which you will be able to choose from a list of licenses under your account.

### Deactivating or moving the license

You don’t need to deactivate your application under any circumstance. If you wish to activate an installation with the same license later, you will automatically be taken to a license manager where you can deactivate the old installation.

In some cases, the license manager will deactivate the old installation automatically, and the new activation will be seamless. Regardless, you don’t need to worry about it, just follow the steps during the new activation and you’ll be on your way. 👍

## Technical information

### Telemetry & data collection

In the Settings > Configuration subsection of the admin panel, an option is presented titled Send anonymous usage info. When enabled, the application will send some basic information to the developer (that’s me!) every few days. This information is limited to:

- PHP version

- PHP extension versions

- SEO Studio version

- Whether or not the application is licensed

- cURL versions

- MySQL server version

- The number of times each tool was used in the time period

This information does not include any data on you or your users, it does not include any inputs or script settings, it’s exactly as listed above.

I use this information to make informed decisions about increasing server requirements. For instance, in 2018 I increased the script’s minimum PHP version 5.5 when I actually wanted to increase it to 5.6, however my telemetry showed too many users were still on 5.5.

I also use this information to monitor the popularity of tools, which allows me to focus my development in those areas.

I strongly recommend enabling this option to make sure you are included in these kinds of decisions and targeted development!

💡
Nothing to hide here! You can always view the last usage report that was sent to the developer. It will be saved to `/resources/bin/last-usage.txt` in the script.

## Update backups

In the Settings > Configuration subsection of the admin panel, an option is shown titled Save files before updating. When enabled, the script will create before each update a zipped archive with a copy of all files that the update will modify.

For example, if you’ve made changes to a file in the script and accidentally left updates enabled, your work is saved inside one of these archives and can be recovered.

These archives are saved under the `/resources/bin/` directory and have randomized names in the format: `backup-update-7b0e0a11a2180-d1315e94dab53d64a6-1651992500.zip`. You can reference the creation time of these files to find the one from the most recent update.

## Recovering from failed updates

This is such a rare event that to my knowledge it hasn’t happened even once in the lifetime of this application. For example, if server unexpectedly shuts down while the script is updating, corruption may occur.

In this case, the update manager will automatically lock both the public website and the admin panel with the following message:

> Critical error A recent update failed during file extraction. In order to protect the system, the site has been disabled. Please contact customer support for help on restoring the overwritten files.

This error is shown due to the presence of a lock file at one or both of the following locations which signals that the update process did not exit cleanly:

- `/lock`

- `/resources/bin/lock`

You can open these files with a text editor to learn more about what went wrong. There will be a list of files that the update manager successfully modified, as well as a file path under the `FAILED_ON` key which is where the failure occurred.

To recover from this event, please refer to the Update backups section directly above this section, where you will learn how to restore the modified files to their original versions.

Please restore all files in the backup, even if they were not responsible for the failure, to fully return to the prior version. Then delete both of the lock files and reattempt the update.

# Disclaimers

## This script is a web scraper

It’s important to note that this application is a web scraper. This means it retrieves most of its data from other websites, and it typically does so by disguising itself as a normal user of those websites. This has some important implications:

- When a data source experiences an outage, the relevant tools will temporarily stop working.

- When a data source shuts down their operations, the relevant tools will be permanently broken unless the developer can find a new alternative data source.

## Data sources can go offline

The above scenarios happened in 2022, when the data sources we used for domain analysis (alexa.com) and backlinks (seoprofiler.com) both shut down within a week of eachother.

I managed to find alternative data sources for both and released an update after about one week of downtime, but we had to remove an Alexa Rank tool. In its place, I released two new tools for checking page and domain authority.

There’s no guarantee that when a data source shuts down we’ll be able to find a replacement for it. This means you should be prepared, however unlikely it may be, that tools can be suddenly removed from the script if absolutely necessary.

However, my guarantee to you is that when tools are removed from the script, I will endeavor to add at least the same number of new tools to the script as quickly as possible.

📢
The most likely data sources to stop working are those for keyword research, which I find myself having to replace every couple of years. The number of available data sources for keyword research has been declining rapidly in recent years, so be prepared for the worst.
✅
Make sure to enable automatic updates in the script, and ensure that your cron job is running periodically, so your tools can be updated with new fixes or data sources!

# Credits

The following assets and libraries were used in this application. Please note that all of these assets have been licensed for this usage.

You are not authorized to use these assets and libraries without acquiring your own additional license, except in the context of this application, or a single derived work without modifying the assets.

You are not authorized to modify any bundled image assets derived from the following items without acquiring your own additional license. For example, you cannot take the existing SEO Studio logo and change its text.

- SEO & Internet Marketing Icons https://graphicriver.net/item/seo-internet-marketing-icons/4432000

- Optimiez Logo https://graphicriver.net/item/optimiez-logo-/4965349

- Simple HTML DOM Note: I’ve made heavy modifications to this code under the MIT license. https://sourceforge.net/projects/simplehtmldom/