No Fianto fee during the beta. Any fee comes with at least 30 days notice. See pricing
Product7 min read

Zapier and Make automations for USDC shop sales.

A Fianto shop can send its sales to Zapier or Make with no code: paste a Zapier "Catch Hook" URL or a Make "Custom webhook" URL into Connect an app in your shop settings. Fianto then posts two events as flat JSON, purchase.paid when someone pays and subscription.ended when a subscription bought in the shop ends. Only shop sales are sent: payment link and API sales, renewals and failed renewals are not.

On this page
What Fianto sends to Zapier or MakeConnect a Zap or a Make scenario in five stepsFour automations worth buildingWhich sales the connection never sendsWhat happens when Zapier or Make does not answerWhen to use developer webhooks insteadSourcesQuestions
TL;DR
  • Two events only: purchase.paid (once per shop purchase, at the first charge for a subscription) and subscription.ended.
  • The body is one flat object: event, id, created_at, shop, shop_url, product, product_id, price, amount_paid, currency, buyer_email, order_id, subscription_id, interval, then paid_at or ended_at.
  • Only hooks.zapier.com and Make hook hosts are accepted. A hook that keeps failing is paused after 5 events in a row run out of retries.

What Fianto sends to Zapier or Make

Fianto sends each event as one flat JSON object, so Zapier and Make can map every field without a path. Every key is always present, with null when there is nothing to put in it, so a mapping built from one event works for the next. A monthly membership bought in a shop called quillfern (a made-up example; the ids are shortened) arrives like this:

purchase.paid
{
  "event": "purchase.paid",
  "id": "evt_6b0e2f...",
  "created_at": "2026-10-15T09:12:44.000Z",
  "shop": "quillfern",
  "shop_url": "https://quillfern.fianto.xyz",
  "product": "Field notes membership",
  "product_id": "fian_prod_...",
  "price": "12",
  "amount_paid": "12.01",
  "currency": "USDC",
  "buyer_email": "reader@example.com",
  "order_id": "shop_...",
  "subscription_id": "fian_sub_...",
  "interval": "month",
  "paid_at": "2026-10-15T09:12:44.000Z"
}
FieldWhat it holdsWatch out for
priceWhat you receive, in USDCA decimal string with trailing zeros dropped: "12", not "12.00"
amount_paidWhat the buyer paid: the price plus any Fianto fee and, on a subscription, the network fee"12.01" above is 12 plus the 0.01 USDC network fee charged today on subscriptions; there is no Fianto fee during the beta
buyer_emailThe address the buyer typed at checkoutnull when the product does not ask for one; never verified
order_idOne per purchase, starting shop_Use it, or id, to drop duplicates
subscription_id and intervalfian_sub_... and month or yearBoth null for a one-off product
paid_at or ended_atWhen the purchase was paid, or the subscription endedOnly one of the two appears, by event

The amounts differ from Fianto's developer webhooks, which send USDC base units ("12000000"). Here they are ready to paste into a spreadsheet. On subscription.ended, amount_paid is what the buyer last paid, which a discount code can make lower than the list total.

Connect a Zap or a Make scenario in five steps

  1. In Zapier, start a Zap with the "Webhooks by Zapier" app and its Catch Hook trigger. In Make, add a "Custom webhook" from the Webhooks app. Copy the URL each one gives you.
  2. In the Fianto dashboard, open your shop's settings and find Connect an app. Paste the URL under Webhook URL and press Connect. Fianto asks for your password and two-factor code, because the app will receive every buyer's email.
  3. Press Send a test. Fianto posts a sample purchase.paid (product "Sample product", order_id "shop_test", buyer "buyer@example.com") marked with "test": "true", and shows Delivered or the reason it failed. You get 10 test sends an hour.
  4. Back in Zapier or Make, map the fields to your action. Add a filter that drops events where test exists, so the sample never grants anyone access. Real events never carry it.
  5. On every product that grants access, set Buyer email to Required. With an app connected, the editor flags a membership product that does not: "Your connected app needs the buyer's email to give access. Set Buyer email to Required."

Fianto accepts only https://hooks.zapier.com/... and Make's hook hosts (hook.make.com and its eu1, eu2, us1 and us2 zones). Any other URL is refused with "Paste the webhook URL from Zapier (https://hooks.zapier.com/...) or Make (https://hook.eu1.make.com/...)." The path of the URL is the hook's only secret, so after saving, the dashboard shows just the host and a six-character ID.

Four automations worth building

The dashboard pitches the feature in one line, "Open access automatically in your course or membership tool," and that is the strongest use. The rest are bookkeeping and alerts.

GoalOnAction in your toolFields to map
Give a buyer accesspurchase.paidInvite or enrol the buyer in your course or community platformbuyer_email, product
Take access awaysubscription.endedRemove the same memberbuyer_email, subscription_id
Keep a sales ledgerpurchase.paidAdd a spreadsheet rowpaid_at, product, price, amount_paid, order_id
Tell the teamBothPost a chat messageevent, product, price

Zapier and Make each list the apps they connect to: browse Zapier's webhook integrations or Make's integrations. For access, match members on subscription_id where you can store it, not only on the email: a buyer may type a different address next time. A full course setup, from pricing to delivery, is in selling an online course for USDC.

No shop yet? Build one in the dashboard with no code, then connect your app.

See how the shop works

Which sales the connection never sends

The connection sends shop purchases and nothing else. Plan around these gaps before you promise a customer that access opens or closes on its own:

  • Payment link and API sales. A sale through a USDC payment link or your own checkout integration sends nothing to Zapier or Make.
  • Renewals. purchase.paid fires once per purchase, at the first charge. A monthly subscriber who renews ten times produces one event.
  • Failed renewals and cancellations in progress. There is no past-due or cancel-scheduled event here. A subscriber whose renewal fails stays in your tool until the subscription ends, which happens after the fourth counted failed attempt, about a day after the period boundary. A cancelled subscription runs to the end of the paid period, then subscription.ended fires.
  • The past. An app connected today is never sent purchases from before it was connected.
  • Emails to buyers. Fianto sends the shop buyer one email after a paid purchase, with the delivery, when the buyer gave an address. It sends subscribers no renewal reminders, so any reminder has to come from your own tool.

Fianto notices an ended shop subscription on a check that runs every 30 seconds and looks back seven days, and sends subscription.ended once per purchase.

What happens when Zapier or Make does not answer

Shop events use the same delivery machinery as Fianto's developer webhooks. An answer of 2xx within 10 seconds counts as delivered; anything else is retried, up to 8 attempts over about 28 hours. Delivery is at least once, so a Zap can see the same event twice: filter on id or order_id if a duplicate would hurt, such as a second invitation.

After 5 events in a row run out of retries, the connection shows as Paused: "Paused: your app stopped accepting events. Check it, then replace the URL to start again." Events are held meanwhile, and saving the URL again sends what was held. Two things commonly cause it. A Zap that was turned off answers with an error. And Make's webhook documentation says a webhook left unconnected to any scenario for more than 5 days is deactivated and answers 410 Gone. The same page states that "Make can process up to 300 incoming webhook requests per 10 second interval," far above what a shop sends.

Disconnect stops the sending and deletes every event kept for that hook, since they carry buyers' emails. Delivered events are pruned after a week anyway. The dashboard's own words: "Fianto stops sending purchases to it. Buyers who already have access keep it."

When to use developer webhooks instead

Use developer webhooks when the two-event feed is too coarse. Shop sales run on their own application, named Shop and listed under Developers, whose webhook endpoint receives the full event set: subscription.renewed, subscription.past_due, subscription.cancel_scheduled and the rest. A shop sale's checkout session carries metadata.source set to "shop". Payment link sales arrive there too, with metadata.source set to "payment_link". Those deliveries need a server that verifies Standard Webhooks signatures, and their amounts are base units.

A rule of thumb: if losing access on a failed renewal within the day matters to you, or you sell through payment links, write the small server. If a one-off sale or a membership that opens on purchase and closes at the end is enough, Zapier or Make will do. A paid Discord role needs the small server too, because the shop feed carries no Discord ID: see paid Discord roles with USDC. Webhooks for access maps each developer event to an access decision, and the docs page Shop sales in your integration covers the Shop application.

Sources
Questions

Questions about Zapier, Make and USDC sales.

Does Fianto have a Zapier app?

Fianto connects through Zapier's own Webhooks by Zapier app: you paste a Catch Hook URL into Connect an app in your shop settings. Make works the same way with a Custom webhook URL.

Which events does the Zapier or Make connection send?

purchase.paid when a shop purchase is paid, once per purchase, and subscription.ended when a subscription bought in the shop ends. There is no renewal or past-due event.

Are payment link sales sent to Zapier or Make?

No. The connection covers shop purchases only. Payment link sales reach the Shop application's developer webhook, which needs a server that verifies signatures.

Why is buyer_email null in my Zap?

The product does not ask for an email, or asks for it as optional and the buyer left it empty. Set Buyer email to Required on products that grant access.

Can I use other automation tools such as n8n?

Not through Connect an app: it accepts hooks.zapier.com and Make hook URLs only. Other tools can receive the developer webhook from a server you run.

Read next.

Use casesProduct8 min read

Sell licence keys and game keys for USDC with shop delivery codes

Fianto's shop sells licence keys and game keys through delivery codes: you paste your keys into a product, each buyer who pays in USDC gets exactly one, on the receipt and in the buyer email, and the product shows as sold out when none are left. A product holds up to 5,000 unused keys, a key is reserved while its buyer pays so two buyers never get the same one, and you are emailed when five or fewer remain.

Use cases8 min read

Sell an online course for USDC: shop, Zapier enrolment or coupon codes

Keep the course where it is and sell it from a Fianto shop: when a buyer pays in USDC, the shop sends a purchase.paid event to a Zapier or Make webhook, and an action such as Teachable's "Enroll User in Course" or Kajabi's "Grant Access to an Offer" enrols the buyer's email. For a one-time course with no automation at all, paste single-use coupon codes from your course platform as delivery codes, one per buyer.

Use casesDevelopers10 min read

Paid Discord roles with USDC: a bot, a checkout and two webhook events

To sell a Discord role for USDC, run a bot that holds the Manage Roles permission, let a /join command open a Fianto subscription checkout with the member's Discord user ID as the customer reference, and add or remove the role when Fianto's subscription.created and subscription.ended webhooks arrive. Fianto has no Discord integration of its own: it collects the USDC into your wallet and tells your server what happened, and your bot does the Discord part.

Paste one URL, map the fields.

Send a test, filter it out, then let the next sale run the Zap.

New posts are announced on X and Discord.