Zapier, Terraform, React and WordPress
The packages and connections that put Forumulate into other tools: the Terraform provider for status pages, Zapier and Make, the REST hooks behind them, @forumulate/react, the WordPress plugins, and the CRM and email-tool syncs for events and courses.
Some of these are listed in a public directory and some are not yet. The Zapier app directory, the Terraform Registry and the WordPress.org plugin directory each need Forumulate to publish the package from its own account. Until a package is listed, this page tells you what works today instead, and it never assumes you can install something you cannot.
Package | What it does | Where it stands |
|---|---|---|
Terraform provider | Status page components, groups, incident templates and metrics as code | Not yet on the Terraform Registry. Use the API until it is. |
Zapier app | Status incidents, course and event activity as triggers; incidents, enrolments and coupons as actions | Not yet in the Zapier app directory. Use webhooks or REST hooks with Zapier's own webhook steps. |
Forum REST hooks (Zapier and Make) | New topic, new reply and solved topic as triggers; post a topic or reply | Works today with any token, in Zapier or Make. |
| Comments, search, changelog and feed components; status badge and banner | On npm. The status components ship in its next release. |
WordPress: comments and feeds | Comments, docs search, changelog bell, feeds | Download from GitHub and upload. Not yet on WordPress.org. |
WordPress: events and courses | Events list, event registration, course card and buy button | Not yet downloadable. |
HubSpot, Salesforce, Mailchimp, Kit | Event registrants and course learners sent to your CRM or email tool | In the product. Needs your own key. |
The Terraform provider
terraform-provider-forumulate manages a status page as code. It calls the same API the console uses, with a personal access token, so it can do exactly what a person holding that token can.
Resource or data source | What it manages | Import id |
|---|---|---|
| One component: any probe kind (HTTP, heartbeat, TCP, UDP, ping, DNS, TLS, SMTP, IMAP, POP3, domain, browser), a manual component, a rolled-up page or a mirrored vendor page. Its group, display, interval, thresholds, keyword, probe regions and |
|
| The page's whole group arrangement, in order. One per page. |
|
| An incident template, and the words for each later step. |
|
| A custom metric's settings. Your systems push the points. |
|
| The page's overall state, headline and number of open incidents. Needs no token. | none |
The provider reads FORUMULATE_TOKEN, FORUMULATE_ORG_ID and, optionally, FORUMULATE_API_URL from the environment.
terraform {
required_providers {
forumulate = { source = "forumulate/forumulate" }
}
}
provider "forumulate" {}
resource "forumulate_status_groups" "page" {
space_id = var.status_space_id
group {
name = "Core"
description = "What every customer touches."
}
group {
name = "Integrations"
layout = "grid-2"
hide_uptime = true
}
}
resource "forumulate_status_component" "api" {
space_id = var.status_space_id
name = "API"
url = "https://api.example.com/health"
group = "Core"
regions = ["eu-west", "us-east"]
confirm_regions = 2
bar_days = 90
interval_seconds = 60
}
resource "forumulate_status_component" "nightly_backup" {
space_id = var.status_space_id
name = "Nightly backup"
kind = "heartbeat"
interval_seconds = 90000
}
output "backup_ping_url" {
value = forumulate_status_component.nightly_backup.ping_url
}What you need to set up
Today: the provider is not yet on the Terraform Registry, so terraform init cannot fetch forumulate/forumulate. Forumulate publishes it there from its own registry account. Until then, manage the same objects with the status API (components, groups, templates and metrics are all under /orgs/{orgId}/spaces/{spaceId}/status/) from a script or CI, with a token from API tokens, scopes and capabilities. When the provider is listed, the configuration above works as written. The token is yours: a personal access token with access to the status space.
Zapier
The Forumulate Zapier app signs in with a personal access token and your organization id. Its triggers are instant: turning a Zap on creates an organization webhook aimed at Zapier, confined to the one event (and the one space, when you pick one), and turning the Zap off deletes it.
Trigger | Event |
|---|---|
New Incident |
|
Incident Updated |
|
Incident Resolved |
|
Learner Enrolled, Lesson Completed, Quiz Passed, Quiz Failed, Quiz Needs Review, Course Completed, Certificate Issued, Course Purchased, Course Refunded | the course events of the same names |
Event Published, Event Updated, Event Cancelled, New RSVP, RSVP Updated, RSVP Cancelled, Attendee Checked In | the event and RSVP events of the same names |
Action | What it does |
|---|---|
Create Incident | Opens an incident with a title, a Markdown message, a severity ( |
Post Incident Update | Adds an update and can move the incident to a new state. |
Set Component State | Declares a component's state by hand. |
Enrol in Course | Enrols people by email. People without an account are invited. It can give a seat in a paid course and put them in a cohort. |
Create Course Coupon | Creates a discount code: percent or amount off, with an optional number of uses. |
What you need to set up
Today: the app is not yet in the Zapier app directory. Forumulate publishes it from its Zapier developer account. Until it is listed, build the same Zaps with Zapier's own Webhooks by Zapier steps:
For a trigger, create a Catch Hook in Zapier and point an organization webhook at its address for the events you want (
POST /orgs/{orgId}/webhookswithurlandevents; see Webhooks for the full list, the filters and how to verify the signature).For an action, use a Webhooks by Zapier POST or PUT to the API, with an
Authorization: Bearerheader carrying your personal access token.
For a forum, the REST hooks below already speak Zapier's protocol.
Forum REST hooks, for Zapier and Make
A forum exposes its own trigger and action endpoints for Zapier and Make scenarios. They authenticate with a personal access token (Authorization: Bearer <token>), and the token's scopes and space limits apply.
Call | What it does |
|---|---|
| Tests the connection and names the token's owner. |
| The forums the token may use. |
| Polling: the newest items of |
| Subscribe: |
| The forum's subscriptions. |
| Unsubscribe. A receiver answering 410 Gone unsubscribes too. |
| Post a topic: |
| Post a reply: |
Each item is flat, because Zapier's field mapper shows nested objects badly: id, trigger, topicId, postId, title, url, excerpt, authorName, categoryName, tags, createdAt and more. The polled item and the hooked delivery are built from the same source, field for field, so a Zap tested on a polled sample does not break on its first live delivery. De-duplicate on id. A solved topic's id combines the topic and its answer, so re-solving with a different answer fires again, and the same solve seen twice (by poll, then by hook) fires once.
Deliveries are signed x-forumulate-signature: v1,sha256=… with the subscription's own secret. targetUrl must be a public https address. The actions follow every rule a member's post follows. In the console: Integrations → Zapier and Make lists every subscription.
Make uses the same endpoints: an HTTP module with the bearer token for polling and actions, and a Custom webhook address as the hook's targetUrl.
@forumulate/react
React components and hooks for Forumulate on your own React site: comments, the docs search box, the changelog bell, a content feed and typed content hooks. Installation and the other components are in SDKs and integrations.
npm install @forumulate/reactStatus in your own chrome. useStatus(), ForumulateStatusBadge and ForumulateStatusBanner read a status page's public widget.json, the same answer the hosted floating widget draws, so your banner and the widget never disagree. They render plain elements in the page owner's own state colours, without a third-party script on the page.
import { ForumulateProvider, ForumulateStatusBadge, ForumulateStatusBanner } from '@forumulate/react';
<ForumulateProvider org="<org-id>" space="<status-space-id>">
<ForumulateStatusBanner /> {/* one line per open incident or maintenance; nothing when all is well */}
<footer><ForumulateStatusBadge /></footer> {/* a dot and the page's headline, linking to the page */}
</ForumulateProvider>Option | Default | What it does |
|---|---|---|
| the provider's | The status page to read. |
|
| Re-read this often. |
| none | A share token, to preview a private page. |
| Forumulate's | Another API address. |
|
| Badge and banner: use the owner's dark palette. |
| none | Your own styling. |
useStatus() answers { data, error, loading }, where data holds the page, its overall state and headline, and the active incidents and maintenance windows.
Today: @forumulate/react is on npm. The status hook and the two status components are in its next release. Until then, the hosted status widget and the iframe status card (/card?embed=1) give the same information without code. See Status pages.
WordPress
Comments, docs search, changelog and feeds. A plugin with a settings page, a Forumulate block and shortcodes. It can replace WordPress comments on the post types you choose, and shows blog, changelog or docs feeds read on your server. Its setup is in SDKs and integrations. Today: download it from github.com/forumulate/wordpress as a ZIP, then go to Plugins → Add New → Upload Plugin. It is not yet in the WordPress.org directory, which is where Forumulate lists it from its own account.
Events and courses. A second plugin, "Forumulate — Events and Courses" (WordPress 6.2, PHP 7.4), adds three blocks and three shortcodes:
Shortcode | Shows |
|---|---|
| Upcoming events, fetched by your WordPress server from the public API, cached for five minutes and printed as plain HTML. Readers' browsers make no request to Forumulate for it. |
| One event's registration (tickets or RSVP), agenda, speakers or card, as Forumulate's own embed. |
| A course card, or just its buy button. Checkout opens on Forumulate in a new tab. |
The blocks are "Forumulate events", "Forumulate event" and "Forumulate course". Settings → Forumulate takes your organization id, and "Forumulate site address" when your calendar or course is on your own domain. No token is needed. Registration and payment stay in Forumulate's own embeds, because a payment page must be ours rather than re-implemented in a theme. Today: this plugin is not yet downloadable. It will install the same way, as an upload, until it is listed on WordPress.org.
CRM and email-tool sync
These run inside Forumulate with your own credentials. They are encrypted, write-only (never shown again), and dark until they are both stored and switched on.
Event registrants: HubSpot, Salesforce, Mailchimp
Every registrant who is going is sent to your tool, tagged with the event.
Provider | Credentials | Settings | What we write |
|---|---|---|---|
HubSpot |
|
| A contact, created or updated by email, with first and last name. |
Salesforce |
|
| A Lead (source |
Mailchimp |
|
| An audience member, tagged with your tag and the event's name. |
curl -X PUT "https://forumulate.com/api/orgs/$ORG/events-network/integrations/hubspot" \
-H "Authorization: Bearer $FORUMULATE_TOKEN" -H "Content-Type: application/json" \
-d '{ "credentials": { "token": "'"$HUBSPOT_TOKEN"'" }, "settings": { "lifecycleStage": "lead" }, "enabled": true }'GET /orgs/{orgId}/events-network/integrations shows each provider's credentialsSet, enabled, lastError and lastSyncedAt. DELETE …/{provider} removes one. These calls need org.manage_settings. In the console they are in the events network panel.
Course learners: Mailchimp, Kit
PUT /orgs/{orgId}/spaces/{spaceId}/course/email-sync/{provider}, where provider is mailchimp or convertkit (Kit):
Field | Default | What it does |
|---|---|---|
| none | Your key. Leave it out to keep the stored one. |
|
| Mailchimp: the audience. |
|
| The tag learners are given (Kit: the tag to apply). |
|
| When to sync: |
|
| Nothing is called until this is on and a key is stored. |
Mailchimp members are added as transactional, so nobody is put on a marketing list they did not ask for; your tag marks them. Needs courses.manage. In the studio this is the course's mail panel.
Everything else
Careers and legal: the webhook events (
legal.access_requested,legal.privacy_requested, andapplication.created,application.stage_changedandapplication.offer_answered) are the way into a CRM. Point a webhook, or a Zapier Catch Hook, at them. See Webhooks.Forums: Zendesk and Salesforce help-desk escalation and Telegram are per-organization integrations. See Community spaces.
Forms: Airtable, Notion and Google Sheets delivery is in Forms.
In the API
Every operation below is also reachable from the other surfaces without a dedicated command. forumulate api <Operation> calls it from the CLI, the JavaScript SDK has a typed method for each one (the last column names it; the Python and Go clients are generated from the same spec), and an agent reaches the organization-scoped ones through the MCP call_api tool. Where a CLI command or MCP tool exists too, the last column names it. Operation names link to the API reference.
Automation Hooks
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the trigger |
| |
| List hooks in a space |
| |
| Create a hook in a space |
| |
| Delete the hook |
| |
| Create a topic in a space (automation actions) |
| |
| Create a reply in a space (automation actions) |
|
Course Email Sync
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the email sync in a space |
| |
| Replace the email sync |
| |
| Delete the email sync |
|