Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions providers/formstack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Formstack

Formstack Forms' WebHook submit action ("Send Data to an External URL"). It fires on
exactly one thing, a form submission, and sends no event type in any header or body field.
That is why `topic_identifier` is `null`.

`submission` is the name of the file, not a value Formstack sends. Don't match on it, and
don't treat it as Formstack event vocabulary. Route Formstack deliveries on the `FormID`
body field.

## The sample

`latest/submission.json` is a real delivery, captured on 2026-09-25 from a test form with
no answer fields. It went through a Hookdeck source, and the `x-hookdeck-*` headers were
removed. Everything else is as received, including the signature.

- The body arrived as `application/x-www-form-urlencoded`, which is Formstack's default.
The exact wire bytes were `FormID=6606394&UniqueID=1500878955&HandshakeKey=test`.
- `x-fs-signature` is HMAC-SHA256 of those bytes, as lowercase hex prefixed with
`sha256=`. The WebHook's HMAC Key was the throwaway value `test1`, so the signature can
be recomputed:

```bash
printf '%s' 'FormID=6606394&UniqueID=1500878955&HandshakeKey=test' | openssl dgst -sha256 -hmac test1 -r
```

- `HandshakeKey` carries the WebHook's Shared Secret, here the throwaway `test`. This capture
had a Shared Secret set, so it doesn't show what a WebHook without one sends.

A mock send re-encodes the body, and the bytes may not match the original. The
signature is only valid against the exact wire bytes above.

Formstack Documents (formerly WebMerge) is a different product with a different webhook
and is not covered here.
13 changes: 13 additions & 0 deletions providers/formstack/index.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"label": "Formstack",
"configs": {
"latest_version": "latest",
"topic_identifier": null
},
"provenance": {
"latest": {
"sourced_via": "capture",
"sourced_on": "2026-09-25"
}
}
}
19 changes: 19 additions & 0 deletions providers/formstack/latest/submission.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"headers": {
"content-length": "52",
"content-type": "application/x-www-form-urlencoded; charset=utf-8",
"tracestate": "dd=p:60d345bc96c3c585;",
"user-agent": "FormstackWebhook/1.0 (Form 6606394)",
"x-datadog-parent-id": "6976996924012610949",
"x-datadog-sampling-priority": "0",
"x-datadog-tags": "_dd.p.tid=6ab674fb00000000",
"x-datadog-trace-id": "16234198080647658916",
"x-fs-signature": "sha256=30dff7f180b6d69eab397a5d51719474df490b730514c253e8b5832d3b51b970"
},
"body": {
"FormID": "6606394",
"UniqueID": "1500878955",
"HandshakeKey": "test"
},
"topic": "submission"
}
Loading