Connections
The Betterloop snippet sees what happens in a browser. That is enough to find rage clicks, dead controls, JS errors and slow pages - but not to tell you that the dependency behind your checkout has a published CVE, that a quarter of your CI runs fail, or that nobody has ever bought your middle pricing tier. Connect the tools that know those things and the recommendations widen accordingly.
How it works
Every source is normalized into the same shape - a signal with a domain, a stable key, a value and a target. Detectors and the AI strategist read signals, not APIs, which is what allows a single recommendation to draw on two sources at once. Two consequences worth knowing:
- Signals are append-only, so a number that gets worse between syncs is detected as a regression automatically - no per-source trend code. Observations are kept for 90 days and older ones are pruned.
- Cross-source findings become possible. The clearest example: server-side analytics counts visitors that our in-browser SDK never sees, and the gap between them is your ad-block and Do-Not-Track rate, which neither tool can tell you alone.
Credentials
Tokens are encrypted with AES-256-GCM before they touch the database and are never rendered back to the browser, not even to you - the connect form shows a blank field and leaves the stored value alone if you submit it empty. Use read-only or least-privilege credentials everywhere; nothing here ever writes to your accounts. If a connector needs a scope you did not grant, it skips those signals rather than failing.
Available sources
Site audit
no credential neededNo setup: fetches your public page and reads the headers, HTML and markup a browser or crawler actually receives.
- Credential
- None. It reads only what your site serves publicly.
- Sync interval
- every 12 hours, plus immediately when you connect it or press Sync now
- Settings
url (optional) - Optional. Leave it blank and we audit the origin we already see in your telemetry.
PageSpeed Insights
Google's own Lighthouse scores plus the real-Chrome Core Web Vitals its ranking signal reads, on mobile and desktop.
- Credential
- Google's keyless allowance for this API is now zero requests a day, so without a key every sync fails with a quota error. Create an API key in Google Cloud, enable the PageSpeed Insights API on the same project, and paste the key here - the key is free. Do not put an HTTP-referrer restriction on it: this call is made from our server and sends no referrer. Create one
- Sync interval
- every 24 hours, plus immediately when you connect it or press Sync now
- Settings
url (optional) - Leave blank to test your home page. Otherwise point it at the page that matters most - a pricing or checkout page is usually where a slow score costs real money.
GitHub
Engineering health from the repo itself: security alerts, CI failure rate, review latency and release cadence.
- Credential
- A fine-grained token with read access to Contents, Issues, Pull requests, Actions and Dependabot alerts on the one repository, or a classic token with repo and security_events. Read-only is enough - Betterloop never writes to your repo. Create one
- Sync interval
- every 6 hours, plus immediately when you connect it or press Sync now
- Settings
repo (required) - The repository to read, for example "vercel/next.js". Pasting the GitHub URL works too.
Sentry
Production crashes with real reach - which errors fire, how many users each one hits, and whether your newest release made it worse.
- Credential
- Create an organization auth token in Sentry under Settings > Auth Tokens. Tick project:read and event:read, plus org:read and project:releases if you want crash-free session rates and release regressions. Create one
- Sync interval
- every 2 hours, plus immediately when you connect it or press Sync now
- Settings
organization (required) - The part after /organizations/ in your Sentry URL.
project (required) - The project's short name, shown under Settings > Projects.
host (optional) - Leave blank for sentry.io. Use eu.sentry.io for EU-region accounts, or your own domain for a self-hosted install.
Stripe
What customers actually pay: MRR, which plans sell, trials, churn and failed payments.
- Credential
- Create a RESTRICTED key with READ permissions only - never a full secret key. Betterloop never writes to Stripe, so it does not need one and will not accept one. In the Stripe Dashboard open Developers > API keys, click "Create restricted key", set Read on Subscriptions, Products, Invoices, Charges and Events, leave everything else at None, and paste the key that starts with rk_. Create one
- Sync interval
- every 12 hours, plus immediately when you connect it or press Sync now
Plausible Analytics
Visitor, referrer, channel and goal numbers from Plausible - a second independent count to check our own SDK against.
- Credential
- In Plausible, open account settings and create a Stats API key. It is read-only and covers every site the account can see. Create one
- Sync interval
- every 6 hours, plus immediately when you connect it or press Sync now
- Settings
siteId (required) - The domain exactly as registered in Plausible, without https:// and without a trailing slash.
host (optional) - Only for a self-hosted install. Leave blank to use plausible.io.
Turning one on
Open a project, go to Connections, and press Connect. The first sync runs immediately so a bad credential is reported while you are still on the form. Findings appear in the insight feed on the next engine run, tagged with the source they came from, and in your email report.