What We Collect
Your design files are processed entirely on your machine — they never leave it, so there is nothing file-shaped to send anywhere. What we do send is usage metadata, and this page lists every piece of it. Event payloads carry no file names, no file contents, and no email addresses.
The two systems we run
- Google Analytics 4 runs on both this website and the editor. It records page views and the behavior events listed below — nothing else.
- Vercel Analytics records anonymous, cookieless page-view counts for this website only — a raw traffic baseline. It never receives custom events, and it does not run in the editor.
Events this website sends
This is the complete list of behavior events this website sends, together with every piece of data each one carries:
| Event | When it fires | Data it carries |
|---|---|---|
editor_open_click | You click a link that opens the Figpea editor | source_path — the path of the page you clicked from (never the query string) |
checkout_started | You start a checkout | billing — the billing interval (monthly or yearly) or pass for the one-time Rescue Pass |
checkout_completed | You return from a successful checkout (counted once per checkout) | billing — the billing interval |
login_completed | You sign in (counted once per login) | nothing |
The events listed above are sent by this website (figpea.com) only. The Figpea editor runs on a separate domain and sends its own, separate set of events — those are listed in the next section.
Events the editor sends
The Figpea editor at editor.figpea.com sends its own set of events. This is the complete list. You can see the same list inside the editor at any time — open the main menu and choose What We Collect.
| Event | When it fires | Data it carries |
|---|---|---|
file_open_started | When you open a design file, right as Figpea starts parsing it. | file_type |
file_render_success | When a design file finishes parsing and first renders successfully. | file_type, page_count, elapse_ms |
file_open_failed | When a design file fails to open (unsupported format, parse error, etc.). | file_type, reason |
inspect_used | When you select a layer to inspect it. | nothing |
measure_used | When you hover a second layer while one is selected, revealing the distance measurement. | nothing |
color_picked | When you click a color swatch in the inspect panel to copy it. | nothing |
code_copied | When you copy a layer's generated code (e.g. CSS) to the clipboard. | format |
export_performed | When a layer or project export completes. | format, scope, scale |
presentation_opened | When you switch into Presentation mode. | nothing |
prototype_played | When you follow an authored interaction link while presenting. | nothing |
font_substituted | When an opened file references fonts Figpea can't load, so a fallback is substituted. | count |
layer_edited | When you edit a layer (moved, restyled, retyped, etc.) — at most once per 500ms burst. | op_type |
paywall_hit | When a free-plan action is blocked by a Pro-only feature gate. | claim |
archive_auto_opened | When a dropped .zip archive contains exactly one openable file (a design file, or a lone image) and Figpea opens it automatically. | file_type, count |
archive_picker_shown | When a dropped .zip archive contains more than one openable file and Figpea shows a picker so you can choose which to open. | format, count |
Two more fields ride along on every one of those events:
version— which build of the editor you're running.plan— your plan tier (free, or the paid tier you're on). Not your email, not your account ID.
What each of those fields means
file_type— which format the file is:psd,xd,figma,svg,pdf,ai,image, orfigpea. Onarchive_auto_openedit can also beunknown, when the archive's single file couldn't be identified. Never the file's name.page_count— how many pages the file turned out to contain.elapse_ms— how long parsing took, in milliseconds.reason— why an open failed, as one of six fixed categories:unsupported-format,parse-failed,download-failed,dependency-load-failed,archive-no-supported-content,open-failed. Never the underlying error text.format— which output format you chose, e.g.svg,png,css. Onarchive_picker_shownthe same field instead records what kinds of files the.zipheld:design,image, ormixed.scope— whether an export covered one layer (single) or several (batch).scale— the export scale multiplier, e.g.2for @2x.op_type— which kind of edit you made, as one of seven fixed buckets:transform,style,text,structure,visibility,mask,other. Never the layer's name and never the value you changed it to.claim— which Pro-gated capability was blocked. See Plans & Pro.count— a plain number: how many fonts were substituted, or how many openable files a.zipcontained.
Third-party account access: Google Drive
Figpea can open design files stored in Google Drive. When you use this feature, Figpea requests permission to read the specific files you pick from your cloud storage.
Figpea requests the drive.file scope, a per-file permission that grants access to the file you pick. Google shows you a picker, you select the file you want, and Figpea can only read that specific file. You grant this permission once per file.
How your file is handled
The token used to fetch your file is short-lived — it's created when you request the file, used only for the immediate download, and never stored or refreshed. When Figpea fetches your file, the bytes travel directly from Google into your browser tab and never pass through a Figpea server — they're decoded by the same client-side pipeline that handles local files.
Figpea never writes anything back to your Drive. Your original file is never changed — Figpea only ever creates new files.
Revoke access
To stop Figpea's access to your cloud storage:
- Google Drive: Revoke Figpea's permission in your Google Account settings.
What is never collected
Our analytics never include file names, never include file contents, and never include email addresses or other personal details.
Both surfaces enforce that in code, not by policy. Every parameter is checked against the lists above before an event is sent, and anything not on them is dropped. In the editor, the fields with a fixed set of values — reason, op_type, scope, claim — are checked against that set too: a value that isn't one of the listed options is dropped rather than sent as-is. There is no free-text field anywhere in either list, so nothing from inside your file can travel in one.