Affiliate program
How the Privatus Analytics affiliate program works, from your referral link to the 30-day hold, Wise payouts and account credit, with cookieless attribution.
Earn 25% of every payment (after discounts, excluding tax) from the customers you refer, for 24 months from each customer's first payment.
Apply#
Account settings → Affiliate program. The form asks for:
| Field | What to enter |
|---|---|
| Website or channel | Where you'll promote Privatus Analytics. Required |
| How will you promote Privatus Analytics? | For example a newsletter, a blog, videos or client work. Required, up to 2,000 characters |
| Referral code | Optional. 3 to 24 letters, digits or hyphens. Left blank, we suggest one from your name |
| How should we pay you? | Wise (with the email address of your Wise account) or Account credit (with a workspace you own). See Getting paid |
We review applications within two business days and email you the result. If we can't approve it, the email says why and you can apply again. You can have one application, so a pending or approved one can't be sent again.
Share your link#
Once approved, your page shows a link like
https://privatusanalytics.com/r/your-code. It opens the sign-up page.
People can also enter your code, exactly, in "How did you hear about us?"
when they create their first workspace.
Signup box#
A signup form for your own site. Visitors get a Privatus Analytics tracking code for their site without leaving your page, and each new account is credited to you like a link referral.
Account settings → Affiliate program → Signup box has a live preview and your code. Pick a theme, then paste one of these where the box should appear.
| Theme | What it does |
|---|---|
auto |
Matches the visitor's device (the default) |
light |
Always light |
dark |
Always dark |
The script fits the box to its content, supports prefill and tells your page when someone signs up:
<div data-privatus-signup="your-code" data-theme="auto"></div>
<script async src="https://privatus.page/js/signup-box.js"></script>
A plain iframe works on sites that don't allow scripts. It has a fixed height and no prefill:
<iframe src="https://privatus.page/embed/signup/your-code?theme=auto"
title="Privatus Analytics signup" allow="clipboard-write"
style="width:100%;max-width:480px;height:640px;border:0"></iframe>
What the visitor does#
- They enter their first name, email and the domain of their site, accept the Terms and the Privacy Policy, and choose whether they want product emails.
- The box shows their tracking code with a copy button and a Check installation button. Pageviews are counted from this moment.
- We email them a one-time link to their dashboard, which stays good for a week. Opening it creates their account (or signs them in if they already have one) and puts the site in it. Submitting the form again with the same email and domain sends a new link.
A signup that nobody opens the link for is removed after 7 days, with everything it collected. Until then it never stops someone else from adding the same domain to their own account.
Prefill for signed-in visitors#
If your visitors are signed in on your site, add what you already know to the element. They can still change every field, and they always tick the terms themselves.
| Attribute | Fills in |
|---|---|
data-first-name |
First name |
data-email |
Email address |
data-domain |
The domain of their site, like example.com |
Two more attributes control the box itself:
| Attribute | What it does |
|---|---|
data-theme |
auto, light or dark. Anything else is treated as auto |
data-title |
The accessible title of the frame. The default is "Privatus Analytics signup" |
The script hands these values to the box inside the visitor's browser. They are never put in a URL, and we store nothing until the visitor submits the form.
React on your page#
The script fires these events on the element, and they bubble:
| Event | Fires when |
|---|---|
privatus:signup:submitted |
The form was submitted and the tracking code is shown |
privatus:signup:installed |
The tracking code was found on the visitor's site |
privatus:signup:receiving |
The first pageview arrived |
document.addEventListener("privatus:signup:submitted", () => {
// show your next step
})
The events carry no name, email, domain or site id.
Count signups as a conversion#
The box is a frame from another site, so the tracker on your page cannot
see its form. Automatic form tracking and data-privatus-event do not
fire for it. If your site uses Privatus Analytics, send an
event yourself when the box reports a signup:
document.addEventListener("privatus:signup:submitted", () => {
privatus.track("Signup box", { placement: "pricing" })
})
submitted fires once per box, after we accepted the signup. A form that
fails its checks fires nothing. Create an event
goal for the event name, and you can use it as
the goal of an experiment on the page that
holds the box.
With the plain iframe#
The plain iframe has no script, so it fires no events on your page. The frame still posts messages to its parent window, and you can listen for them:
| Message | Sent when |
|---|---|
{ type: "privatus:signup:state", state: "submitted" } |
The form was submitted and the tracking code is shown |
{ type: "privatus:signup:state", state: "installed" } |
The tracking code was found on the visitor's site |
{ type: "privatus:signup:state", state: "receiving" } |
The first pageview arrived |
let counted = false
window.addEventListener("message", (event) => {
if (event.origin !== "https://privatus.page") return
const data = event.data || {}
if (data.type !== "privatus:signup:state") return
if (data.state !== "submitted" || counted) return
counted = true
privatus.track("Signup box")
})
Always check event.origin, because any frame can post a message to your
page. A message can arrive more than once, so count it once. The frame
also posts privatus:signup:ready and privatus:signup:height, which the
script uses to prefill and size the box.
What counts#
- 25% of each net payment: after discounts, excluding tax.
- Pro and Business payments from a workspace created by someone who signed up through your link or your signup box, or entered your code, for 24 months from that workspace's first payment.
- A signup box credits you for new accounts. Someone who already had a Privatus Analytics account and uses your box gets their site, but is not a referral.
- Refunds and chargebacks are taken back from the commission. A reversed chargeback restores it.
- Self-referrals aren't allowed. A referral of yourself, or of someone at your own email domain, is flagged and earns nothing unless we approve it after a review (shared webmail domains like gmail.com are fine).
- While an affiliate account is suspended, new referrals and commissions aren't recorded.
Getting paid#
Each commission is on hold for 30 days, then becomes payable.
- Wise: once you have $50 or more payable we send it to the Wise account email you gave us and email you the transfer reference.
- Account credit: payable commissions come off the next renewal of your own subscription automatically, with no minimum. You pick a workspace you own, and it needs a paid subscription. We add as much as the renewal can absorb and the rest waits for the following one. A subscription can hold only one discount, so a workspace in a discount program can't take credit: choose Wise or another workspace. Credit also waits while the subscription bills in a different currency than your commissions. Your affiliate page tells you when credit is waiting and why. Switch to Wise at any time.
Change the method under Payout details on your affiliate page.
Each row in your commission list has a type and a status:
| Type | Meaning |
|---|---|
commission |
25% of a referred customer's payment |
clawback |
A refund or chargeback, as a negative amount |
reversal |
A chargeback that was reversed, as a positive amount |
| Status | Meaning |
|---|---|
pending |
On hold for the 30 days |
approved |
Payable |
paid |
Included in a payout |
void |
Canceled, for example by a full refund during the hold |
Your page and the API show signups, paying customers, what's on hold, payable and paid, and every commission and payout. The Signup box page shows the box's own numbers: signups waiting to confirm, confirmed signups and paying customers.
API and MCP#
GET /account/affiliate.json(MCP toolaffiliate_get): status, referral link, stats and balances.GET /account/affiliate/commissions.json(MCP toolaffiliate_commissions_list): commissions, paginated, with an optionalstatusfilter (pending,approved,paidorvoid).GET /account/affiliate/signup-box.json(MCP toolaffiliate_signup_box_get): your signup box code for atheme(auto,lightordark) and the box's numbers.
Applying and changing payout details need a signed-in browser.
How referrals are attributed (privacy)#
The program follows the same rules as the product: no tracking cookies, no fingerprinting, no click logs.
/r/your-codesets no cookie and records nothing. It only redirects to the sign-up page with the code in the address.- The sign-up page keeps the code in its own session cookie, which ends when the browser closes, and in the sign-up link we email. The code is dropped when the account is created.
- We then store which affiliate referred the new account and, later, its workspace. That's all. We never store the visitor's IP address, device or the pages they viewed.
- You see counts (signups and paying customers) and commissions, never who your referrals are.
The signup box follows the same rules:
- It sets no cookie on your site or ours, and uses no storage.
- Until the visitor opens their emailed link we keep no account, no email address and no name: only the site they asked for, and a keyed hash of the address so the right person can claim it. The first name and the email choice travel inside the signed link.
- The visitor's IP address is used in memory for the bot check and rate limits, and never stored.
- Your page learns that a signup happened, never who signed up.