Ghost + Creem: Merchant-of-Record Billing Setup

SETUPGhost + Creem:Merchant-of-Record BillingSetup
On this page

Creem handles merchant-of-record billing, which means it is legally the seller and the VAT is its problem rather than yours. That part is the same deal as Polar, Paddle and Lemon Squeezy.

Where it differs is stricter, and worth knowing before you start: Creem signs every webhook and PayGlue rejects any delivery whose signature does not match. Not a warning in a log, a hard refusal.

That is the right way round. It also means a mistyped secret does not degrade quietly, it stops everything. Worth understanding before you spend an evening on the wrong theory.

What you need

  • A Ghost site you administer
  • A Creem account with at least one product
  • Admin access to both

Connect Ghost first

In Ghost, open Settings, then Integrations, then Add custom integration. Name it PayGlue and copy the Admin API key along with your site URL. That key can create and modify members, so treat it like a password.

Create an API key in Creem

In your Creem dashboard, go to Developers, then API Keys, and create a new key. It starts with creem_.

Copy it in full. A truncated key fails the health check with a message that reads like a connection problem rather than a copy problem.

Add the webhook endpoint

Go to Developers, then Webhooks, and click Add endpoint. Paste the webhook URL from your Creem connection page:

https://api.payglue.io/webhooks/creem?tenant=your-slug

Copy the whole string. The slug at the end is how the event finds your organisation, and a truncated copy means events arrive addressed to nobody.

Select the checkout and subscription events: checkout.completed, subscription.paid, subscription.active, subscription.canceled and subscription.expired.

After saving, Creem shows a signing secret. Copy it.

Enter the credentials, and mind the checkbox

In PayGlue, open Connection, then Creem, and fill in the API Key and the Webhook Secret.

Then the part that catches people. There is a checkbox: This is a Creem sandbox/test connection. It has to agree with the key you just pasted.

Ticked, PayGlue talks to test-api.creem.io. Unticked, api.creem.io. A live key with the box ticked fails the health check. A sandbox key with the box clear fails too. In both cases the error looks like bad credentials, and you will re-copy a perfectly good key before thinking of the checkbox.

Only the API side changes. Sandbox events arrive at the same webhook endpoint, so there is no second webhook to register.

Save, then run the health check. Green means Creem accepts the key and the environment matches.

Which events do what

Creem event What happens in Ghost
checkout.completed Member created, one-time purchase
subscription.paid Active membership confirmed, renewal
subscription.active Membership granted
subscription.canceled Membership revoked
subscription.expired Membership revoked

subscription.paid is the one people leave out because it looks redundant next to active. It is the renewal confirmation, and without it you have no signal that a recurring payment actually went through. Enable all five.

Map a product to a Ghost tier

Open the Buy Button, Paywall or Pricing Table editor, pick your Creem product, choose the Ghost newsletter and welcome email, and save.

Without a mapping the event arrives, passes signature verification, and then nothing happens. Correct behaviour, and indistinguishable from a fault until you know to check.

Test it in sandbox

Tick the box, use a sandbox key, make a test purchase.

Then check Analytics, then Webhook Events. Three outcomes, three different causes:

  • No event at all: the URL in Creem is wrong, or the slug does not match your organisation.
  • Event failed: signature mismatch. The secret in PayGlue is not identical to the one on the endpoint in Creem. With Creem this is a hard stop rather than a warning, so nothing at all will work until it matches.
  • Event processed, nothing changed: no mapping for that product.

When you switch to live credentials, untick the box and clear the test members out of Ghost Admin.

Where Creem sits among the others

Its distinguishing feature is the one at the top of this page. Compared to the others PayGlue connects:

Signs webhooks Sandbox
Creem Yes, and enforced Explicit checkbox
Polar Yes Separate environment
Lemon Squeezy Yes, secret you invent Per API key, no separate environment
Paddle Not yet Detected from the key prefix
Gumroad Not yet None

Strictness is a feature. It means a misconfigured integration announces itself immediately rather than working until the day somebody sends you a forged event.

The cost is one more value that has to be exactly right, and one checkbox that has to agree with it. Neither is hard once you know they are there.

Is Creem the right pick

Choose it when you want merchant-of-record billing with proper signature verification, and a sandbox you can switch without juggling two sets of credentials in your head.

Look elsewhere when you want the shortest possible setup, in which case Gumroad registers its own webhooks and asks for three fields.

The full comparison of every route is here, and what merchant of record means for your tax position is here.

Frequently asked

Why does a wrong webhook secret break everything with Creem but not with some others?

Because Creem signs every delivery with an HMAC-SHA256 over the raw body and PayGlue treats a missing or mismatched signature as a hard failure. Paddle and Gumroad do not sign at all yet, so there is nothing to get wrong there. Creem's strictness is the better arrangement, it just gives you one more thing that has to match exactly.

What does the sandbox checkbox actually change?

It sends PayGlue to test-api.creem.io instead of api.creem.io. The checkbox has to agree with the key you pasted: a live key fails the health check while sandbox is ticked, and a sandbox key fails while it is not.

Do I need a separate webhook for sandbox?

No. Sandbox events arrive at the same endpoint. Only the API side changes, which is why the checkbox exists at all.

Is Creem a merchant of record?

Yes. Creem is the seller for tax purposes and handles collection and compliance, so VAT does not land on you. Same arrangement as Polar, Paddle, Lemon Squeezy and Gumroad.

What happens when a subscription lapses?

subscription.canceled and subscription.expired both revoke the Ghost membership. subscription.paid confirms a renewal went through, so a member whose payment succeeded stays active without anything else happening.