Once this is done, every job you mark Completed in ServiceTitan sends a review request to that customer, and the review that comes back is credited to the technician who did the work.
Setup happens on three surfaces, in this order:
ServiceTitan (
go.servicetitan.com), to get your Tenant ID.The ServiceTitan developer portal (
developer.servicetitan.io), to register an app and get your Application Key.ServiceTitan again, to connect that app to your account and generate a Client ID and a Client Secret.
Reviewflowz, to paste the four values in and turn the campaign on.
You end up with four credentials. Three of them are mandatory. Keep a notepad open as you go.
Credential | Where it comes from |
Tenant ID | ServiceTitan, Settings > Integrations > API Application Access |
Application Key | Developer portal, on your app, under Keys |
Client ID | Generated when your ServiceTitan account connects to your app |
Client Secret | Generated at the same moment, shown once |
Before you start
You need two ServiceTitan permissions enabled on your user, and an administrator on your team has to enable them:
Generate API Application Key
Manage API Application Access
Without those two, the developer portal will not let you in. This is ServiceTitan's rule, not ours.
You also need a Reviewflowz account on a plan that includes the integration and technician attribution, and SMS credits on top if you want to text rather than email. You can do all of the setup below first and add billing at the end. Nothing sends until you activate the campaign.
Part 1. Get your Tenant ID from ServiceTitan
The Tenant ID identifies your ServiceTitan account. If you run more than one company on ServiceTitan, each one has its own, and each one needs its own setup.
In ServiceTitan, click the Settings gear in the top toolbar.
In the side panel, search for Integrations.
Open API Application Access.
Your Tenant ID is at the top right of that page. Copy it.
Leave this tab open. You come back to it in Part 3, and you will see the same number again there under the label Allowed "tenant" value, which is the clearest confirmation you copied the right thing.
Part 2. Register an app on developer.servicetitan.io
This is the part that trips people up, so read the whole section before you click anything.
Go to developer.servicetitan.io and sign in. The sign-in screen offers four buttons in two columns. You want the right-hand column, ServiceTitan Customers, and the button that says Sign In as Production Environment User. The two Integration Environment buttons lead to a sandbox that cannot see your real jobs.
Sign in with your ServiceTitan credentials. Enterprise Hub and Partner Portal logins do not work here, it has to be a ServiceTitan user login.
Register the app
In My Apps, click Register New App, answer the question ServiceTitan opens with, and you land on the registration form. The Developer Details at the top describe the software the app talks to, which is us, so fill them in as:
Organization Name:
ReviewflowzOrganization/App Website:
https://www.reviewflowz.comEmail Address:
[email protected]
The website field needs the full https:// in front. Paste www.reviewflowz.com on its own and the form rejects it.
App Details below is about the app itself. Name it something you will recognise later, for example Reviewflowz. The description, the build-and-maintain question and the category do not change what the app can do, so answer them plainly. Click Generate on the External Data Application GUID.
Add your tenant and the five API scopes
Further down the same form is Tenant APIs. Add the Tenant ID you copied in Part 1, then click Add API Scopes.
Pick these five:
Jobs
Customers
Locations
Appointment Assignments
Business Units
Read access is enough. Reviewflowz never writes anything back to ServiceTitan. Each of the five does a specific job, and a missing one does not break the connection, it quietly removes a feature:
Scope | What it gives you | What happens without it |
Jobs | The completed job that triggers the request | Nothing works |
Customers | The name, email and phone to send to | Nothing works |
Locations | The service address on the job | We cannot tell which of your locations did the work |
Appointment Assignments | The technician assigned to the job | No technician credit, so no leaderboard |
Business Units | The readable name of your branch | Your branches show up as ID numbers |
The first company we connected was approved without the Locations scope, and it cost them every contact on day one. Tick all five.
Copy the Application Key
Save the app. Back on My Apps, each row has three icons under Actions. The pencil opens the app for editing, and that is where the Application Key lives. Copy it. That is credential number two.
The Application Key identifies the app, not your account. It does not change when you add tenants, and it is the same in the integration and production environments.
Part 3. Connect the app to your ServiceTitan account
The Client ID and Client Secret do not exist yet. They only get created when your ServiceTitan account grants the app access, so this step has to happen after Part 2 and not before.
In ServiceTitan, go to Settings, search Integrations, and open API Application Access. This is the same page you took your Tenant ID from in Part 1, and it lists every app that already has access to your data.
Click Connect New App. Your app appears in the list. If the list is empty, the app does not have your Tenant ID on it, so go back and add it.
Select it and click Connect. ServiceTitan shows you the scopes the app is asking for and you approve them. The app then gets its own detail page, and that page is worth a look. The Allowed "tenant" value on it is your Tenant ID, with a Copy button next to it, so if Part 1 left you unsure you had the right number, this is where you check. Underneath, Has Access To lists exactly what the app can reach.
Generate the Client ID and Client Secret
Go back to the developer portal, to My Apps. On your app's row, click the middle icon, the one that looks like a chain link. That is App Connections, and it is not signposted.
App Connections lists one row per tenant that has connected to your app. The row carries the Tenant/Network ID, the Client ID, and a Generate button for the Client Secret.
Copy the Client ID. Click Generate and copy the secret straight away, because it is shown once. Treat it like a password: paste it into Reviewflowz and nowhere else. We store it encrypted and never display it back to you.
Part 4. Connect ServiceTitan in Reviewflowz
In Reviewflowz, open Integrations in the bottom left of the sidebar.
Click Automate review requests at the top right.
Search for ServiceTitan and click the card.
Paste the four values:
Client ID, from Part 3.
Client Secret, from Part 3.
Tenant ID, from Part 1.
App Key, from Part 2. The field is labelled optional because we can fall back to our own app key, but you registered your own app, so paste yours.
Click Connect ServiceTitan.
We check the credentials, then check the Tenant ID separately, so the error message tells you which of the two is wrong:
Error | What it means |
ServiceTitan rejected those credentials | The Client ID or Secret is wrong, or the secret was regenerated after you copied it |
Those credentials work, but that Tenant ID does not | The pair belongs to a different tenant. Recheck Part 1 |
We could not find an App Key for this connection | The App Key field is empty and we have no fallback. Paste the Application Key from Part 2 |
When it works, the card turns green and shows how many jobs you completed in the last 30 days. That count is the proof we can actually read your data.
We then import your completed job history. Those past jobs populate your technician leaderboard straight away, and none of them gets a review request. Only jobs completed after you connect are ever messaged.
Part 5. Tell us which location a job belongs to
Skip this if you run a single location.
On the ServiceTitan settings panel, under Locations, pick how we decide which of your locations did the work:
Business unit, if your business units are branches. Then link each business unit to a Reviewflowz location in the table below.
Customer address, if your business units are trade lines rather than branches. We take the location closest to the customer on the job.
Set Fall back to as well. That is the location we use when the business unit is not linked and the address does not place the customer near anything.
If the business unit list is empty, complete a job in ServiceTitan and press Refresh list.
Part 6. Write the message and turn it on
The connection created a draft campaign called ServiceTitan review requests. It does not send until you activate it.
Open the campaign and click the gear icon next to the campaign title.
Pick the channel. Email works immediately. SMS needs a registered sender, which is a separate one-off process and takes a few days, so start with email if you want to be live today.
Write the message, or keep ours.
Set the delay. Sending 20 minutes after the job closes works better than sending instantly, because the technician is often still on site.
Add a follow-up if you want one, a few days later.
Send yourself a test.
Hit activate. You confirm that you have permission to contact these customers, and we review the campaign for compliance before it goes live.
From then on it runs on its own. A completed job becomes a contact in Requests, and the request goes out after your delay.
How fast is it
We check ServiceTitan for completed jobs every 15 minutes. ServiceTitan does not offer webhooks to new apps, so there is nothing to push us the event, and polling is ServiceTitan's own recommended approach in the meantime. Expect the request within about 15 minutes of the job closing, plus whatever delay you set.
Only the Completed status triggers a request. Scheduled, Dispatched, In Progress, Hold and Canceled do not.
When something is wrong
The app is missing from Connect New App. Your Tenant ID is not on the app. Developer portal, My Apps, edit the app, Tenant(s) section.
Everything connected but no requests are going out. Check three things in order: the campaign is active and not draft, the job status in ServiceTitan is Completed, and the job completed after you connected. Jobs completed before you connected are imported for reporting only and are never messaged.
Branches show as numbers. The Business Units scope is missing from your app. Add it in the developer portal, then press Refresh list on the Locations card.
Reviews are not being credited to technicians. The Appointment Assignments scope is missing. A job with several technicians credits each of them, so if one tech is missing rather than all of them, it is the assignment in ServiceTitan that is incomplete, not the scope.
You regenerated the Client Secret. Regenerating invalidates the old one. Paste the new secret into Reviewflowz, or the sync stops.








