Sources
Connect Search Console, GA4 or Plausible
Sign in with Google for Search Console and GA4, or add a Plausible Stats API key. Backfill, data delay and what each source adds.
Search Console is the source that turns page revenue into keyword revenue. GA4 or Plausible add traffic context: visits per landing page from a tool you already run. This page covers how each one connects, what Joinsight reads, how far back it goes and how fresh the data is. For the overviews, see Google Search Console, Google Analytics 4 and Plausible.
Only workspace owners can connect or change these sources.
Search Console and GA4: one Google connection
Search Console and GA4 share one connection, the Google card. You sign in once and pick a Search Console property and, optionally, a GA4 property.
Sign in with Google
Select Connect Google on the Google card. Google asks you to grant two read-only data scopes, plus your email address so the card can show which account is connected:
| Scope | What it allows |
|---|---|
webmasters.readonly | Read Search Console performance data and the list of your properties |
analytics.readonly | Read GA4 reports and the list of your properties |
Joinsight can't change anything in Search Console or Analytics. The card footer says so: "Joinsight can read Search Console and Analytics, nothing else."
Google's consent screen lets you untick each scope. Search Console is required: if you untick it, Joinsight hands the grant back to Google and asks you to connect again with the Search Console box checked. Analytics is optional. Without it, GA4 properties can't be listed and the card says so.
If something goes wrong during sign-in, the card explains what happened. The two you are most likely to see:
- "Google did not return a long-lived token." Remove Joinsight under Google Account, Security, Third-party access, then connect again.
- "The Google sign-in link expired or came from another browser." The sign-in has to finish in the browser that started it, within 10 minutes. Start again from the card.
Pick the properties
After sign-in, the card lists what the connected account can read:
- Search Console property: every property the account has access to, except those where it is only an unverified user. Domain properties appear as
example.com (domain). - Traffic source: GA4, Plausible or None. See GA4 or Plausible below.
- GA4 property: shown when the traffic source is GA4, grouped by Analytics account.
Select Save and sync. Joinsight checks that the account can really read the properties you picked, then starts the import. Until you save a property, nothing imports and the card shows Setup not finished. If the account has no verified Search Console property, verify your site in Search Console first, or connect the Google account that owns it.
Changing the Search Console property later replaces the stored history with the new property's. The same is true for GA4.
What Search Console provides
For each day, Joinsight stores clicks, impressions and average position by page, and by page and query. It reads web search results only, not image, video or news search.
URLs that differ only by protocol, trailing slash, query string or subdomain (on a domain property) are collapsed into one path, with clicks and impressions added up and position weighted by impressions. That is what lets a Search Console page line up with the landing path the snippet records.
16 months of history
Google keeps 16 months of Performance data, and the first sync imports all of it. It works newest day first, so recent weeks appear within minutes and older months fill in behind them. Progress shows on the card as "Importing 16 months of Search Console".
To keep the number of API calls down, the import first asks for daily impressions across the whole range, then groups quiet days into one request and gives busy days a request of their own. A small site's history is a handful of calls. The position in the import is saved after every batch, so a run that hits a quota resumes where it stopped.
Data delay and re-fetching
Search Console data runs 2 to 3 days behind, and the most recent days are preliminary: Google revises them as final numbers come in. Joinsight syncs every 6 hours, reads up to yesterday, and re-fetches the last 5 days on every sync. Each re-fetched range replaces what was stored, so preliminary rows that Google later drops don't linger.
Expect the last two or three days on any Search Console chart to be low or empty. That is the source, not a sync problem.
API limits
The Search Analytics API allows a limited number of requests per minute per property, and each response is capped. Joinsight spaces its requests to stay well under the per-minute limit, retries in place on a rate limit, and if Google's quota is still exhausted, waits and continues later.
Google returns at most 50,000 page and query rows per day. On a large site, the long tail beyond that is cut. Those clicks aren't lost: they stay in the page totals and show up as hidden queries. Search Console API limits covers the limits in detail.
Hidden queries
Google anonymizes rare queries to protect searchers' privacy. Their clicks count in each page's totals but never appear in the query list. Joinsight keeps the difference as its own hidden-queries bucket in keyword revenue, instead of spreading it across the queries Google does show. On some sites it is a large share. Search Console hidden queries explains why and how much.
Measured and modeled
Page revenue from organic Google search is measured: the snippet records the page a paying customer first landed on. Keyword revenue is modeled: Google never says which query a specific visitor typed, so Joinsight splits a page's organic revenue by each query's share of that page's clicks, month by month. The dashboard labels it as modeled. The definitions of keyword revenue and keyword opportunities are written out in full, and How attribution works explains the difference.
Pages before revenue
You don't need revenue or the snippet for Search Console to be useful. A page with Search Console clicks appears in the Pages table on the Content and channels screen as soon as its data is imported, with search clicks and no sessions or MRR yet. Sessions, signups and revenue fill in once the snippet is installed and customers arrive.
GA4
GA4 reads sessions, users and key events by landing page and default channel group, per day. The first sync imports 13 months; every sync after that re-fetches the last 3 days, because GA4's recent days are still changing. It syncs with Search Console, every 6 hours, and only while GA4 is the traffic source.
Why GA4 is context only
GA4 reports are aggregates. They say how many sessions a landing page had, not which visitor became which Stripe customer. Linking a GA4 visitor to a customer would need GA4's raw event export, which Joinsight doesn't use. So GA4 numbers never feed attribution. Attribution comes from Joinsight's own first-party snippet and the identify() call at signup.
That makes GA4 optional. The snippet already counts sessions per landing page for attribution. GA4 adds the traffic history you had before the snippet was installed.
Plausible
Connect Plausible
Plausible connects on its own card, with a Stats API key:
- In Plausible, open Account settings, API keys, and create a new Stats API key.
- On the Plausible card in Joinsight, paste it into Stats API key.
- Enter the Site ID: the domain as it appears in Plausible, like
example.com. A pastedhttps://prefix or trailing slash is removed. - If you self-host Plausible, enter your instance's address in Host, starting with
https://. Leave it empty for plausible.io. - Select Connect Plausible.
Joinsight runs one small query to check the key, site and host before storing anything. A key whose team can't see the site, a host without a Stats API, or a plan without Stats API access is named on the matching field. Plausible's Stats API may need its Business plan.
What Plausible provides
Visitors and visits per day, by entry page and source. The first sync imports 12 months; every hourly sync after that re-fetches the last 3 days. Joinsight doesn't read goals or conversions from Plausible, only visits and visitors.
Plausible's API allows 600 requests per hour per key. Joinsight spaces its requests to one every 6 seconds, which keeps a 12-month import well inside the limit. If the limit is reached anyway, the next attempt waits an hour. Like GA4, Plausible numbers are aggregates and never feed attribution.
Connecting another site, or the same site ID on another host, replaces the stored history with the new site's. When Plausible answers a query with an error, the card shows Plausible's own message.
GA4 or Plausible
Use one or the other. They answer the same question, and the Google card's Traffic source setting decides which one is used:
- Connecting Plausible switches the Google card's traffic source to Plausible, so GA4 stops syncing.
- While Plausible is connected, the Google card doesn't accept GA4 as the traffic source. To switch to GA4, disconnect Plausible first.
- Disconnecting Plausible sets it back to None.
- Choosing GA4 on the Google card, then picking a GA4 property, makes GA4 the traffic source.
Search Console doesn't depend on this choice: it keeps syncing whichever traffic source you use, or none. GA4 vs Plausible for SaaS compares the two tools if you haven't picked one yet.
Sync status
Each card shows the same statuses as the billing sources: Waiting to sync, Setup not finished, Syncing, Synced with a time, Sync failing and Access revoked. Setup not finished appears on the Google card until a Search Console property is saved. Connect Stripe and RevenueCat explains each one and which errors appear on the card.
Two cases specific to these sources:
- Google access revoked or expired. This happens when you remove Joinsight from your Google account, or when Google expires the grant. The card shows Reconnect Google. Your property choice and history are kept, and syncing resumes right after you reconnect.
- Plausible key rejected. The card asks for a new Stats API key.
Disconnecting
Google. Select Disconnect at the bottom of the Google card and confirm with Disconnect Google. Joinsight first revokes its access at Google, then deletes the stored token. Search Console and GA4 data both go, because they share the connection.
Plausible. Select Disconnect and confirm with Disconnect Plausible. The stored key is deleted. Revoke the key in Plausible yourself if you no longer need it.
In both cases, a cleanup job that runs once a day deletes the source's stored data, so it's usually gone within a day and always within 30 days. If you connect again before the cleanup has run, the old data is deleted before the first import starts. See Security and privacy for what Joinsight stores.