Tracking online visitors update from Hitsteps

This update involve all of our customers. According to this update, you will see different number of active online visitors (probably lower) and higher number of idle visitors.

Hitsteps tracking engine developed back in 2013. In that time, Hitsteps web analytics competitors such as Clicky, Woopra, W3Counter or HiStats were detecting live online users using rough analysis.

Some such as W3Counter were just looking at last 10 minutes unique visitor page views and using it as live user counter. It served the purpose at that time and Hitsteps utilised this method.

As time goes by, we added a ping method to our analytics which ping your visitors every few seconds to ensure visitor remain online. We were then shifted from old method to a hybrid method of calculating between Active and Idle online visitors.

As of today, Hitsteps is using a completely revamped method to calculate online visitors. Hitsteps now look at your visitors activity, tab focus and other information to determine if visitor is online, idle or offline.

Now, if your visitor do not interact with your website (scrolling, moving mouse, clicking, …) or focus out from your website (opening another page in another tab, clicking on another window or minimising browser window), we will immediately mark this visitor as Idle.

Likewise, If browser window get focus, mouse movement or scroll, we will mark this visitor as Active online.

We believe this change is necessary in order to show accurate online active and online idle visitors. however it will cause our numbers to differ from previous version of Hitsteps Analytics and perhaps all other web analytics out there who are using old methods to detect online visitors.

How integrate NANO cryptocurrency payment gateway via Brainblocks to your website?

nano logo

 

Hitsteps accepted Nano cryptocurrency (formerly known as Raiblocks) as a way of payment for it’s services since early January 2018, we are excited about cryptocurrency as whole and specially about Nano cryptocurrency. We were using RaiPay.io as our payment processor gateway however they’ve gone offline and shutdown their service.

So we moved to BrainBlocks. At time of writing this article, brainblocks.io homepage provide a simple and efficient guide on how to create an “inline” nano payment button. however there is no guide on how to create a “hosted” payment gateway page while they DO offer this service as it can be seen in their woocommerce plugin. We are happy with their transaction processing time and their service, so we decided to provide this simple guide to encourage more merchants to accept Nano.

Brainblocks team provided a simple way for Shopify shop owners to accept nano as well as a WordPress plugin for those who use WooCommerce.

In this article, we will focus on how to create a “hosted” nano cryptocurrency payment gateway. We will use PHP for this example, but you can use it with all other languages.

You need to build your URL path to redirect user to brainblocks payment gateway page.

Section A: Opening BrainBlocks Hosted payment gateway page

Your nano wallet address as:
$destination = "xrb_.............";

USD or other currency amount to be paid by user:
$total = "99.99";

Currency that you are using for total amount above:
$currency = "usd";

At time of writing, brainblocks accept aud, brl, cad, chf, clp, cny, czk, dkk, eur, gbp, hkd, huf, idr, ils, inr, jpy, krw, mxn, myr, nok, nzd, php, pkr, pln, rub, sek, sgd, thb, try, usd, twd, zar currencies for price conversion.

Return URL after a successful payment: (order_id parameter is optional, it help you to pin point to exact order generated from your service)
$returnurl = "http://website.url/thankyoupage.php?order_id=xxx";

Return URL after a failed payment: (order_id parameter is optional)
$errorurl = "http://website.url/payagain.php?order_id=xxx";

and then build your brainblock url using variables defined above:
$brainblocks_url = 'https://brainblocks.io/checkout?payment.destination='
 . $destination . '&payment.currency=' . strtolower($currency) .
'&payment.amount=' . $total . '&urls.return=' . urlencode($returnurl) .
'&urls.cancel=' . urlencode($errorurl);

and then you redirect your visitor to this generated URL:
header(“Location: “.$brainblocks_url);

Section B: Verifying payment after it’s paid by customer

In example above, we used success return URL to be thankyou.php, so this instruction is regarding thankyou.php file.

BrainBlocks redirect user to your thankyou page with parameters you’ve provided and add an extra parameter named “token”. This token parameter will be returned as GET (on URL) however there is possibility that it get returned as POST as well. so you need to check for POST if GET token is empty.

In thankyou page, we validate Payment using Token code that is provided by brainblocks as json:
$brainblocks_data=(array) json_decode(
file_get_contents("https://brainblocks.io/api/session/".
$_GET['token']."/verify"),true);

now, we check to make sure full amount is paid by customer:
if ($brainblocks_data['fulfilled']){
//payment is successful and you can go on with processing the order
}else{
//payment has been failed or not full amount has been paid
}

This section B instruction can be used together with brainblocks’s inline payment button guide as well.

How include your visitors details when they send you an email?

We’ve introduced Contact form integration for hitsteps analytics a while ago, however lack of proper documentation caused lot of our customers still asking us how to use this feature! Here we guide you step by step on how to get it working.

End result will be something like this at end of your incoming emails from your websites which shows your visitor information and pageview path:

wpemail

it is cool, isn’t it!? Go open a hitsteps account if you haven’t yet! It works with WooCommerce, Ninja Forms, Contact Form 7, Gravity Forms and even Jetpacks Contact forms! Yes, they are all WordPress plugins which we’ve integrated this function into them. for other kind of websites, you’ll need to manually integrate and code API into your site.

Here is how to configure it for each of these plugins:

WooCommerce

You don’t need to manually do anything for WooCommerce to enable it, it is enabled by default when you install and activate our plugin, you can disable it if you don’t want it from Setting > Hitsteps

Jetpacks

You don’t need to manually do anything for JetPacks to enable it too, it is enabled by default when you install and activate our plugin, you can disable it if you don’t want it from Setting > Hitsteps. There is a checkbox to disable it for jetpacks.

Contact Form 7

  1. Open your form to edit, and find Hitsteps Analytics button in your contact form.
    chrome_2016-04-18_16-35-11
  2. A popup will open. Click on Insert Tag button to inject our code into contact form. It doesn’t matter where you will put this code. it is invisible to your visitors.
    chrome_2016-04-18_16-37-36
  3. Go to Mail Tab and enter [hitsteps_analytics] wherever you want visitor information to be displayed inside of the email.
    chrome_2016-04-18_16-39-35
  4. It is better to enable HTML email checkbox, so that you can receive a well organized report of your visitors.
  5. Enjoy knowing your visitors before replying to them!

Ninja Forms

  1. Go to your ninja forms editor, and you can see Hitsteps Tracker button! Click on that button and save the form!
    chrome_2016-04-18_16-51-11
  2. Make sure you put Hitsteps tracker as last field in your form. It will be invisible to your users.
  3. That’s all!

Gravity Forms

  1. Go to your Gravity Forms Form Editor and you can see Hitsteps Tracker in list.
    chrome_2016-04-18_17-22-17
  2. Drag hitsteps tracker into your form and Update the form to save changes.
  3. It is all ready 🙂

Manual Integration API

We have manual integration API for those who are not using WordPress, you need to have PHP programming skill to do it or to hire a developer to do it for you. You need to download our wordpress plugin file and look at one of the integrations, say contact form 7 and use that as documentation.

Copy large files between servers

There is an issue we faced while part of our database to another server far far away for performance and stability. However, SCP appears to transfer at 2MB/s where network was 10MB/s. we cancelled transfer and used alternatives.

What are alternatives you can use?

First, you can speed up SCP by turning on compression which will have a slight effect:

scp -C -o 'IPQoS throughput' -o 'CompressionLevel 9'  -c arcfour file

however, there seems to be some issue when transfer time passed 5 minutes, it just get slow and slower due to network latency. Rsync was not an option as we needed a parallel way.

If your both servers are in same data center, then either rsync or scp would do just fine, but in our case, We came up with Axel! it is not quite similar to others, but does job perfectly. It works excellent when data centers are far away.

Axel is a parallel HTTP downloader which support resume, and can download as fast as available bandwidth. Transfer time has been cut down to 30 minutes and 10MB/s (fastest our network support)

A simple command can such as:

axel -a -v -n 8 http://domain.com/somerandomfolder/largefile.zip

can do the job and use maximum capacity of your internet. However be aware that once you copy a file in your HTTP address it will be accessible to the world, make sure URL is kept secret and you delete file from URL as soon as download is finished.

You might need to install axel via

yum install axel
apt-get install axel

DNS Load Balancing vs. Failover: What Multiple A Records Actually Do

Reviewed and substantially updated in August 2026.

Multiple A or AAAA records can spread DNS answers across servers, but they are not automatically a failover system. Load balancing decides how traffic is distributed; failover detects an unhealthy destination and stops sending it new traffic. A resilient design may do both, but the mechanisms and guarantees must be explicit.

DNS load balancing versus failover

ApproachPrimary purposeHealth awarenessImportant limitation
Several A/AAAA records (round robin)Return multiple origin addressesUsually none in plain DNSResolvers and clients may continue using a failed address
Health-checked DNS steeringChange DNS answers according to health or policyConfigured probesCached answers remain until resolvers/clients refresh them
Reverse proxy or load balancerChoose an origin for each connection/requestUsually active and passive checksThe proxy layer and shared dependencies must also be resilient
CDN/edge load balancingRoute at a distributed edgeProvider-specific monitors and steeringRequires correct origin, state, security, and recovery design

What happens with multiple A records

A DNS name can publish several IPv4 A records or IPv6 AAAA records. Authoritative DNS may rotate their order, and recursive resolvers can cache the set. The operating system or application then decides which address to try and whether to retry another one.

This can distribute some new connections, but it does not guarantee an even split. Recursive resolvers aggregate many users, caches have different lifetimes, clients use different address-selection and retry behavior, and long-lived connections do not consult DNS again until they reconnect.

Most importantly, plain round-robin records do not prove that an origin is healthy. If a server is down or its application is returning errors, its address can remain in the cached answer. Some clients may retry another address; others may show an error or wait for a timeout. Do not describe multiple records alone as seamless automatic failover.

TTL helps, but does not eliminate cache delay

The DNS time to live (TTL) tells caches how long an answer may be reused. A lower TTL can make future changes visible sooner, but it does not revoke answers that are already cached. Resolvers can also impose their own minimums, applications may cache independently, and existing connections are unaffected.

Choose TTL as an operational trade-off, not a promise. Very low values increase query volume and still cannot provide request-by-request routing. Before a planned migration, reduce TTL far enough in advance for the old value to expire, then restore an appropriate value after the change is stable.

When round-robin DNS can still be useful

Multiple records can be reasonable when every destination is independently safe to receive traffic, the application tolerates client-side retry behavior, and occasional uneven distribution is acceptable. It can also expose several edge or service addresses where another layer handles failures.

It is a poor fit when a failed address must disappear quickly, requests modify tightly coupled state, users need sticky sessions, origins have unequal capacity, or the application cannot tolerate timeouts during retry.

What health-checked failover adds

A health-aware service probes each origin and changes routing when defined failure thresholds are met. The check should represent readiness to serve traffic, not merely that a machine responds to ping. Define protocol, path, expected status/body, timeout, interval, and the number of consecutive failures and successes.

Health-checked DNS still has propagation and caching behavior. A reverse proxy, application load balancer, or CDN edge can generally make a decision for a new connection or request without waiting for the user’s cached DNS answer to change.

Cloudflare-specific behavior

Cloudflare’s round-robin DNS documentation distinguishes unproxied multi-record DNS from proxied behavior. With DNS-only records, multiple addresses are returned and client behavior matters. With proxied records, users connect to Cloudflare; Cloudflare documents Zero-Downtime Failover for eligible proxied multi-origin records. For configurable health monitors, pools, steering, and automatic failover, Cloudflare provides its paid Load Balancing product.

If that is your platform, use the current Cloudflare automatic IP failover setup guide. Do not use legacy API-v1 scripts or expose a Global API Key.

Prepare the origins before distributing traffic

  • Application versions: deploy compatible code and configuration to every origin.
  • Database writes: choose an architecture with defined consistency and conflict behavior. Do not adopt multi-primary replication merely to make a diagram symmetrical.
  • Sessions: use a shared store, stateless signed sessions, or intentional affinity. Local in-memory sessions do not follow a user to another server.
  • Uploads and files: use shared/object storage or reliable replication, and test read-after-write behavior.
  • Queues and scheduled work: prevent duplicate processing and ensure work survives the loss of one origin.
  • TLS and hostnames: every route must validate and serve the intended name correctly.
  • Security: restrict origin access where appropriate, protect health endpoints, and use least-privilege credentials.
  • Capacity: the surviving route must handle the load it will inherit.

A safe test plan

  1. Map the path from authoritative DNS through resolver/cache, edge or load balancer, origin, session store, database, and third-party dependencies.
  2. Record normal answers and origin health from more than one external network.
  3. Test the dedicated health endpoint and a small set of critical user journeys.
  4. During a maintenance window, withdraw or disable one origin at the routing layer instead of unexpectedly crashing a production server.
  5. Measure detection, cached-answer behavior, new and existing sessions, errors, writes, queue processing, and recovery.
  6. Restore the origin, confirm consecutive healthy results, and watch for flapping or data reconciliation problems.
  7. Document rollback steps and the person authorized to execute them.

Monitor from outside the routing system

A provider’s health probe tells that provider what it can reach. An independent check tells you more about the path a user sees and can reveal a provider-wide, DNS, certificate, or configuration failure. Hitsteps uptime monitoring can serve as one external availability signal; it does not replace application, infrastructure, database, or security monitoring.

Bottom line

Use multiple DNS records when all returned addresses are safe and simple distribution is sufficient. Use health-checked routing when failed destinations must be removed automatically. Use a proxy, load balancer, or edge service when decisions need to happen faster than DNS caches refresh. In every case, resilient routing only works when sessions, data, files, capacity, TLS, health checks, monitoring, and rollback have been designed and tested together.

Cloudflare Automatic IP Failover: A Current, Safer Setup Guide

Reviewed and substantially updated in August 2026.

The old API-v1 script previously published on this page is obsolete and should not be used. Current Cloudflare automatic failover is built around Load Balancing: health monitors check origins, origins are grouped into pools, and a load balancer routes traffic according to health and steering policy.

This guide explains the current design, the prerequisites people often miss, and how to test a failure without turning a maintenance exercise into an outage.

What Cloudflare automatic IP failover does

Cloudflare Load Balancing is a paid add-on that can distribute traffic across origins and steer away from an unhealthy pool. Its core objects are:

  • Monitor: the request Cloudflare sends and the conditions that count as healthy.
  • Origin: an address and port serving the application.
  • Pool: one or more origins, usually representing a location or failure domain.
  • Load balancer: the hostname, pools, fallback pool, and steering policy presented to users.

This is different from simply publishing several A records. Plain round-robin DNS distributes answers but does not necessarily perform active health checks or promptly stop returning a failed origin. See DNS load balancing versus health-checked failover for the architecture trade-offs.

Before you configure failover

A second server is not automatically a safe failover target. Confirm these items first:

  • Application parity: both origins run compatible code, configuration, dependencies, and scheduled jobs.
  • Data consistency: decide how database writes, uploaded files, queues, and caches remain correct during and after a switch.
  • Session behavior: use a shared session store, stateless sessions, or intentional session affinity. Do not assume an in-memory session exists on another server.
  • TLS and host handling: each origin accepts the expected hostname and has the correct origin certificate/configuration.
  • Network access: firewalls allow Cloudflare health probes and proxied traffic without unnecessarily exposing an administrative service.
  • Capacity: the remaining healthy pool can handle the full expected load.
  • Recovery ownership: an operator knows how to diagnose the failed origin and return it safely.

Design a useful health endpoint

A monitor should test the minimum path that proves the origin can serve real traffic. A TCP connection alone says that a port is open; it does not prove the application can answer correctly. Conversely, a check that depends on every downstream integration may cause unnecessary failover when a non-essential service has a brief problem.

A dedicated endpoint such as /healthz can return a small response with an expected status code and body. Consider whether it should verify:

  • the web process is responsive;
  • essential configuration is loaded;
  • a critical database dependency is available;
  • the application is ready to receive traffic rather than merely started.

Keep the response free of secrets and sensitive diagnostics. Protect the endpoint from expensive work, make its result deterministic, and document exactly what “healthy” means.

Configure failover in the Cloudflare dashboard

  1. Create the monitor. Choose protocol, port, path, method, expected status, optional expected body, timeout, interval, and consecutive success/failure thresholds. Cloudflare’s monitor documentation describes the available settings.
  2. Create a primary pool. Add the primary origin or origins and attach the monitor.
  3. Create a secondary pool. Put it in a genuinely separate failure domain where practical, then attach the same monitor or an intentionally different one.
  4. Choose the fallback pool. This is used if other pools are unavailable according to the configured logic, so it must be able to serve the application safely.
  5. Create the load balancer. Select the public hostname, default pool order, fallback pool, TTL/steering options, and any session-affinity behavior your application requires.
  6. Observe health before sending production traffic. Confirm every origin reports the expected state and investigate any flapping.

Cloudflare documents pool composition and health behavior in its Load Balancing pools guide. Names and dashboard placement can change; use the current documentation rather than copying an old screenshot or API call.

If you automate it, use scoped API tokens

Prefer the dashboard for a one-off setup. If infrastructure automation is necessary, use the current Cloudflare API and a narrowly scoped API token. Do not paste a Global API Key into a shell script, source repository, ticket, or monitoring URL. Store secrets in the deployment platform’s secret manager, limit permissions to the required zone/account resources, rotate credentials, and keep an audit trail.

Make automation idempotent: reading the current configuration and applying a defined desired state is safer than a script that blindly swaps addresses. Include validation and a rollback path.

Test the design before relying on it

  1. Record the normal pool and origin health state.
  2. Send a distinctive test request and confirm which origin serves it without exposing that marker to ordinary users.
  3. During a maintenance window, disable the primary origin in Cloudflare or make the dedicated test endpoint fail in a controlled way. Avoid crashing a production host merely to prove routing.
  4. Measure detection time, traffic transition, errors, session continuity, queued work, and user-visible behavior.
  5. Restore the primary, wait for consecutive successful checks, and confirm recovery does not cause a second disruption.
  6. Write down the evidence and adjust thresholds if normal latency causes false failures.

Also test a partial failure: an application can return HTTP 200 while logins, checkout, uploads, or database writes are broken. Synthetic checks for critical user journeys may be needed in addition to the routing health endpoint.

Monitoring and failover are separate responsibilities

Cloudflare’s monitor informs Cloudflare’s routing decision. An independent external monitor helps confirm what a user can reach and can alert an operator if all routes fail or the DNS/CDN layer itself is affected. Hitsteps uptime monitoring can be one external availability signal; analytics traffic is not a health check and should never control failover.

Keep alerts actionable: include the hostname, affected pool/origin, failing condition, start time, runbook, and owner. Avoid putting API tokens or sensitive health-response details in an alert URL.

Rollback plan

Before launch, export or document the prior DNS and Load Balancing configuration. Define who can:

  • disable a failing origin;
  • restore the previous pool order or hostname record;
  • freeze writes if data consistency is uncertain;
  • verify recovery from outside Cloudflare;
  • reconcile sessions, queues, uploads, and database changes after the event.

Automatic routing reduces time spent sending users to a known unhealthy origin. It does not solve state replication, software defects, capacity shortfalls, or a dependency shared by every pool. Treat failover as one tested layer in a broader recovery plan.

How fast are SSD servers? Performance comparison between HDD vs SSD

SSD make difference!

We’ve been hearing that SSD hard disks are new generation and therefor, all database intensive servers have to move to new SSD servers. We gave it a shot and we never regret it!

In hitsteps, we analyze thousands of hits per seconds. this hits then categorized and processed by a background processor, and archived somewhere along with millions of other hits!

Given searching a visitor or looking back into archive of a visitor is an essential feature of hitsteps, we always had to struggle with performance of database searches, specially when searching for some visitors who visited months ago.

MySQL databases need RAM to hold all indexes of data, they also need a fast disk in case data are not in RAM. so we did the test in a mirrored server:

Our search parameter was a simple query of “Searching for a visitor for who visited hitsteps dashboard who are from Canada since 6 months ago”

HDD server took 45 seconds to return query (almost near to timeout in most apache web server setups). SSD server took only 6 seconds to return query. Going to page number 2 in HDD took 15 seconds, in SSD just a wee 2 seconds.

It worth mentioning all other simple queries take less than 0.2 seconds in SSD servers and 0.5 in HDD servers.

Please do note that this times are closed source and relative to our script and codes. It might be different with other Applications, codes and scripts you might use in your server. RAM also play a major role here which is more appearance if your server is using HDD.

Make widgets in your plugin compatible for WordPress v4.3

WordPress v4.3 is just a week and half away to be released and it is a major update for developers!

WordPress team being innovative again and deprecated PHP4 style classes in old WordPress, therefor, your plugin is going to show an ugly error in case you use WP_Widget class to show a widget in your website sidebar.

We use hitsteps live support widget and statistics widget in our plugin, so we had to update our codes too and…

Here is what to do!

Open your editor and search for any reference to “extends WP_Widget”

2015-08-09_01-18-49

Your widget class have a name, and most probably (PHP4 style), name of your plugin is used as a function inside of same class. Look here, here’s ours:

2015-08-09_01-22-06

Now, change function name to __construct(). this is new way of defining default function of a class.

And inside of that function, you’ll have a code that call WP_Widget.
It can be parent::WP_Widget, $this->WP_Widget, {something}->WP_Widget… which all are deprecated!

You have to change that to parent::__construct(…);

Here is how it should look like after you done all this changes:

2015-08-09_01-26-15

Number of “extends WP_Widget” lines you have match number of widgets your plugin create. You’ll need to repeat this process for each of them.

Congrats! Your plugin is officially compatible with WordPress v4.3

If you wish to read more about this, you can read this and this from official WordPress team.

We have just released our update for WordPress v4.3 users today, so you can expect a smooth upgrade to new WordPress regarding our analytics service 🙂