Skip to main content
This example builds an inbound receptionist agent that uses a Google Sheet as a lightweight CRM. During a live call the agent can:
  • Recognize the caller by caller ID and greet them by name with their next appointment
  • Answer account questions about appointments, technician, job status, balances and open tickets
  • Reschedule an appointment and write the new date back to the sheet
  • Open a support ticket and read the ticket number back to the caller
  • Log every call to a Call Log tab after the call ends
While a call is in progress, the row being worked on turns light blue and every changed cell turns yellow, so anyone watching the sheet sees the agent work in real time. That makes it a strong live sales demo, and a practical CRM for small businesses that already run on Google Sheets. Setup takes about 20 minutes and needs no programming. You paste in a script we provide, publish it, and add four webhooks to your agent.

A caller reschedules his appointment, and the agent updates the sheet during the call.

The example business, Cut Twice and Measure Once Handyman Services, and every customer in the sample data are fictional. Replace them with your own business and records.

How it works

The script runs on Google’s servers under your Google account, so the spreadsheet does not need to be open for the agent to work.

What you need

Set up the spreadsheet

1

Create the spreadsheet

Go to sheets.new to create a new, empty Google Sheet. Click Untitled spreadsheet in the top-left corner and give it a name, such as Customer CRM. Leave this tab open.
2

Add the script

  1. In the spreadsheet, click Extensions > Apps Script. A new tab opens.
  2. Select all of the sample code (Ctrl+A or Cmd+A) and delete it.
  3. Open the script on GitHub and click the Copy raw file button in the toolbar above the code.
  4. Paste it into the empty Apps Script editor.
  5. Click Save or press Ctrl+S / Cmd+S.
Copy the code from GitHub or from the source at the bottom of this page, not from a Word document or email. Word can turn straight quotes into curly quotes, which breaks the script.
3

Build the sheet

  1. In the function dropdown at the top of the editor, choose setupSheet and click Run.
  2. The first time, Google asks for permission. Click Review permissions, choose your account, click Advanced > Go to (your project), then Allow. This happens only once.
  3. Back in the spreadsheet you will see a Customers tab with 26 columns, a Call Log tab, and a new Telzino menu in the menu bar.
4

Load sample data (optional)

Choose loadSampleData in the dropdown and click Run. This adds nine fictional customers whose appointment dates are set relative to today, so the demo never goes stale.In the two Test Caller rows, replace YOUR MOBILE NUMBER with your own mobile number. This is how the agent recognizes you on your test call.

Column rules

The script finds columns by their header name, so:
  • Do not rename the column headers. You can add extra columns to the right.
  • Each customer has one Customer ID. A customer with several jobs gets one row per job, all sharing the same Customer ID.
  • Phone numbers can be in any format. 941-555-0100, (941) 555-0100 and +19415550100 all match.
  • Enter dates as YYYY-MM-DD, for example 2026-10-30.
  • Leave Last AI Activity blank. The agent fills it in.
  • New rows are live immediately. The agent sees them on the very next call, with no redeploy.

Publish the Web App

1

Deploy

  1. In the Apps Script editor, click Deploy > New deployment.
  2. Click the gear icon next to Select type and choose Web app.
  3. Set Execute as to Me and Who has access to Anyone.
  4. Click Deploy and approve permissions if asked.
  5. Copy the Web app URL. It ends in /exec.
2

Test the connection

Paste the URL into a browser and add ?action=ping to the end. You should see:
3

Protect the endpoint (recommended)

Anyone with the Web App URL can call it. Add a shared secret so only your agent can.
  1. In the Apps Script editor, click Project Settings (the gear icon), scroll to Script Properties and click Add script property.
  2. Set the name to CALLBACK_SECRET and the value to a long random string. Click Save script properties.
  3. From now on, every URL you enter in Telzino must end with &secret=YOUR_SECRET. Requests without it are rejected with Unauthorized.
Script changes only go live after you publish a new version: Deploy > Manage deployments > edit (pencil) > Version: New version > Deploy. The URL stays the same.

Add the functions to your agent

Open your agent, go to Agent Settings > Functions, click (+) and select Webhooks. Add the four webhooks below. In each URL, replace YOUR_WEB_APP_URL with your Web App URL and YOUR_SECRET with your CALLBACK_SECRET. If you skipped the secret, remove &secret=YOUR_SECRET. For every webhook, add one header: Content-Type = application/json.

1. Lookup Customer

Click Save on the agent.
Keep action in the URL, not in the parameters. The script always uses the action from the URL, so the agent can never trigger the wrong action.

Configure by API instead

The same four webhooks can be set through the Agents API in extensions.tools. Example for the lookup function:

Add the agent prompt

Paste the prompt below into your agent’s prompt and adjust the business details. It tells the agent when to call each function, how to verify callers before discussing money, and how to speak dates, times and amounts naturally.

Why the prompt is built this way

Look up first, greet second

The agent calls lookup_customer as soon as the caller speaks and covers the short wait with “One moment while I check our records.”

Caller ID is not proof of identity

Appointment details are shared on a caller ID match, but money and changes require the ZIP code on file. Callers found by name or job number always confirm the ZIP.

Confirm before writing

The agent reads the new date back and waits for a yes before calling reschedule_appointment.

Speakable responses

Dates come back as “Thursday, October 22, 2026” and amounts as “$250”. Every response includes today’s date so the agent can work out “next Monday” correctly.
The script also tells the agent what to do next. When nobody matches, or several customers match, the response includes a plain-English instruction the agent follows.

Test it

1

Watch the sheet

Open the spreadsheet on a screen where you can see it.
2

Call the agent

Call your agent from the mobile number you entered in the Test Caller rows. As soon as you speak, those rows turn light blue and the agent greets you by name with your deck repair appointment.
3

Try these requests

The sheet keeps one ticket per job row. A new ticket on job J-2041 replaces T-5512 in that row, so ask about open tickets before you report the leak. The Call Log keeps every ticket.
4

Check the Call Log

Hang up. Within a few seconds the Call Log tab shows each action plus the call summary.
5

Test an unknown caller

Call from a different phone and give the name Sarah Mitchell or the job number J-2045. To see the multiple-match flow, give just the last name Carter.
6

Reset for the next demo

Use Telzino > Clear highlights in the spreadsheet menu to remove the colors.

Understanding the responses

boolean
false when no customer matched. The agent asks for a name or job number and tries again.
boolean
true when more than one customer matched (for example, two Carters). The response includes candidates, and the agent asks which one, then looks up again by customer_id.
string
caller_id, name, job_number or customer_id. The prompt uses this to decide when ZIP verification is required.
string
Today’s date in the sheet’s time zone, so the agent can resolve relative dates like “next Monday”.
boolean
false when the action could not run. The error field says why, for example “Customer has more than one open job; pass job_number.”

Troubleshooting

Check that your mobile number is in the Phone column of the Test Caller rows, then open the Debug tab to see exactly what Telzino sent.
Caller ID was not available on that call. The script ignores unfilled placeholders, so the agent falls back to asking for a name or job number.
The &secret= value in the Telzino URLs does not exactly match the CALLBACK_SECRET script property.
The deployment is not set to Who has access: Anyone. Edit the deployment and change it.
Publish a new version: Deploy > Manage deployments > edit (pencil) > New version > Deploy.
A header was renamed or deleted. Restore the original header text exactly.
Set the same time zone in three places: TIMEZONE in the script’s CONFIG section, File > Settings in the spreadsheet, and the Apps Script Project Settings.
You may have run an internal helper (names ending in _). Choose setupSheet or loadSampleData and run again.

Going to production

  • Turn off debugging. Set DEBUG to false in the CONFIG section so raw requests, which include phone numbers, are no longer stored on the Debug tab. Then publish a new version.
  • Use the shared secret. Set CALLBACK_SECRET as described in Publish the Web App.
  • Limit sheet access. Share the spreadsheet only with staff who need it. The Web App runs as you, so it works regardless of who else has access.
  • Plan for scale. Google Sheets suits small teams and demos. For high call volume, point the same four webhook contracts at your real CRM; the agent prompt does not change.

The script