Brandfine Docs
WordPress

Appointments widget

Embed a booking widget on any WordPress page or post using the [brandfine_appointments] shortcode or the matching Gutenberg block.

The appointments widget renders a calendar + slot picker + booking form on any WordPress page. Visitors pick a slot, submit, and the request lands in your Brandfine appointments inbox where you approve, reschedule, or cancel.

Activate appointments on your workspace first

Before the widget can render slots, the Appointments plugin must be active on the workspace you've connected. Configure business hours, slot duration, notification settings, and any custom policy text in the Brandfine CMS:

  1. Brandfine → Plugins → Appointments → Activate
  2. Set business hours, slot duration (15/30/45/60 min), booking window (how far in advance visitors can book), lead time (how close to "now" they can book), policy text

If the plugin isn't active, the WordPress widget shows a polite "no slots available" empty state.

Shortcode

Paste this anywhere you'd paste a shortcode — classic editor, widget areas, page builders (Elementor, Beaver Builder, Divi), inside a Gutenberg "Shortcode" block, footer/header builders:

[brandfine_appointments]

That's it. The widget will fetch availability, render the picker, accept a booking, and show a "request received" state.

Supported attributes

AttributeDefaultWhat it does
titleBook a timeHeading displayed at the top of the widget
introPick a time that works for you and we'll confirm by email.Subtitle below the heading. Set to empty string to hide.
aligncenterOne of left, center, right. Horizontal alignment of the widget inside its container.

Example:

[brandfine_appointments
  title="Book a consultation"
  intro="Choose any 30-min slot — we'll confirm by email within a day."
  align="left"]

Gutenberg block

In the block editor → + → search "Brandfine"Brandfine Appointments (calendar icon, Widgets category).

The block ships an inspector sidebar where you can edit title, intro, and align without touching the shortcode. The block preview in the editor is intentionally non-interactive — the real widget only fires on the published page.

What visitors see

  1. Loading skeleton for ~300ms while availability fetches
  2. Calendar grid with a small dot on every day that has bookable slots
  3. Click a highlighted day → slot grid renders below ("9:00 AM", "9:30 AM", …)
  4. Click a slot → booking form (name, email, phone optional, message optional)
  5. Submit → "Request received" success card
  6. Click "Book another time" → loops back to the picker

All times are rendered in the visitor's timezone (not the workspace's). The requestedAt field sent to Brandfine is the exact UTC ISO string the visitor saw rendered, so there's no ambiguity about which slot they actually picked.

What happens after submission

  1. Brandfine creates a PENDING AppointmentRequest row tied to your workspace
  2. You receive an in-app notification + an email
  3. The visitor receives an "we got your request" confirmation
  4. In your Brandfine appointments inbox: Confirm, Reschedule, or Decline — each action emails the visitor
  5. The widget on the WordPress page is unchanged — visitors don't see the workflow, just the eventual confirm/cancel email

Common gotchas

The widget shows "We hit a snag — page expired" — your nonce expired. Refresh the page. Nonces are valid for 24 hours; the widget mints a fresh one on every page load.

The widget shows "We hit a snag — too many requests" — you hit the per-IP rate limit. POST (booking submission) is capped at 10 per 5 minutes, GET (availability fetch) at 60 per minute. Reach out to support if you have a legitimate use case that needs higher caps.

No dots on any calendar day — appointments isn't active on the connected workspace, or you've set business hours so narrow that no slots fit. Check the workspace's appointments config in the Brandfine CMS.

Visitor sees the widget but admin sees an amber warning — the API key isn't connected (or it's been disconnected since you embedded the shortcode). Reconnect via WP admin → Brandfine.

On this page