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

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.