FFraym
Menu

Webhooks

Send Fraym events to any HTTPS endpoint. Unlike a plain activity feed, Fraym can notify you when an idea reaches a strong signal, so you can act, not just log.

How it works

Add a destination under your workspace Integrations page. Choose the events you care about. When one fires, Fraym sends a signed JSON POST to your URL. Each delivery is signed with HMAC SHA-256 so you can verify it came from Fraym.

Events

EventWhen it fires
idea.createdA visitor submitted a new idea (pending review).
idea.approvedA founder approved an idea, so it is now public.
idea.status_changedAn idea moved across the roadmap (planned, in progress, shipped).
idea.strong_signalAn approved idea reached a strong signal score. Sent once per idea.
changelog.publishedA changelog post was published.

Headers

Example payload

{
  "event": "idea.strong_signal",
  "id": "f1e2d3c4-...",
  "version": "1",
  "timestamp": "2026-06-18T12:00:00.000Z",
  "workspace": {
    "slug": "acme",
    "board_url": "https://fraym.dev/b/acme"
  },
  "data": {
    "idea": {
      "id": "9a8b7c6d-...",
      "title": "SSO and SAML login",
      "status": "under_review",
      "vote_count": 47,
      "comment_count": 2,
      "signal_score": 84
    }
  }
}

Verifying the signature

Compute the HMAC SHA-256 of `${timestamp}:${rawBody}` with your destination signing secret, then compare it to the h1value in the signature header. The secret is shown only once when you create the destination.

// Node. Recompute the HMAC and compare in constant time.
import crypto from "node:crypto";

function verify(rawBody, header, secret) {
  // header looks like: ts=1718712000;h1=<hex>
  const parts = Object.fromEntries(header.split(";").map((p) => p.split("=")));
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${parts.ts}:${rawBody}`)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(parts.h1)
  );
}

Delivery and retries

Deliveries are sent once. Fraym records the last status on each destination. Automatic retries are not available yet and are planned for a later release. Respond with a 2xx status quickly; long-running work should be queued on your side.

Slack decision alerts

Instead of a raw webhook, add a Slack destination to post clean, founder-style alerts to a channel. Slack is decision-first: it sends a strong-signal alert, a changelog-published alert, and optionally status changes. It does not post every new idea.

  1. In Slack, add an app and enable Incoming Webhooks, then choose a channel.
  2. Copy the webhook URL (it looks like https://hooks.slack.com/services/...).
  3. In Fraym, open Integrations, choose Slack, paste the URL, pick your alerts.
  4. Use Send test to confirm. The test message reads “Fraym Slack test alert”.

A strong-signal alert reads like: “Strong signal detected: SSO and SAML login just reached 84 signal with 47 votes. Heavy lift. Recommended move: scope a smaller first slice before committing.” The Slack webhook URL is stored securely and is never shown again after you add it.

Slack support is one-way for now: Fraym posts alerts. There is no Slack OAuth app and no bidirectional Slack commands yet.

Zapier and Make

There is no native Zapier or Make app yet. You can still connect Fraym to them using a generic webhook trigger (Webhooks by Zapier or a Make custom webhook) pointed at one of these destinations.

Questions? See support.