1. Make an app. Sign in at developers.ringcentral.com with the same login you use for your normal RingCentral account. Go to Console → Apps → Create App → REST API App.
2. Answer the setup questions like this. Auth type: JWT auth flow. Where will it be used: only my own account (a private app). Permissions: tick Read Call Log, Call Control, and Read Accounts. Call Control is the one that makes caller ID pop up on the board — without it nothing appears.
3. Client ID and Client Secret. Once the app exists, open it and look under Credentials. Both are on that page. Copy them into the boxes below.
4. The JWT. This one is not on the app page. Click your profile picture (top right) → Credentials → Create JWT. Pick production, and tick the app you just made. RingCentral shows the token once — copy the whole thing right then. It's very long and looks like three blocks of gibberish separated by full stops. If you lose it, just make another.
5. Account ID — you almost certainly don't need this. Leave it blank. It defaults to ~, which means "whichever account these credentials belong to", and that is what you want. Only fill it in if RingCentral support tells you to.
6. Shop phone number. The main number customers ring, in full international form: +15055551234. This is the number that shows on a customer's phone when you use "call them back".
7. Save, then press Test. Test tells you exactly what's wrong if something is off.
8. Last step, for the caller-ID pop. Copy the webhook address from the bottom of this screen into a RingCentral subscription for telephony sessions. Until that's done the call log and click-to-call work, but nothing pops up when the phone rings.
{shopId} and {roId}, filled in per car. Leave blank to use Tekmetric's standard URL. If the button ever lands on the wrong page, paste the correct URL for one RO here (keeping those two placeholders) and every card follows.client_email and private_key from it below.client_email from the JSON) with "Make changes to events" permission.@group.calendar.google.com).npm install once (this pulls in Clerk's SDK — the one real dependency this app has needed) and restart the server.create table shopboard_backups ( id bigint generated always as identity primary key, created_at timestamptz not null default now(), data jsonb not null ); alter table shopboard_backups enable row level security; grant select, insert, delete on shopboard_backups to service_role;The last line matters even if your project is older than mid-2026 — newer projects don't auto-expose tables to the API anymore, so this makes sure it works either way.
{vin}, {ro}, {year}, {make}, {model} or {plate} and they'll be filled in per car.