Privacy and analytics
GatewayScore is a research site. It has no visitor accounts or advertising. Optional email updates let you follow published changes. The only thing it wants to know is which comparisons and guides get used, so the next ones are written about the right products.
The short version
- No analytics is recorded until you press Allow analytics. If you decline, no analytics code is downloaded at all.
- No advertising, no ad networks, no sale of personal data, and no cross-site tracking. Service providers process limited data as described below.
- No session recording and no screen capture. Cost inputs and selected wizard answers are not sent to analytics. A wizard share link includes your answers.
- No visitor account is needed. If you subscribe, we collect your email address and optionally your full name.
- You can change your mind at any time, on this page, and it takes effect immediately.
What the tools do with your numbers
The cost estimator and the fit wizard run entirely in your browser. Your token volumes, request counts, seat numbers and model prices are computed on your own machine and are never sent anywhere — not to this site's servers, and not to the analytics service. What is recorded is that a field was changed, and which field it was, never the value you put in it. The one exception is stated plainly in the table below: searches on the all-providers page record the words you searched for, because that is the only way to find out what buyers are looking for and failing to find.
Wizard analytics record question IDs, progress, timing and result interactions, not selected answers. Your progress is kept in browser history. If you choose to copy a result link, it includes your answers in the URL fragment (after #); anyone with the link can read them. URL fragments are not sent in HTTP requests. Older links using ?a= send those answers to our hosting server when opened; the wizard removes that query after loading.
Who processes it
Analytics is provided by PostHog, acting as a data processor. Requests are served from this site's own domain rather than a third-party one, which means they are not blocked by the ad blockers most of this site's readers run — the reason for that is measurement accuracy, not evasion, and it changes nothing about what is recorded. The full list is below, and it is the same list the code emits from.
Every event this site can record
All 45 of them. This table is generated from the site's source code at build time, so it cannot fall out of date with what actually runs.
| Event | What it means |
|---|---|
admin_schema_seeded | The admin schema seeder was run. Present so the seeding itself is auditable. |
back_to_top_clicked | The back-to-top control was used, which implies a long scroll. |
citation_copied | Someone copied a citation for a page. |
comparison_cleared | Someone emptied the comparison selection. |
comparison_completed | Someone stayed with a comparison they had built themselves, rather than bouncing off it. |
comparison_diff_only_toggled | The "differences only" filter was switched on or off in the comparison table. |
comparison_pair_viewed | One of the prebuilt head-to-head pages was opened. Separate from the interactive comparison, and a direct signal of which pairs to build next. |
comparison_provider_included | One product was part of a settled comparison. Emitted once per product so PostHog can break down which products get shortlisted; excludes the preselected defaults, which would otherwise dominate. |
comparison_run | A visitor-chosen set of products settled in the comparison table. Fires on the settled set, not on each click, so dragging through six products is one comparison rather than six. |
comparison_started | Someone changed the comparison away from its preselected default. This, not the page load, is the start of a comparison. |
cost_estimate_completed | Someone produced an estimate from their own numbers and stayed with the result. |
cost_estimate_input_changed | A cost estimator field was changed. Recorded once per field per session, so dragging a slider does not flood the stream. |
cost_estimate_mode_changed | The estimator was switched between gateway-overhead-only and total-spend. |
cost_estimate_preset_applied | A workload preset was applied in the cost estimator. |
cost_estimate_provider_expanded | Someone opened the line-by-line breakdown for one product in the estimator. |
cost_estimate_started | Someone changed their first input in the cost estimator. The estimator renders a full answer from prefilled defaults, so this is the first point at which a real estimate exists. |
cost_estimate_tier_applied | A model price tier was applied in the cost estimator. |
glossary_term_opened | An inline glossary definition was opened. |
guide_read_completed | Someone reached the end of a guide AND was on the page long enough to have plausibly read it. Scroll position alone is not treated as reading, because the End key reaches the bottom in one keystroke. |
guide_viewed | A guide was opened. Deliberately duplicates the standard pageview so that "read the guide" funnels can be built without filtering on URL patterns. |
helpful_vote_submitted | Someone answered the "was this useful" prompt. |
mode_toggled | Someone switched between the plain-language and technical presentations. A strong signal about who the audience actually is. |
model_load_failed | The model directory could not load. No raw error messages or search text are sent. |
model_page_changed | A visitor moved between model result pages. Includes current filters, sort order and result count bucket. |
model_provider_opened | A visitor opened a provider page from a model result or price comparison. Includes the exact public model ID and current filter context. |
model_search_changed | A visitor changed model search, exact model selection, provider, use, collection, evidence, access, sort order, or model-provider comparison controls. Raw search text is not collected. |
model_source_opened | A visitor opened an official source for a model listing. |
outbound_link_clicked | Someone followed a link off the site, usually to a vendor. This is the moment the research hands a buyer over, and the nearest thing the site has to a conversion. |
page_not_found | A 404 was served. Catches broken inbound links and stale URLs still being followed. |
provider_fee_slider_changed | The modelled monthly fee slider was moved on the all-providers page. |
provider_filter_applied | A filter chip was applied on the all-providers page. Tells you which fields buyers actually shortlist on. |
provider_search_no_results | A provider search returned nothing — either a gap in the catalogue or a vocabulary mismatch worth fixing. |
provider_search_performed | A search was run on the all-providers page. The query is recorded because it says what buyers came looking for. |
subscription_action_result | A consented subscription action received a successful HTTP response or failed. An accepted signup/link request does not prove delivery or reveal whether an email is registered. |
subscription_action_submitted | A visitor submitted signup, confirmation, management-link, preference-save, unsubscribe or profile-delete action. Includes only action and form location. |
subscription_preference_changed | A subscription frequency, interest selection, status or email-consent control changed. Interests are represented only by their count. |
subscription_started | A visitor began interacting with a subscription form after granting analytics consent. No name, email address or token is sent. |
subscription_validation_failed | A subscription form failed browser validation. Only the form location is recorded, never field contents or validation messages. |
theme_toggled | Someone switched between light and dark. |
wizard_answer_edited | Someone went back to change a single wizard answer from the results screen. |
wizard_completed | Someone reached their wizard recommendations. |
wizard_question_answered | One wizard question was answered; the selected answer is never sent. Keyed on question id rather than step number, because the wizard branches and step 4 is a different question for different people. |
wizard_recommendation_expanded | Someone opened the reasoning behind one wizard recommendation. |
wizard_restarted | Someone cleared their wizard answers and started again. |
wizard_started | Someone answered the first question of the fit wizard. Latched once per session, so reloading mid-wizard does not count twice. |
Your choice
Checking…
Your choice is stored in this browser only. Clearing site data resets it, and you will be asked again.
Things this site does store
Independently of analytics, a few preferences are kept in your browser's own storage and never leave it: whether you chose the plain-language or technical view, your light or dark theme, your place in the wizard, and a note of which pages you have already voted "useful" on so you are not asked twice. Voting on a page sends the vote itself to this site.
Email subscriptions
When available, email updates require a separate opt-in and email confirmation. We collect your email address, optional full name, delivery frequency, selected provider interests, and records of confirmation and preference changes. We use your name only for subscriber management and email personalization. Email consent does not enable analytics, and declining analytics does not prevent subscribing.
Weekly updates are scheduled for Tuesday at 9 a.m. America/Chicago; monthly updates for the first Tuesday at that time. We send only reviewed editions containing relevant published changes. Confirmation and requested management-link emails are sent separately. You can change your name, interests and frequency, pause, unsubscribe, or delete your profile through a private management link requested on the subscription page.
Supabase stores subscription records, Cloudflare hosts the service and runs delivery jobs, and Resend delivers email. These providers process data on our behalf. Processing may occur outside your country; applicable provider agreements and transfer safeguards govern that processing. We do not sell subscriber data. With separate analytics consent, subscription forms report interactions and request outcomes, such as a frequency change or an accepted unsubscribe request. Subscription names, email addresses and private tokens are not sent to PostHog. We do not enable email-open pixels or tracked click redirects.
We record delivery attempts, delivery status, bounces and complaints to operate the service. Unconfirmed profiles are deleted after seven days. Detailed delivery records are removed after 90 days. We keep your active profile and associated consent history until you delete it; unsubscribing stops digests but does not itself erase that history. Deleting a profile removes its name, address, preferences and linked consent history. A minimal hashed-address suppression record may remain to prevent unwanted email. A hash is still treated as personal data. Hosting and email providers may retain operational logs under their own retention policies.
For abuse prevention, the subscription service temporarily stores a salted hash derived from the request IP address and a salted email hash with request counts. These rate-limit records expire after one hour and are removed by routine cleanup. Confirmation and management tokens expire after 24 hours. Unsubscribe links remain valid for two years; you can always request a fresh management link.
You can withdraw consent at any time using unsubscribe links, without signing in. A message already handed to the delivery provider may still arrive. Depending on your location, you may also have rights to access, correct, erase or receive your data, restrict processing, and complain to a supervisory authority. Contact us to exercise those rights.
Contact
Questions, or a request to have something removed: see the about page.