← Back to perly.io
Perly

Privacy Policy

Last updated: November 2026

The short version. Perly keeps your account, the records you create, the few things you switch on and what you buy. The market charts keep nothing about you unless you leave them a note, and count your visits with Google Analytics only if you allow it. The invoicing site keeps the documents you write, which carry your clients' details, and shows a document to whoever you give its link. Everything each product keeps is listed below, product by product, with how long it stays. No wallet connections, no seed phrases, no exchange API keys, no access to your funds. Nothing is sold, shared with advertisers or used to train anything.

Who is responsible. Perly is the controller of the data described here, and hi@perly.io reaches it. One kind of data has different roles, and they are worth saying plainly: the details of your clients on a document you write in Perly Invoice — their names, addresses, e-mail addresses, tax numbers and what they owe — are yours. You decide to collect them and to send them a document, so you are their controller, and we process them on your behalf under these terms: to store the document, to show it to whoever holds its link, and to print it. Their questions about that data go to you; ours go to hi@perly.io. Perly Pay, at pay.perly.io, is run under its own Terms of Service and Privacy Policy, which say what it keeps and who is responsible for it.

This website, perly.io

The site has no accounts and no database of its own. It sets no cookies unless you allow it: Google Analytics starts only after you choose Allow in the cookie notice, and declining leaves the site cookie-free. Your answer is kept in your browser's own storage, not on a server, and the Cookies link in the footer of the home page opens the notice again, so you can change it at any time. When Google Analytics runs, its cookie tells one browser's visits apart without saying whose browser it is; we see pages and counts, not people, and Google Analytics does not store IP addresses. The pages are served by Vercel.

Counting page views. Whatever you answer in the notice, perly.io and pay.perly.io count page views as anonymous daily totals by page, language, screen class, country and referring site, with no cookie and no identifier; a tab-only marker that is never sent tells a first page from a second one. The totals are kept in our own database, and Supabase sees the request like any request. The country is a two-letter code that the network in front of the database works out from the request's IP address, and the referring site is its host and nothing else. So that one script cannot flood the totals, page views are also counted per network address, as a salted hash of it kept apart from the totals, the way sign-in attempts are, deleted within a day.

The application, app.perly.io

What Perly keeps.

  • Your account — your e-mail address; your password as a hash nobody can reverse (there is none if you sign in with Google or X); for a Google or X sign-in, the name, e-mail and picture that provider shares, kept by the sign-in service; a display name; when you joined; the date and version of the Terms you agreed to; and where you first arrived from — the site, chart and language — and when.
  • Signing in — the sessions you are signed in with, and the IP address and browser each was opened from, kept by the sign-in service to protect the account. Attempts at the sign-in doors are counted per network address and per e-mail address to stop password guessing, each as a salted hash that says only that somebody knocked, and deleted within a day.
  • Your ledger — portfolios (name, description, target), transactions (coin, side, quantity, price and the currency it was priced in, with the day's rate that turns it into dollars, fee, time, exchange, tags, notes, and the fingerprints that spot a duplicate import), and the goals you set on them.
  • What you switch on — price alerts and planned orders; DCA plans with your time zone and reminder text; market alerts; watched wallet addresses with their labels and the balances read for them; a log of the reports you generate (period, method and format — never amounts); the push address your browser gives for notifications; and a connected Telegram chat (its id, username and first name).
  • A note you send us — from the feedback form in the application's menu: the words, a contact if you choose to leave one, the page, its language, the kind of screen and the time, and not your account. It is read by a person and kept for a year.
  • Invitations — your invite code, who invited you and whom you invited, and the codes you redeem.
  • Your vault — if you create one: your encryption key as wrapped by each way you open it (passphrase, recovery code, passkey), with that opener's label and when it was last used. Never the key itself.
  • What you buy — each invoice the checkout opens: a seat and its number, or a year; its price, chain and coin; the address it gave you to pay to; its status and times. The transactions that paid it, with the addresses they came from, and the result of checking those addresses against public sanctions and scam lists, of which our servers keep a copy, and against the stablecoin issuer's own freeze list, read from the chain. With each invoice we also keep the country your connection came from, as the two-letter code our host reads from your IP address: the checkout refuses payments from sanctioned countries and occupied regions, and the country stays as the record of that check. The region within a country is checked too but not kept, and neither is the IP address. A seat or a year bought on Perly Pay's checkout is paid there instead: the application sends Perly Pay your account's e-mail address and its id, what you are buying — a seat with its number and cohort, or a year — with its price and any discount, the checkout's language, and the checkout's own reference and the address to come back to, and Perly Pay handles the payment under its own Privacy Policy. For such a sale the application keeps a record of its own: the account it belongs to; the seat — its cohort, the number held for you and the number you got — or the year; the price, and what was refunded; whether it was live or a test; its status, how long the seat was held and, if a person had to look at it, why; Perly Pay's references for the invoice and any subscription, the subscription's status and the address of Perly Pay's page; which version of the consent you ticked, and when; the country your connection came from, as the two-letter code our host reads from your IP address, which is not kept; when it was opened and last changed, when money was first seen, and when it was fulfilled or refunded; and, when a seat replaced a year, which old subscription it asked Perly Pay to cancel. Every notice Perly Pay sends about it is logged as well: its id and kind, Perly Pay's references, the outcome and when it arrived.

Encrypted portfolios. Your portfolios are encrypted in your own browser, all of them at once, with a key only you hold — a new account sets that password before its first portfolio, and Settings can turn it off. An encrypted portfolio's amounts, prices, fees, totals, notes, tags, description and target reach our servers only as ciphertext we cannot open. What stays readable is what lists and sorting need: the portfolio's name and the currency it is kept in, each entry's coin and time, and fingerprints that spot a duplicate import. Alerts, plans and watched addresses you set on it are stored in the clear, because the server has to read them to act on them. The password never reaches us and the recovery code is shown once: lose both and those portfolios cannot be opened again by anyone, ourselves included.

Cookies and counting. The application keeps you signed in with one session cookie, shared by the application and the invoicing site, and remembers your language, your display settings and, for an hour, where you arrived from — and, for fifteen minutes, an invite code you sign up with through Google or X, so that it survives the trip there and back. Inside the application we count which screens are opened, in our own database and in the same shape as the charts site: one row per day, screen, language and screen size, with counts on it, and, in rows of their own, visits by the two-letter country their connection comes from. No account, identifier or IP address is stored with any of them. The pages a stranger can see — sign in, sign up — load Google Analytics only after you answer yes to the question they ask; it is the same Google Analytics as on this site. Apart from the bot check described next, a signed-in page loads no third-party script.

The site you came from. When you arrive with no session and the link does not say where it came from, the application keeps the name of the referring site, taken from what your browser sends, in a first-party cookie on its own host for an hour, with any chart or language the link named, and attaches it to the account only on sign-up. This happens whatever you answer to the question on the sign-in and sign-up pages. Only the site's name is used: the rest of the address is never read or kept, a site outside our short list of known sources is kept only as “referral”, and nothing in the cookie tells one browser from another. Without a sign-up we write nothing else anywhere, and the cookie expires. On sign-up it becomes the “where you first arrived from” listed above, and the cookie is deleted.

Your browser and other people's servers. The sign-in, sign-up and password-reset pages, and the Settings forms that ask for your current password — to change your e-mail or password, or to delete the account — carry Cloudflare Turnstile, a check that tells a person from a bot. It loads with the page or the form, without waiting for your answer about analytics, because nobody can sign in without passing it: it is what stops scripts from guessing passwords and opening accounts by the thousand, and keeping them out is our legitimate interest. Cloudflare sees your IP address and what your browser says about itself, such as its user agent and the fingerprint of its encrypted connection; our sign-in service learns from it only whether the check was passed. Cloudflare also uses those signals to improve the check, under its own Turnstile privacy terms. Otherwise a signed-in page talks to our servers and our database and to nobody else, with two exceptions we have not closed yet: coin icons on portfolio pages load from CoinGecko's image service, and the icons of news sources beside the market charts from Google's icon service; both see your IP address and which icons were asked for. The addresses you watch are looked up in public blockchain explorers and nodes from our servers, not from your browser, so an address is not tied to your IP; when you scan a wallet for what it was bought with, the same explorers are asked about that address, and public name registries about the addresses that paid it.

Perly Invoice, invoice.perly.io

What a sender's account keeps. Your business profile — name, legal name, e-mail, phone, website, tax number, address, logo, colour and the counters your documents are numbered from. Your contacts: every client or vendor you have written a document to, with name, e-mail, phone, tax number, address and your private notes. Saved line items. The ways you get paid — wallet addresses, or bank accounts with their IBAN or account number, BIC, the bank's name and the holder's name and address. The documents themselves, each with a frozen copy of both parties and of the payout details it offers, its lines, totals, notes, terms and dates, its status, when it was first opened, when it was marked paid and how much arrived, a payer's reported transaction and when they said they had paid; repeating schedules; and the per-document switches for Telegram alerts, chain watching and the private link, whose code is stored as you typed it. On the receiving side: which documents in your Inbox you have read, and the senders you refused.

Who sees a document. Anyone who holds a document's link sees the whole document — both parties, the lines, the totals and the payout details — for as long as it exists; a private link asks for its code first, and once the code is entered the browser keeps it in a cookie for thirty days so the document does not ask again. Unless the document is private, a chat or mail program that previews the link is shown its number, the issuer's name and the total. The addressee with a Perly account under the same confirmed e-mail sees it in their Inbox, and their Telegram, if connected, gets a message with the number, the amount, the due date and the link. Your logo is a public file. Opening a document records only that it was opened, once, with the time — no address and no browser.

Your clients' data, and their rights. Your clients did not sign up for anything. Their details reach us because you typed them, and we hold them for you as your processor: to store and print the document, to show it to whoever holds the link, and to put it in their Inbox if they have an account. We do not use them for anything else. We send your clients no e-mail; the only message that ever reaches one is the Telegram notice above, and only when they have their own Perly account with Telegram connected. A client who wants their details corrected or removed asks you: you can edit or delete a contact at any time — a document already written keeps its own copy of the details — and edit a document until it is paid, which takes effect for everyone who holds its link at once. You can delete a document whatever its status — its link stops opening and it leaves your client's Inbox — and every document goes when your account does. A client who writes to us instead is passed on to you, and we help you answer.

Reading a chain, and drawing a PDF. If you switch on watching for a document, our job asks public blockchain nodes and explorers, from our servers, whether the payout address on that document has received the amount, and when it has the document is marked paid — and you are told on Telegram if you connected it. The address it asks about is the one you printed, on the chains it can read. The PDF of a document is drawn on our servers from the same page a client sees, and is not kept — a download draws it again. The free generator on the front page keeps your unsaved draft in your own browser for up to fourteen days after your last change, and stores nothing on a server until you press keep; its PDF is drawn from what you send and not kept either. So that a script cannot turn a free tool into somebody's bill, an account's new documents and PDFs are counted against the account each day, and the PDFs drawn without an account are counted per network address, as a salted hash of it, the way sign-in attempts are. Besides the session it shares with the application and a private link's code, the site keeps your language and your time zone in cookies, each for a year — the zone so that a document is dated by your calendar, not by ours — and, for thirty days, a cookie that says only that you are signed in, so that its pages can show the right link at once. Its public pages — the front page with the free generator, and the guides — load Google Analytics only after you answer yes to the question they ask; it is the same Google Analytics as on this site, and the Cookies link in their footer asks again. A document's own page, the pages behind the sign-in and the printed sheet never load it.

Perly Charts, charts.perly.io

Nothing about you. The charts site has no accounts and no sign-in, and loads Google Analytics only if you allow it (below). What it counts itself, it counts in our own database in a shape that cannot hold a person: one row per day, kind of event, page, subject, language and screen size, with counts on it — how many arrived, how many went on to a second page, how long they stayed, how far they scrolled. One of those kinds counts the site a reader arrived from, by its host and nothing else. Another counts each visit under the country its connection comes from, as a two-letter code that the network in front of our database works out from the request's IP address; the address itself is counted only as a salted hash kept apart from the totals, the way sign-in attempts are, deleted within a day. The site also counts how fast its pages appear, by your browser's own speed measures — largest paint, responsiveness, layout shift, first paint and server response — each recorded per page only as “good”, “needs improvement” or “poor”. And when a page runs into an error in your browser, it counts the error's name against that page — “TypeError”, say — never its message or anything else about your browser. Our counters have no event rows, no cookies, no IP addresses and no identifiers. Whether a page was your first in this tab, and whether you went on to a second, is settled in your browser tab and arrives as a yes or a no. The cost is that our own counters cannot count unique readers, and they are not meant to.

In your browser. One cookie, perly-display, remembers your choice of bitcoin or fiat and the display settings behind it for a year, and our server never reads it. The site's other preferences — the tour you finished, sound on or off, how a board is arranged, the fish tank's settings — live in your browser's own storage and never leave it. If you choose Allow in the cookie notice, Google Analytics loads and sets cookies of its own to count page views, the same Google Analytics as on this site; if you decline, it never loads. Your answer is kept in your browser's own storage, and the Cookies link in the site's footer opens the notice again.

Third parties your browser meets. Most feeds are read by our servers. A few things your browser fetches itself, and those hosts see your IP address as any website you open does: the news page loads publishers' icons from Google's icon service and posters' avatars from X's own image host, pbs.twimg.com; the food-chain page opens live connections from your browser to the exchanges it draws — Kraken, Binance, OKX, Bybit, Bitfinex and Hyperliquid; “Share on X” opens X with the page's address; and the counters above go to our database, so Supabase sees the request like any request. Nothing your browser sends to any of them says who you are.

Feedback. A note you leave in the feedback form is stored in our database: the words you wrote, a contact if you chose to leave one — an e-mail address or a handle, used only to answer you — the page you were on, its language, the width class of your screen and the time. The note keeps no IP address, no browser details, nothing you did not type. So that one script cannot flood the form, notes are counted per network address — five an hour — as a salted hash of the address, the way sign-in attempts are, deleted within a day. Notes are read by a person on our admin panel and kept for a year.

E-mail, Telegram, push

E-mail. We write to the address on your account through Resend, from perly.io: mail for the account itself — confirming your address, resetting your password, confirming a new address; a receipt for what you pay at the application's own checkout, and, the day after an invoice there lapses unpaid, a note that you can try again; reminders 30, 7 and 1 days before a paid year ends, and once after it ends; three letters about your fourteen free days if you have bought nothing — shortly before they end, once they have ended and a week after; one letter, sent once, to an account that two days after sign-up still has no portfolio of its own, on how to begin, with a link in it that stops letters like it; and answers to what you ask us. Nothing else: no newsletter, no advertising, nothing on anyone else's behalf. We note which letters went out and when, so that none goes twice, and when a stop link was used. When you pay for a seat or a year on Perly Pay's checkout, the application gives Perly Pay your address, and the receipt comes from Perly Pay, as do the reminders for a year that Perly Pay renews, under its own Privacy Policy. Perly Invoice sends no documents by e-mail.

Telegram. If you connect a chat to our bot, we keep its id, username and first name, and the bot sends you what you asked for: price alerts and goals, DCA reminders, market alerts, and from Perly Invoice that a document was opened, paid or is due, or that one addressed to you has arrived. Telegram is not end-to-end encrypted: the message — a target, a note, an amount, a link — sits on Telegram's servers, where Telegram can read it. Messages already delivered stay in that chat when you disconnect or delete your account.

Browser push. If you turn notifications on, we keep the push address your browser hands us and the keys that encrypt messages to it, for up to ten browsers. Delivery goes through your browser's own push service — Google's, Mozilla's or Apple's — which carries a message it cannot read.

Who else handles it

Perly runs on a few providers that process data on its behalf and for no one else:

  • Supabase — the database, sign-in and the functions behind the products, in the European Union (AWS, Ireland). Row-level security is enabled and forced on every table that holds a person's rows; a query from any other account returns nothing.
  • Vercel — hosting. The application and the invoicing site run in Dublin, the charts in Frankfurt, and this website is served from Vercel's network. Vercel and Supabase see the IP address of every request and keep it in their logs for a short time, to run and protect the service.
  • Resend — the e-mail above. Cloudflare — R2, where the encrypted nightly backup of the database is stored, in the EU, and Turnstile, the bot check on the application's sign-in and password forms. GitHub — runs that nightly backup; the copy is encrypted on its machine before it is stored.
  • Perly Pay — Perly's own checkout, at pay.perly.io, where the application sends you to pay for a seat or a year. It receives your account's e-mail address and its id, what you are buying with its price and any discount, the checkout's language and reference and the address to come back to, and handles the payment under its own Privacy Policy.
  • Google — analytics on this website, on the application's public pages, on the charts and on the invoicing site's public pages, only after you allow it; sign-in with Google, only if you choose it; its icon service for news sources. CoinGecko — the coin icons on portfolio pages. X — only if you sign in with it. Telegram — only if you connect a chat. Your browser's push service — only if you turn notifications on.
  • Better Stack — watches whether the four sites are up and shows it on the status page. It sees our servers, not you.
  • Sentry — error reports from the application, the charts and the invoicing site, stored in the EU. A report carries the error message, the stack trace, the page's address without its query, the browser and operating system, and the product's version; never your IP address, cookies, e-mail address or portfolio data. Sentry keeps reports for up to 90 days.
  • Public blockchain nodes and explorers, exchanges and market-data providers — asked by our servers for prices, chain data, the balances of addresses you watch and the payments made to us; on the food-chain page, by your browser too. They receive an address or a symbol, never who you are.

Access is locked down. Nobody outside Perly is given your records — not partners, not advertisers, not analytics vendors; the providers above process them only to run the service. Inside Perly, access is restricted to what keeping the service running strictly requires — restoring a backup, fixing a fault you reported, reading the notes readers leave. The admin panel shows counts, recent sign-ups and payments; it does not browse ledgers, and it cannot open an encrypted one.

What we can never reach. Perly holds no wallet connection, no seed phrase, no private keys and no exchange API keys — there is nowhere in the system for them to live. Your funds are outside our reach by construction: we could not move, freeze or spend them if we wanted to, and we cannot trade on your behalf.

How long, and where

  • Your account and everything in it — until you delete it. There is no soft-delete and no archive.
  • What you buy — the record of a payment outlives the account: when the account is deleted, the invoice, its transactions and their screening stay without the account they belonged to, because the transaction stays on a public chain anyway and a seat once sold is never sold again. A sale made on Perly Pay is kept the same way: the application's record of it and the notices logged with it stay without the account.
  • Counted sign-in attempts — a salted hash of the address, deleted within a day.
  • Charts counters, and the page-view totals of perly.io and pay.perly.io — forever; they hold nobody. Feedback notes, from the charts site and from the application — a year.
  • Invoice documents — until you delete the document, whatever its status, or your account; a voided document is kept like any other. A document written to you by somebody else is theirs and stays with them.
  • Backups — the whole database is copied every night, encrypted to a key only we hold, into Cloudflare R2 in the EU: a daily copy is kept for thirty days and a monthly one for a year. A deleted account therefore lingers in backups for up to a year before it is gone everywhere. A backup is only ever restored to bring the service back, never to look somebody up.
  • Telegram messages — on Telegram, as above. Exported files — on your disk.

Where it lives, and where it travels. Your data is stored in the European Union — the database in Ireland, the servers in Dublin and Frankfurt, the backup in an EU bucket. The person who administers it reaches the database under the access rules above. Google, X and Telegram take part only where you chose them, under their own terms; Cloudflare's bot check runs on Cloudflare's own worldwide network; the blockchain nodes and market feeds our servers ask are wherever they are, and receive an address or a symbol, never your identity. By Perly Pay's own Privacy Policy, its database, the servers its worker runs on and its backups are in the European Union, and Vercel serves its pages.

Your rights, and how to use them

For most of them you do not have to write to us: the application does them itself.

  • See and take everything — Settings → Your data gives you a JSON file of every row the account may read about itself, table by table, and names the tables it could not include; your transactions and realised gains also export as CSV, and an encrypted portfolio exports from its own page, where your browser can read it.
  • Correct — edit the entry, the profile, the contact or the unpaid document. Entries in the application can be edited while the account can write; after the fourteen free days or a subscription have ended, write to hi@perly.io and we will correct it with you.
  • Delete — at any time, after the free days or a subscription too: a transaction, a portfolio, a document whether sent or not, a contact, or the whole account — Settings → Delete account, confirmed with a typed phrase. Deletion is immediate and permanent, takes everything in the application and in Perly Invoice at once, and leaves only what the list above says stays.
  • Withdraw a consent — press Cookies in the footer of the site where you allowed Google Analytics — this site's home page, the charts or the invoicing site — and answer the notice again, and Google Analytics stops there at once; disconnect Telegram or turn notifications off in Settings.
  • Object, restrict, or ask anything else — write to hi@perly.io; we answer within a month. You may also complain to the data-protection authority of the country you live in.

Your age, and changes

Nothing here asks how old you are, and there is no age gate. Decisions about money are better made grown up; that judgement stays with you. When this policy changes, the date at the top changes with it.

Questions or requests: hi@perly.io

← Back to perly.io

© 2026 Perly. All rights reserved.