Back to Overview

reCAPTCHA Bot Protection

Protect your signup and booking forms from bots with Google reCAPTCHA v3, which checks visitors invisibly without a puzzle or checkbox.

Luka Breitig, Software Engineer & AI Developer
Luka Breitig

Zaktualizowano: 10 kwietnia 2026

Before You Begin

You will need:

  • A Google account with access to google.com/recaptcha/admin
  • A publicly accessible production domain for your Tymeslot instance (e.g., tymeslot.yourdomain.com). reCAPTCHA tokens are bound to a domain and do not work on localhost
  • Access to your Tymeslot instance's environment variables

By the end of this guide, invisible reCAPTCHA v3 checks every submission to your signup and booking forms and rejects likely bots.

How reCAPTCHA v3 Works

reCAPTCHA v3 (also called "invisible CAPTCHA" or "score-based CAPTCHA") runs in the background. Google scores each submission from 0.0 (very likely a bot) to 1.0 (very likely human) based on behaviour signals, and Tymeslot rejects submissions below your minimum score. Real visitors never see a challenge.

Do not confuse it with reCAPTCHA v2 (the "I'm not a robot" checkbox, a different product) or hCaptcha (a different provider entirely). Tymeslot integrates with v3 only.

reCAPTCHA is optional and off by default. If Google's verification service cannot be reached, Tymeslot accepts the submission rather than lose a booking; its honeypot field and rate limits still apply. The next section helps you decide whether to turn reCAPTCHA on.

Should You Enable reCAPTCHA?

Turn reCAPTCHA on if you see either of the following:

Bot Registrations

A surge of accounts with random email patterns (e.g., xk3m9@mailinator.com ) points to automated account creation. Bots target open signup forms to harvest confirmed email addresses or abuse free accounts, and reCAPTCHA's scoring stops these scripts before they finish registering.

Spam Bookings

Meetings booked with fake names or throwaway addresses clutter your calendar and send confirmation emails to addresses no one reads. Booking forms are especially exposed because they need no login. With reCAPTCHA on the booking form, a low minimum score blocks scripted submissions without affecting real visitors.

Credential Stuffing

reCAPTCHA does not cover the sign-in form, so it is not the defence against bots cycling through leaked username and password lists. Tymeslot handles that on its own: it rate-limits sign-in attempts and throttles an account after ten failed logins within an hour, whether or not reCAPTCHA is on.

You can skip reCAPTCHA on a small or private deployment where you share your scheduling link only with people you know and registration is closed.

1 Create a reCAPTCHA Site

  1. Go to google.com/recaptcha/admin and click the [+] button in the top-right corner to create a new site.
  2. Set Label to something identifiable, such as Tymeslot Production.
  3. Under reCAPTCHA type, select [Score based (v3)]. Do not select v2: it shows users a checkbox challenge, and Tymeslot does not support it.
  4. Under Domains, add your production domain exactly as it appears in the browser address bar, for example tymeslot.yourdomain.com. Do not include https:// or a trailing slash.
  5. Accept the terms of service and click [Submit].
  6. You are shown a [Site Key] and a [Secret Key]. Copy both for the next step. The site key is public and embedded in your pages; the secret key is private and stays on your server.

2 Configure Environment Variables

Add the following environment variables to your Tymeslot instance, then restart it. Both minimum scores default to 0.3 and the actions default to the values shown, so you can leave those lines out unless you want different values. Each of these lines you set fixes that setting, and the admin panel's Authentication tab shows it greyed out. Leave a line out to switch that check, or change that score, from the Authentication tab with no restart.

# reCAPTCHA v3 keys from google.com/recaptcha/admin
RECAPTCHA_SITE_KEY=6Le...your-site-key
RECAPTCHA_SECRET_KEY=6Le...your-secret-key

# Accepted hostname — only tokens generated on this domain are accepted.
# Prevents token replay attacks (see explanation below).
RECAPTCHA_EXPECTED_HOSTNAMES=tymeslot.yourdomain.com

# Protect the signup form
RECAPTCHA_SIGNUP_ENABLED=true
RECAPTCHA_SIGNUP_MIN_SCORE=0.5
RECAPTCHA_SIGNUP_ACTION=signup_form

# Protect the booking form
RECAPTCHA_BOOKING_ENABLED=true
RECAPTCHA_BOOKING_MIN_SCORE=0.3
RECAPTCHA_BOOKING_ACTION=booking_form

Why does RECAPTCHA_EXPECTED_HOSTNAMES matter?

Google reports the hostname each token was generated on, but Tymeslot only checks it when this variable is set. Without it, an attacker could generate a valid token on their own site and replay it against your instance. Set it to your exact domain (several domains can be comma-separated) and Tymeslot rejects any token generated elsewhere.

Score Thresholds

Google scores each interaction from 0.0 to 1.0, and Tymeslot blocks submissions that score below your minimum. Use this scale as a guide:

0.0 Very likely a bot: automated traffic with no human signals
0.3 Suspicious: the default, and the recommended minimum for booking forms
0.5 Neutral: recommended minimum for signup forms
0.7 Likely human: a confident interaction pattern
1.0 Very likely human: strong human interaction signals

Why different thresholds for signup and booking? People often reach a booking form straight from a scheduling link someone sent them. They are real, but Google may score them lower because they have no history with your site, so a lower minimum (0.3) avoids turning them away. Signup forms attract more determined bots and can use a higher minimum (0.5): a false positive only means the person tries again.

Do Not Set Thresholds Above 0.7

Minimum scores above 0.7 block real users, especially those on older devices or mobile connections, or with browser extensions that interfere with reCAPTCHA's signals. Start low and raise the minimum only if bot traffic continues.

Development Environment

reCAPTCHA stays off unless you set its enabled flags and both keys, so leave the variables out of your local .env file and every form accepts submissions as normal. If you do set them locally, Google rejects tokens from localhost unless you add it to your site's domains.

Enable reCAPTCHA in Staging First

Before rolling out to production, deploy to a staging environment with reCAPTCHA on. Submit a real booking from a browser, then open google.com/recaptcha/admin, select your site, and view the [Analytics] tab to confirm the score appeared. This proves the whole flow works before real users depend on it.

Monitoring Score Distributions

Once reCAPTCHA is live, use Google's admin console to see how your real visitors score and decide whether to adjust your minimum scores:

  1. Go to google.com/recaptcha/admin and select your site.
  2. Click the [Analytics] tab.
  3. Review the score distribution. If most of your traffic scores above 0.7, your minimums are well set. If many submissions cluster just around your minimum, check whether real users are being blocked.

Troubleshooting

Legitimate users are blocked from completing a booking

Lower RECAPTCHA_BOOKING_MIN_SCORE to 0.2 or 0.1 and watch the reCAPTCHA admin console to see whether the score distribution shifts. Users on mobile, or with some browser extensions, can score lower than expected.

reCAPTCHA tokens are always rejected

Check that RECAPTCHA_EXPECTED_HOSTNAMES exactly matches your production domain, with no trailing slash and no https:// prefix. Use the bare hostname as it appears in the browser address bar. Also confirm the action variables, if you set them, still match the defaults shown in Step 2.

reCAPTCHA appears to be doing nothing

Verify that the Site Key in your environment variables matches the one shown in the reCAPTCHA admin console, and that the secret key is set too. Without both keys, Tymeslot skips verification. Also confirm that RECAPTCHA_SIGNUP_ENABLED or RECAPTCHA_BOOKING_ENABLED is set to true (not 1 or yes).

❓ Frequently Asked Questions

reCAPTCHA is configured, but the booking form still submits without any visible check. Why?

That is expected. reCAPTCHA v3 is invisible: it runs in the background and never shows the user a challenge. If you suspect it is not running at all, open the reCAPTCHA admin console at google.com/recaptcha/admin, select your site, and check the Analytics tab. If no scores appear after submitting the form, verify that RECAPTCHA_SITE_KEY is correct and that your domain is registered under the site key settings.

What reCAPTCHA version does Tymeslot use?

Tymeslot uses reCAPTCHA v3 only. Users never see a checkbox or image puzzle. Google observes behaviour signals in the background and returns a score between 0.0 (likely a bot) and 1.0 (likely human), and Tymeslot rejects submissions that score below your minimum.

Can I use reCAPTCHA v2 (the 'I'm not a robot' checkbox) instead?

No. Tymeslot supports reCAPTCHA v3 scoring only, and a v2 site key will not work because the two versions use different APIs and token formats. When you create your site in the reCAPTCHA admin console, select Score based (v3).

How do I register my domain with reCAPTCHA?

In the Google reCAPTCHA admin console at google.com/recaptcha/admin, open your site's settings and locate the Domains section. Add your domain exactly as it appears in the browser address bar, for example tymeslot.yourdomain.com , without the https:// prefix or a trailing slash. Listing a domain also covers its subdomains.

Users on localhost cannot complete the booking form after enabling reCAPTCHA. Why?

reCAPTCHA v3 validates tokens against a registered domain list. localhost is not on that list by default. You can add it in the reCAPTCHA admin console under your site key's Domains settings. Alternatively, leave localhost unregistered and do not set the reCAPTCHA variables on your local instance, so reCAPTCHA stays off there.

Verification Checklist

Confirm each item before you treat reCAPTCHA as live:
  • reCAPTCHA site created in Google admin console with type Score based (v3)
  • Your production domain is listed under Domains in the Google console (no https:// prefix)
  • Both RECAPTCHA_SITE_KEY and RECAPTCHA_SECRET_KEY are set in environment variables
  • RECAPTCHA_EXPECTED_HOSTNAMES is set to your exact production domain
  • Tymeslot restarted after environment variable changes
  • A real booking was submitted from a browser in staging and the score appeared in the reCAPTCHA [Analytics] tab
  • The booking went through (so the minimum score is not too strict)

🔗 Related Articles

Read Data-at-Rest Encryption

Data-at-Rest Encryption

Encrypt integration credentials at rest with a dedicated DATA_ENCRYPTION_KEY, decoupled from SECRET_KEY_BASE. Covers enabling the key, migrating existing credentials, key backup, and rotation.

Read Google OAuth App Setup

Google OAuth App Setup

Set up a Google OAuth app in Google Cloud Console. One app powers Google Login, Calendar sync, and Meet rooms for Tymeslot. Covers API enabling and consent screen.

Read Sync Tymeslot with Google Calendar

Sync Tymeslot with Google Calendar

Connect Tymeslot to Google Calendar. Busy, Tentative and Out of Office events all block bookings, so you are never double-booked, and every booking is added to your calendar.