Zapier, Terraform, React and WordPress

Embed
Preview of the card
<a href="https://forumulate.com/guides/zapier-terraform-react-wordpress"><img src="https://forumulate.com/guides/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/36aa4df0-1e95-4cef-8ae9-795169441345/pages/9598c75d-13fc-4b2e-b16c-b98b04767993/social-card.svg?v=3e7ae33eec8b" alt="Zapier, Terraform, React and WordPress" width="600" height="315"></a>

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.

@forumulate/react

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

forumulate_status_component

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 confirm_regions, strip length and uptime figure.

<space_id>/<component_id>

forumulate_status_groups

The page's whole group arrangement, in order. One per page.

<space_id>

forumulate_status_incident_template

An incident template, and the words for each later step.

<space_id>/<template_id>

forumulate_status_metric

A custom metric's settings. Your systems push the points.

<space_id>/<key>

forumulate_status_page (data source)

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

status.incident.created (incidents and maintenance windows)

Incident Updated

status.incident.updated

Incident Resolved

status.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 (notice, minor, major, critical, maintenance) and a state. Save as a draft keeps it unpublished, and nobody is told.

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. automatic hands it back to its checks.

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}/webhooks with url and events; 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: Bearer header 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

GET /orgs/{orgId}/automation/me

Tests the connection and names the token's owner.

GET /orgs/{orgId}/automation/forums

The forums the token may use.

GET /orgs/{orgId}/spaces/{forumId}/automation/triggers/{trigger}?limit=25

Polling: the newest items of new_topic, new_reply or topic_solved, as { items }.

POST /orgs/{orgId}/spaces/{forumId}/automation/hooks

Subscribe: { "trigger": "new_topic", "targetUrl": "https://hooks.zapier.com/…" }. Answers the subscription id and, once, its signing secret. Staff only (forum.moderate).

GET /orgs/{orgId}/spaces/{forumId}/automation/hooks

The forum's subscriptions.

DELETE /orgs/{orgId}/spaces/{forumId}/automation/hooks/{id}

Unsubscribe. A receiver answering 410 Gone unsubscribes too.

POST /orgs/{orgId}/spaces/{forumId}/automation/actions/topics

Post a topic: { title, body, category?, tags? }. Markdown body; category by slug or id.

POST /orgs/{orgId}/spaces/{forumId}/automation/actions/replies

Post a reply: { topic, body }, the topic by id or slug.

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/react

Status 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

org, space

the provider's

The status page to read.

pollMs

60000

Re-read this often. 0 reads once. The answer is cached at the edge for seconds, so polling faster only re-reads the same answer.

share

none

A share token, to preview a private page.

apiBase

Forumulate's

Another API address.

dark

false

Badge and banner: use the owner's dark palette.

className, style

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

[forumulate_events space="SPACE_ID" limit="5" tag="meetup"]

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.

[forumulate_event space="SPACE_ID" slug="launch-party" part="register"]

One event's registration (tickets or RSVP), agenda, speakers or card, as Forumulate's own embed.

[forumulate_course space="SPACE_ID" style="button"]

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

token (a private app's token)

lifecycleStage

A contact, created or updated by email, with first and last name.

Salesforce

instanceUrl, clientId, clientSecret (a connected app with the client-credentials flow)

object (Lead or Contact), leadSource, company

A Lead (source Event unless you set one) or a Contact, with the event in its description.

Mailchimp

apiKey

listId, tag

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

apiKey

none

Your key. Leave it out to keep the stored one.

listId

""

Mailchimp: the audience.

tag

""

The tag learners are given (Kit: the tag to apply).

onEvents

["enrolled"]

When to sync: enrolled, completed, or both.

enabled

false

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, and application.created, application.stage_changed and application.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

AutomationHooks_poll

GET /orgs/{orgId}/spaces/{spaceId}/automation/triggers/{trigger}

Get the trigger

client.forum.automationsHooks.poll()

AutomationHooks_listHooks

GET /orgs/{orgId}/spaces/{spaceId}/automation/hooks

List hooks in a space

client.forum.automationsHooks.listHooks()

AutomationHooks_subscribe

POST /orgs/{orgId}/spaces/{spaceId}/automation/hooks

Create a hook in a space

client.forum.automationsHooks.subscribe()

AutomationHooks_unsubscribe

DELETE /orgs/{orgId}/spaces/{spaceId}/automation/hooks/{hookId}

Delete the hook

client.forum.automationsHooks.unsubscribe()

AutomationHooks_createTopic

POST /orgs/{orgId}/spaces/{spaceId}/automation/actions/topics

Create a topic in a space (automation actions)

client.forum.automationsHooks.createTopic()

AutomationHooks_reply

POST /orgs/{orgId}/spaces/{spaceId}/automation/actions/replies

Create a reply in a space (automation actions)

client.forum.automationsHooks.reply()

Course Email Sync

Operation

Request

What it does

Shortcuts

CourseEmailSync_list

GET /orgs/{orgId}/spaces/{spaceId}/course/email-sync

Get the email sync in a space

client.courses.emailSync.list()

CourseEmailSync_save

PUT /orgs/{orgId}/spaces/{spaceId}/course/email-sync/{provider}

Replace the email sync

client.courses.emailSync.save()

CourseEmailSync_remove

DELETE /orgs/{orgId}/spaces/{spaceId}/course/email-sync/{provider}

Delete the email sync

client.courses.emailSync.remove()

The Forumulate teamUpdated