Google Forms Ticketing System: Build One Free (and Know When to Outgrow It)

You can run a support queue on Google Forms. Plenty of small teams, school IT desks and one-person agencies do. A form collects the request, a Sheet holds the list, and nobody pays a per-agent fee.

It works well up to a point, and the point is easy to recognise once you know what to look for. This guide builds the free version properly (ticket IDs, statuses, owners), shows exactly where it breaks, and then shows the upgrade that keeps your form as the front door while a real help desk does the work behind it.

The short answer

Setup Cost Good for Where it breaks
Google Form + response Sheet Free Up to about 20 requests a week, one or two people answering No reply thread, no way for two people to avoid answering the same ticket
Google Form + email into a help desk Free script, plus the help desk Teams that want the form as intake and a shared inbox for replies Needs a help desk that turns email into tickets
Help desk’s own contact form Included with the help desk Teams starting from zero You lose the form people already know and the Sheet you already report from

Part 1: The free ticketing system (Form + Sheet)

Build the intake form

Keep it short. Every extra field lowers the number of people who finish it. Five questions cover almost every support request:

  • Email. Turn on Settings > Responses > Collect email addresses so it is captured and validated for you.
  • Subject (short answer). One line. This becomes the ticket title.
  • Category (dropdown): Billing, Bug, Account access, How-to, Other.
  • What happened? (paragraph).
  • Priority (multiple choice): “I am blocked”, “It is annoying”, “No rush”. Plain words get more honest answers than High, Medium and Low.

In the Responses tab, click Link to Sheets. Every submission now lands as a new row.

Turn the Sheet into a queue

Add three columns to the right of the response columns: Status, Owner and Notes. Google Forms only writes to its own columns, so anything you add to the right is safe.

For Status, select the column, choose Data > Data validation, and add a dropdown with Open, In progress, Waiting on customer and Closed. Then add a filter view that hides Closed, and that view is your queue.

Add ticket IDs that survive new responses

This is the step most guides get wrong. If you type a formula into row 2 and drag it down, new form responses arrive as inserted rows and your formula does not follow them. Put one array formula in the header cell of an empty column instead:

={"Ticket ID"; ARRAYFORMULA(IF(A2:A="", "", "T-" & TEXT(ROW(A2:A)-1, "0000")))}

Column A is the timestamp, so every row with a response gets T-0001, T-0002 and so on, including the ones that arrive next week.

Get notified

In the form’s Responses tab, the three-dot menu has Get email notifications for new responses. That tells you something arrived. It does not tell you what, which is why Part 3 replaces it.

Part 2: Where the free version breaks

I would not move off the Sheet until at least one of these is costing you real time:

  • Replies live in someone’s personal inbox. You answer from your own Gmail, so the conversation is invisible to everyone else. When that person is on holiday, the history is too.
  • Two people answer the same ticket. A Sheet has no “Sam is replying to this right now” signal.
  • The follow-up has nowhere to go. The customer replies to your email, and that reply is not attached to row 47. You are now matching emails to rows by hand.
  • You cannot answer “how long do we take to respond?” The Sheet has the time the ticket opened and nothing else.

In my experience that happens somewhere around 20 requests a week or a second person joining support, whichever comes first.

Part 3: Keep the form, send every response to a help desk

Almost every help desk creates a ticket from an incoming email. So the upgrade is small: have the form email each response to your support address, formatted so the help desk treats the respondent as the customer.

The trick is the Reply-To header. Open the form in edit mode, click the three-dot menu, choose Apps Script, and paste this:

const SUPPORT_INBOX = '[email protected]';

function onFormSubmit(e) {
  const response = e.response;
  let email = response.getRespondentEmail();
  let subject = 'New support request';
  const lines = [];

  response.getItemResponses().forEach(function (item) {
    const title = item.getItem().getTitle();
    const answer = [].concat(item.getResponse()).join(', ');
    if (!email && /email/i.test(title)) email = answer;
    if (/subject/i.test(title)) subject = answer;
    lines.push(title + ': ' + answer);
  });

  const options = { name: 'Support form' };
  if (email) options.replyTo = email;

  MailApp.sendEmail(SUPPORT_INBOX, subject, lines.join('\n\n'), options);
}

Then click the clock icon (Triggers), choose Add Trigger, and set: function onFormSubmit, event source From form, event type On form submit. Save and approve the permission prompt. Submit a test response and check the support inbox.

What you get: an email whose subject is the ticket subject, whose body is every answer on its own line, and whose Reply-To is the person who filled in the form. When an agent hits Reply, it goes to the customer, not to the form owner.

Limits worth knowing before you rely on it

Limit Free Gmail account Google Workspace
Emails the script can send per day 100 1,500
Total trigger runtime per day 90 minutes 6 hours
Max runtime per execution 6 minutes 6 minutes

Those are Google’s published Apps Script quotas. One response uses one email and about a second of runtime, so a free account covers 100 tickets a day. Two more things: file-upload questions arrive as Google Drive file IDs rather than attachments, and if the trigger owner leaves the company the trigger stops, so create it from a shared account.

Which help desk to put behind it

Any tool that turns email into tickets will work with the script above. The real choice is how you want to pay.

Option Pricing model Cost for a 4-person team
Help Scout Free plan up to 5 users, then $25 per user per month (Standard) $0 on the free plan, $100/mo on Standard
Freshdesk $19 per agent per month on Growth, billed annually $76/mo
FreeScout (open source, self-hosted) Free software, unlimited agents and mailboxes. You pay for the server. The server, whatever the team size

Prices checked on the vendors’ pricing pages in October 2026. Per-seat pricing is fine at two people. It is the reason teams start sharing one login at six.

Why FreeScout fits this setup well

FreeScout is an open-source shared inbox in the Help Scout mould: conversations, assignment, internal notes and collision detection. It fetches your support mailbox over IMAP and turns each email into a conversation.

The detail that matters here: I read its fetch code, and FreeScout uses the Reply-To address as the customer when one is present, falling back to From only if it is missing. So with the script above, each form response shows up as a conversation from the person who submitted it. No plugin, no paid module, no API key.

The part nobody enjoys: hosting it

Self-hosting FreeScout the usual way means: provision a server, install PHP and MySQL, configure nginx, set up SSL, lock down the firewall, add the cron job and a queue worker, then point a domain at it and sort out DNS. It is an afternoon if it goes well, and you own the updates afterwards.

If you would rather skip all of that, InstaPods runs FreeScout as a one-click app: database, HTTPS and the background worker are already set up, and you get a real Linux server with SSH if you ever want to move it. It is $7/mo flat for 2 vCPU, 2 GB RAM and 25 GB of storage, the same price for 2 agents or 20, and adding a card gives you a $10 credit, which covers about the first six weeks. There is a side-by-side of the costs in FreeScout vs Freshdesk.

Once it is running, add your support address under Manage > Mailboxes, enter the IMAP and SMTP details, and the form responses from Part 3 start arriving as conversations.

Which setup should you pick?

  • Under 20 requests a week, one person answering: stay on the Form and Sheet from Part 1. It is free and it is enough.
  • A second person joins, or customers start replying to replies: add the script from Part 3 and put a help desk behind it.
  • You want other systems to react to a ticket too (a Slack ping, a CRM record): send the response to a URL instead of an inbox. The script for that is in our guide to Google Forms webhooks.

For more ways to cut the manual work around a form, see our guide to Google Forms automation.

FAQ

Can Google Forms be used as a ticketing system?

Yes, for low volume. A form linked to a Sheet with Status, Owner and Ticket ID columns is a working ticket tracker. It has no reply threads and no assignment locking, so it stops scaling at roughly 20 requests a week or two agents.

How do I generate a ticket number in Google Forms?

Google Forms cannot do it, but the linked Sheet can. Put one ARRAYFORMULA in a header cell that builds an ID from the row number. It applies to every future response automatically, which a dragged-down formula does not.

Can a Google Form create a ticket in a help desk?

Yes. Use an Apps Script form-submit trigger to email each response to your support address with Reply-To set to the respondent. Any help desk that creates tickets from email will open one, with the respondent as the customer.

Is there a free help desk I can use with Google Forms?

FreeScout is free and open source with no agent limit. You pay only for the server it runs on. Help Scout also has a free plan for up to 5 users.

Leave a Comment

Your email address will not be published.