Guide · Ticketing
How to build a simple ticketing system with Google Forms and Google Sheets
Short answer: A simple ticketing system needs a request form, a ticket ID, an owner, a status, a due date and a record of what happened. Google Forms™ provides the request form, and its linked Google Sheets spreadsheet can hold the rest: formula columns for IDs and due dates, a dropdown for status, and filter views as queues. It suits internal, IT, maintenance and HR requests. It doesn't follow up on its own or hold email conversations with requesters, which is where a tracking tool or a help desk comes in.
Want the follow-up without building it? See where Form Watchdog fits.
On this page
What turns a request into a ticket
A ticket is a request with enough structure to be followed until it's closed. Here is one, as it will look once the sheet below is set up:
Printer on the 3rd floor keeps jamming
- Requested by
- sam@yourorg.com
- Type
- IT support
- Priority
- Normal
- Owner
- Alex
- Due
- Oct 28, 10:15
- Last note
- Replacement roller ordered
| Part | What it does | In Forms and Sheets |
|---|---|---|
| Intake | Collects the same details every time | Required questions in the form |
| Ticket ID | Lets everyone refer to the same request | A formula column |
| Owner | Makes one person accountable | An Owner column, typed or routed by answer |
| Status | Shows where the request stands | A dropdown column |
| Priority and due date | Says when the request becomes late | A form question and a formula |
| History | Records what happened, and who did it | A Notes column, comments and cell edit history |
| Follow-up | Brings late tickets back | A routine, a script or a tool |
| Requester updates | Keeps the requester informed | Emails you send yourself |
Design the request form
Ask for what the owner needs to start working, and nothing more. A typical request form has:
- The requester's email. In Settings › Responses, set Collect email addresses to Verified, which records the respondent's Google account and requires sign-in, or Responder input, which lets people type an address and suits requesters outside your organization.
- Request type, as a required dropdown. It drives routing (see how to send responses to different people) and reporting.
- Location or department, if the work depends on it.
- Priority, with short labels such as Urgent, Normal and Low. Explain them in the question's description (“Urgent: you can't work”) and keep the labels themselves short, so formulas can match them.
- Description, as a required paragraph question.
- Attachments, only if needed: file upload questions require respondents to sign in with a Google account, and the files are stored in the form owner's Google Drive.
Set up the ticket sheet
Link the form to a spreadsheet (Responses › Link to Sheets). Leave the form's columns as they are and add the ticket columns to their right. In this example, the form fills columns A to F (Timestamp, Email Address, Request type, Location, Priority, Description) and the ticket columns start at G. If your sheet already has tracking columns, for example from our first guide, keep them and change the letters in the formulas below to match.
- Ticket ID (column G). In G1, enter:
Each request gets a number such as REQ-0042. The number follows the row, so never sort or delete rows in the response tab: use filter views to change what you see.=ARRAYFORMULA(IF(ROW(A:A)=1,"Ticket ID",IF(A:A="","","REQ-"&TEXT(ROW(A:A)-1,"0000")))) - Owner (H). Type a name, or fill it from a routing table with the lookup formula in the routing guide, adjusting the column letters.
- Status (I), as a dropdown (Data › Data validation) with four values. A blank status counts as New.
- New: nobody has started on it.
- In progress: the owner is working on it.
- Waiting: blocked on the requester or someone else.
- Closed: done, with a line in Notes about the outcome.
- Due (J), set by priority. In J1:
Urgent requests are due 4 hours after they're submitted, Normal ones a day later and Low ones after 3 days, in calendar time. An empty or unexpected Priority value gets the Low delay. Format the column as Date time.=ARRAYFORMULA(IF(ROW(A:A)=1,"Due",IF(A:A="","",A:A+IF(E:E="Urgent",4/24,IF(E:E="Normal",1,3))))) - Notes (K), with a short dated line each time something happens: “Oct 28, Alex: ordered a part”.
- Highlight late tickets. Open Format › Conditional formatting, apply the rule to the range G2:K, choose Custom formula is and enter
=AND($I2<>"Closed", $J2<>"", $J2<NOW()). - Create queues with filter views (Data › Filter views › Create new filter view): “Open” (Status is not Closed), “Waiting”, one per owner and one per request type. Each person can switch views without changing what the others see.
Formulas like these depend on your regional settings: if Google Sheets rejects a comma, use a semicolon.
Add a small dashboard
A second tab can count what matters. These formulas use the response tab's default name, Form Responses 1:
| What it shows | Formula |
|---|---|
| Open tickets | =COUNTIFS('Form Responses 1'!G:G,"REQ-*",'Form Responses 1'!I:I,"<>Closed") |
| Open tickets for one owner | =COUNTIFS('Form Responses 1'!H:H,"Alex",'Form Responses 1'!I:I,"<>Closed") |
| Late tickets | =COUNTIFS('Form Responses 1'!I:I,"<>Closed",'Form Responses 1'!J:J,"<"&NOW()) |
| Waiting on someone | =COUNTIF('Form Responses 1'!I:I,"Waiting") |
Add a chart if you like. What matters is that anyone can see the backlog at a glance, without scrolling through rows.
Keep requesters informed
Google Forms doesn't tell requesters when a ticket changes. A few habits cover it:
- Send respondents a copy of their response, so they have a record of what they asked.
- Reply from the owner's own inbox, using the email address the form collected, and add a line to Notes.
- Don't share the spreadsheet with requesters: it holds everyone's requests.
If requesters expect to reply to a shared thread that stays attached to the ticket, that's a help desk feature, not something a spreadsheet does.
Examples by type of request
| Requests | Fields to add | Watch out for |
|---|---|---|
| IT support | Device or app, and “Can you still work?” | Never ask for passwords in the form |
| Maintenance and work orders | Location, equipment, access instructions | Photo uploads require respondents to sign in |
| HR requests | Request type, such as time off, documents or payroll | Use a separate form and spreadsheet with restricted access |
| Customer requests | Order or account number | Use Responder input for email if customers don't sign in with Google |
| Internal services | Cost center, needed-by date | Keep approvals separate from handling |
Where a spreadsheet stops
The sheet stores tickets well. What it lacks are the parts of a ticketing system that act or remember on their own:
- No conversation thread. Replies to requesters live in personal inboxes, so the exchange isn't on the ticket.
- No timeline per ticket. Cell edit history and notes show changes, but not a clear sequence of who did what on one request.
- A fragile structure. Sorting or deleting rows breaks the ticket IDs, and typing in a formula column breaks it for every row.
- Calendar-time deadlines. Formulas ignore working hours unless you build that logic yourself.
For the day-to-day management a sheet asks for as volume grows, see what the spreadsheet method asks of your team.
Choose the right level of tooling
| Level | What you get | What you take on | A good fit when |
|---|---|---|---|
| Forms and Sheets | Intake, IDs, owners, statuses and queues | Manual updates and regular checks | One team and a few request types |
| Sheets with Apps Script | Emails to owners, reminders, logs | Writing and maintaining code | Someone can own the script |
| Response follow-up tool, such as Form Watchdog | Owners, deadlines, reminders, overdue alerts and history on top of your form | A subscription, and fixed statuses instead of custom ones | You want follow-up without changing how people submit requests |
| Help desk software | Email conversations, shared queues, service levels and reporting, often with a portal | A new tool for your team and your requesters, usually paid per user | High volumes, or customers who expect replies by email |
Starting with the sheet is reasonable: you learn which request types and fields you really need, and you can move to a tool later without changing the form.
Where Form Watchdog fits
Form Watchdog is not a help desk: it doesn't host email conversations with requesters or give them a portal. It adds the follow-up layer to the form you already use, so each response is tracked like a ticket:
- An owner for each response, set for the whole form or by an answer such as Request type
- A response deadline for each form, with reminders until the response is handled
- A first and a second overdue alert, to the assignee, the workspace owner, chosen contacts, Slack or a webhook
- One inbox for all your forms, with unhandled, overdue and handled responses
- Internal notes, snoozed reminders and a history of each response
- An outcome when a response is marked handled, such as Resolved, Contacted or No action needed, with an optional closing note
- Analytics on handling time and deadline performance
It keeps three states (unhandled, overdue and handled) rather than custom statuses such as Waiting. Your form stays as it is, and you can keep its spreadsheet for reporting.
Track each request with an owner and a deadline, without building the sheet.
Frequently asked questions
Do I need Google Workspace for this?
Not for the spreadsheet method: it works with a personal Google account. A few extras need a work or school account, such as assigning a comment to a colleague.
One form, or one form per request type?
One form with a required Request type question is easier to route and to report on. Use separate forms when the questions differ a lot, or when different people should see the responses, as with HR requests.
Can requesters see the status of their ticket?
Not with Forms and Sheets alone. The status lives in your spreadsheet, and sharing it would show requesters everyone's requests, so tell them yourself when something changes (see keeping requesters informed). Form Watchdog doesn't add a requester portal either: its emails go to your team, not to the people who submit the form.
Form Watchdog is an independent product and is not affiliated with, sponsored or endorsed by Google LLC. Google Forms™ is a trademark of Google LLC.