Guide · Notion

Notion webhook: sales from your database

Many freelancers track their sales in a Notion database, and that works fine. What's missing is the column you can't fill in by hand: the one that says where the client came from.

The whole guide fits right here

Webhook URL

https://subtraq.co/api/v1/sales

Plus one custom header: Authorization, value "Bearer" followed by your server key. Notion can set it itself, which is what makes the go-between unnecessary.

The six steps in Notion

"Send webhook" action in database automations, recorded in Notion Help on 12 September 2026.

Check this before you start

Database automations require a paid plan

These limits are not a problem: a sale fits in five properties. The only one that really matters is the first, because it decides whether this page applies to you.

On a free plan, there is still the no-code path: a Subtraq link pasted into the redirect field of a Tally or Typeform form. The form submission becomes a conversion, with no key, no request, and no automation.

Sources: database automations and webhook actions, Notion Help.

The no-key path, with Tally

Recorded 12 September 2026

What the action can do, and its limits

According to Notion Help: database automations are available on paid plans; the webhook action sends POST only, accepts custom headers, is limited to five webhook actions per automation, and can only include the page's properties in the body — not its content.

In Notion, 6 steps

From the row moved to "paid" to the attributed sale

Nothing to install, no go-between, no development: Notion is one of the few tools in this family that can set the authorization header Subtraq requires all by itself.

1

Set up the database: three properties are enough

A text field for the client's email address, a number field for the amount, and a select field for the status — "to collect", "paid". Moving to "paid" is what triggers everything.

2

Create the automation on the database

Set the trigger on the status property change, filtered to the value "paid". Without the filter, every edit to a row would fire a request.

3

Add the "Send webhook" action

Notion only sends via POST, which works perfectly: that's what Subtraq expects. Paste the URL https://subtraq.co/api/v1/sales into the URL field.

4

Add the authorization header

The action lets you add a custom header. Name: Authorization. Value: Bearer followed by the Subtraq server key, the one that starts with stq_sk_ and carries the events:write permission. This setting is what eliminates the need for any go-between.

5

Build the body from the row's properties

space gets the client workspace slug, amount the amount in cents, currency three letters, invoiceId a unique row ID, email the client's address. Only the page's properties go into the body: the page content stays behind.

6

Move a test row to "paid"

Subtraq replies 201 for a new sale, 200 if the invoice ID has already been seen, and in both cases says whether the sale found its source link.

Paths recorded in Notion Help on 12 September 2026 — the webhook actions page. Interfaces change: if what you see no longer matches, the source takes precedence.

The question not to avoid

Can Notion receive a conversion itself?

For a Subtraq conversion to arrive in a Notion database, you need a go-between: Subtraq's outgoing webhook wakes Zapier, Make, or n8n, and the go-between calls the Notion API to create the row. That's one more link in the chain, and it's better to know before looking for a setting that doesn't exist.

What the Notion API can do, on the other hand, is be queried: a third-party tool can read the rows in a database whenever it decides to. That's another way to keep the same log, slower but with nothing to monitor.

Source: Notion API webhooks, recorded 12 September 2026.

Have Make write the row

No, and here is exactly why

Notion API webhooks go the other way

Notion API webhook subscriptions send events to your server — content changed, comment created, schema updated — in a format Notion dictates, signed with the X-Notion-Signature header. None of them write a row into a database.

The annoying cases, dealt with straight

A hand-maintained database gets corrected by hand. Here is what that implies.

How do I link a database row to the clicked link?

Through the email address, within the workspace attribution window — thirty days by default. If the person clicked a tracked link and then gave the same address, the sale finds its link. The click ID cannot arrive in a Notion database without being captured upstream: no official page consulted documents a redirect to an external URL after submitting a Notion form, and we do not claim otherwise.

How do I avoid sending the same sale twice?

That is what the invoiceId field is for. Put a stable value unique to the row in it: an invoice number, or a formula property that generates an ID. The second pass replies 200 and adds nothing. Without this field, every move back to "paid" would count one more sale.

Payment arrives three weeks after the order.

No problem for the automation, which fires when the row moves to "paid". The issue is the attribution window: a click older than it no longer matches. For slow payments, extend it before connecting — it does not backfill.

What about a refund?

Subtraq does not accept a negative amount and has no cancellation call. A refund does not subtract itself: track it with a zero-amount event and correct the report by hand. Better that sentence than a wrong total discovered in front of the client.

Frequently asked questions

Does a Notion integration need to be installed?

No, not for sending. The webhook action is part of database automations on paid plans, and it accepts the authorization header. For receiving a conversion into Notion, on the other hand, you do need a go-between.

What ID should I put in invoiceId if I have no invoice number?

Any value that is stable and unique to the row: an ID you generate, or a formula property. The form does not matter — what matters is that it never changes.

Does the amount need to be in cents?

Yes, and this is the page's most expensive trap: $43 is written 4300. Subtraq rejects decimal numbers for money. A formula property that multiplies by a hundred settles the question once and for all.

Does the page content go with the request?

No. The action only includes the page's properties, according to Notion Help. The page's blocks stay with you.

What about a lead with no amount?

The sales route expects an amount. For a lead, the simplest path is still the Subtraq link pasted into a form's redirect field: the form submission becomes a conversion, with no API call at all.

Your sales come from somewhere other than manual entry?

If payment goes through Stripe, skip Notion: the Stripe integration records every payment on its own, with a required signature.

The Stripe guide

The next row moved to "paid" can say where it came from

Create the account, get a server key, add the automation to the database. The rest happens in Notion.

Create a free account