Setup guide
Connect Google Search Console
Tripple Engine uses your own Google Cloud OAuth client, so ranking data is pulled against your project. It takes about five minutes.
- 1
Create a Google Cloud project
Go to the Google Cloud Console and create (or pick) a project.
- 2
Enable the Search Console API
Under APIs & Services → Library, search for Google Search Console API and click Enable.
- 3
Configure the OAuth consent screen
Choose External, add your email as a Test user, and add the scope
.../auth/webmasters— the read-write one. It is what lets Tripple Engine resubmit your sitemap as a discovery hint when an article is published. Sitemap submission does not guarantee crawling or indexing; the read-only scope syncs rankings but refuses submissions. - 4
Create an OAuth Client ID
Under Credentials → Create credentials → OAuth client ID, pick Web application. Add the Authorized redirect URI shown on the Rankings page (it ends in
/api/public/gsc-callback). - 5
Paste the client into Tripple Engine
Copy the Client ID and Client secret into Rankings → Google Search Console, save, then click Connect Google and approve access.
- 6
Set each site’s property
Under Search Console properties, enter the exact property for each site — e.g.
https://example.com/orsc-domain:example.com. Then click Sync now.
Schedule the background jobs
Tripple Engine exposes HMAC-signed endpoints for the daily ranking sync and for autopilot’s queue. Schedule both with Supabase pg_cron + pg_net, replacing the app URL and your CRON_HMAC_SECRET:
The queue processor’s interval is worth getting right. An article is written ahead of time and goes live on the first run at or after its scheduled minute, so that interval is the worst case for how late it can be.
-- Supabase: enable extensions (Database → Extensions)
create extension if not exists pg_cron;
create extension if not exists pg_net;
create extension if not exists pgcrypto;
-- Schedule the daily HMAC-signed sync (06:00 UTC)
select cron.schedule(
'tripple-engine-daily-gsc',
'0 6 * * *',
$$
select net.http_post(
url := 'https://YOUR_APP_URL/api/public/sync-gsc',
headers := jsonb_build_object(
'x-timestamp', extract(epoch from now())::bigint::text,
'x-signature', encode(
hmac(extract(epoch from now())::bigint::text, 'YOUR_CRON_HMAC_SECRET', 'sha256'),
'hex'
)
)
);
$$
);
-- Autopilot's queue processor. THE INTERVAL HERE IS THE PUBLISH ACCURACY: an
-- article goes live on the first run at or after its scheduled minute, so an
-- hourly job puts every article up to an hour past the time the schedule says.
-- Every 10 minutes keeps the difference invisible to a reader.
select cron.schedule(
'tripple-engine-process-queue',
'*/10 * * * *',
$$
select net.http_post(
url := 'https://YOUR_APP_URL/api/public/process-queue',
headers := jsonb_build_object(
'x-timestamp', extract(epoch from now())::bigint::text,
'x-signature', encode(
hmac(extract(epoch from now())::bigint::text, 'YOUR_CRON_HMAC_SECRET', 'sha256'),
'hex'
)
)
);
$$
);
-- cron.schedule replaces a job of the same name, so re-running the block above
-- is how you change an interval you already set. To see what is really
-- running: select jobname, schedule from cron.job;