Home How to How to Turn a Google Form into a…

How to Turn a Google Form into a Free Order System

This isn’t a WooCommerce guide. It’s for a different situation — a seller who doesn’t have a website, or who has a website but takes custom orders via WhatsApp and wants a better way to capture them, or who runs a food or service business where customers order by filling out a form. The system built in this guide: a Google Form customers fill in → responses log to a Sheet → the customer gets an automatic confirmation email → you get an alert that a new order arrived.

❌ Without a system
Customer sends a WhatsApp voice note with their order. You transcribe it somewhere. Another customer messages on Instagram. A third calls. Orders are scattered across three apps. You manually message each one to confirm. Something gets missed. A customer follows up three days later asking about their order.
✅ With the Google Form system
Customer clicks your form link (from your WhatsApp bio, Instagram, or catalog). They fill in name, phone, product, quantity, delivery details. They submit. They immediately receive a confirmation email. You get an alert. The order is already logged in your Sheet. You open Sheets once a day and process everything in one go.

Part 1: Build the Order Form

Go to forms.google.com → click the + (Blank form). Give it a title like “[Your Business Name] — Order Form.” Now add these fields:

FieldTypeRequired?Notes
Full NameShort answerRequiredWho placed the order
Email AddressShort answerRequiredEnable “Response validation → Text → Email address” so only valid emails are accepted. This is where the confirmation goes.
Phone Number / WhatsAppShort answerRequiredAdd a hint text: “Include country code if outside Ghana, e.g. +44…”
What would you like to order?Dropdown or CheckboxesRequiredList your products/services. Use Dropdown for single item; Checkboxes if they can order multiple. Keep options concise — this also serves as a light catalogue.
QuantityShort answerRequiredAdd response validation: Number → Greater than or equal to → 1
Delivery or Pickup?Multiple choiceRequiredOptions: “Delivery” / “Pickup”. Add a follow-up Section for delivery address (using Section logic: show address field only if “Delivery” is selected).
Delivery AddressParagraphOptional**Required in practice for Delivery — use Google Forms section branching to show this only when “Delivery” is chosen.
Special Instructions / NotesParagraphOptionalCustomisations, allergies, gift notes, preferred delivery time
The email field is the most important one. The entire automation below depends on capturing a valid email from the customer. Set up response validation (three dots menu on the field → Response validation → Text → Email address) so Google Forms rejects non-email inputs. This is the only field that can break the confirmation email step if filled incorrectly.

Enable email collection in Settings

In your form: Settings tab → Responses → uncheck “Limit to 1 response” (unless you genuinely want that). More importantly, make sure you are not requiring customers to sign in with a Google account — most customers won’t have one. Keep “Restrict to users in [domain]” turned off.


Part 2: Connect to Google Sheets

1
In your Form
Link the form to a new Google Sheet
In Google Forms, click the Responses tab at the top → click the green Sheets icon (Create Spreadsheet) → choose “Create a new spreadsheet” → name it “[Business] Orders” → click Create. Google automatically creates a sheet with a column for each form field plus a Timestamp column. Every future form submission adds a new row instantly.
✓ The linked Sheet is your order log. Every row is an order. Every column is a field from the form. You don’t need to do anything else for the logging to work — this is automatic.
2
In the Sheet
Add helper columns to the right of the form data
The Sheet currently has columns A through H (or however many fields you have) populated by the form. Add these columns manually to the right — they won’t be touched by form submissions:
  • Order Status — use Data → Data Validation → Dropdown (List of items): Pending, Confirmed, Preparing, Dispatched, Delivered, Cancelled. You’ll manually update this as each order moves through stages.
  • Payment Received? — Dropdown: No, Yes (MoMo), Yes (Card), Yes (Cash). Tick this off when payment is confirmed.
  • Order ID — put a formula here: =IF(A2<>"","ORD-"&TEXT(ROW()-1,"000"),"") — this auto-generates ORD-001, ORD-002 etc. for every row with a timestamp.
  • Notes — a free-text column for your own use (e.g. “called to confirm,” “item out of stock”)
✓ Freeze the top row (View → Freeze → 1 row) so the column headers stay visible as you scroll down through orders.

Part 3: The Confirmation Email (Apps Script)

This is the part most guides skip or leave vague. Here is the actual script, explained line by line, so you understand what it does and can adapt it.

1
Open Apps Script
Navigate to the script editor from your Sheet
In your linked Google Sheet: Extensions → Apps Script. A new tab opens with a code editor. Delete the default empty function myFunction() {} and paste the script below.
2
The Script
Paste this and update the three lines marked EDIT
Copy the script below exactly. The only lines you need to change are the three marked with // EDIT:
Apps Script — Order Confirmation + Owner Alert
// Runs automatically every time someone submits the form
function onFormSubmit(e) {

  // --- EDIT these three lines ---
  var OWNER_EMAIL = "yourname@gmail.com";        // EDIT: your email
  var BUSINESS_NAME = "Abena's Kitchen";          // EDIT: your business name
  var WHATSAPP_NUMBER = "+233241234567";           // EDIT: your WhatsApp number
  // --- End of lines to edit ---

  // Pull the form response values
  var responses = e.namedValues;
  var customerName    = responses["Full Name"][0];
  var customerEmail   = responses["Email Address"][0];
  var customerPhone   = responses["Phone Number / WhatsApp"][0];
  var orderItem       = responses["What would you like to order?"][0];
  var quantity        = responses["Quantity"][0];
  var deliveryChoice  = responses["Delivery or Pickup?"][0];
  var deliveryAddress = responses["Delivery Address"] ?
                         responses["Delivery Address"][0] : "N/A (Pickup)";
  var notes           = responses["Special Instructions / Notes"] ?
                         responses["Special Instructions / Notes"][0] : "None";
  var timestamp       = new Date().toLocaleString("en-GH");

  // --- Email to the CUSTOMER ---
  var customerSubject = "Your order from " + BUSINESS_NAME + " is confirmed ✓";
  var customerBody =
    "Hi " + customerName + ",\n\n" +
    "Thank you for your order! Here's a summary:\n\n" +
    "Item:     " + orderItem + "\n" +
    "Quantity: " + quantity + "\n" +
    "Delivery: " + deliveryChoice + "\n" +
    "Address:  " + deliveryAddress + "\n\n" +
    "We'll be in touch to confirm payment and delivery details.\n" +
    "WhatsApp us anytime: " + WHATSAPP_NUMBER + "\n\n" +
    "Thank you,\n" + BUSINESS_NAME;

  MailApp.sendEmail(customerEmail, customerSubject, customerBody);

  // --- Alert email to YOU (the owner) ---
  var ownerSubject = "🛒 New Order — " + customerName + " — " + orderItem;
  var ownerBody =
    "New order received at " + timestamp + ":\n\n" +
    "Customer:  " + customerName + "\n" +
    "Email:     " + customerEmail + "\n" +
    "Phone:     " + customerPhone + "\n" +
    "Item:      " + orderItem + "\n" +
    "Quantity:  " + quantity + "\n" +
    "Delivery:  " + deliveryChoice + "\n" +
    "Address:   " + deliveryAddress + "\n" +
    "Notes:     " + notes + "\n\n" +
    "Open your order sheet to update the status.";

  MailApp.sendEmail(OWNER_EMAIL, ownerSubject, ownerBody);
}
Field names in the script must match your form exactly. The script uses responses["Full Name"][0] to pull the value from the field named “Full Name” in your form. If your form field is named “Customer Name” instead, the script needs to say responses["Customer Name"][0]. Case-sensitive, character-for-character match.
3
Save the script
Click the floppy disk icon (or Ctrl+S) and name the project
Name it “Order System” or anything clear. The script is saved but not yet connected to the form — that’s the next step.
4
Set the trigger
Connect the script to your form’s submit event
In Apps Script: click the clock icon in the left sidebar (Triggers) → click “Add Trigger” (bottom right) → set these options:
  • Choose which function to run: onFormSubmit
  • Choose which deployment should run: Head
  • Select event source: From spreadsheet
  • Select event type: On form submit
Click Save. Google will ask you to authorise the script — click through the permission prompts, choosing your Google account. This allows the script to read form responses and send emails on your behalf.
⚠️ Google shows a “This app isn’t verified” warning during authorisation. This is normal for personal scripts — click “Advanced” → “Go to [project name] (unsafe)” → “Allow.” Your own script accessing your own data is safe.
5
Test it
Submit a test order using your own email address
Open your form’s live URL (the one you’d share with customers) and fill it in with test data — use your own email address in the Email field. Submit. Within 30 seconds, you should receive: (a) a confirmation email at that address, and (b) an owner alert at your OWNER_EMAIL address. Check both. If they don’t arrive, check your spam folder first, then re-examine the trigger setup and field names.
✓ Also check the Sheet — the test submission should have created a new row with all the form data.

Part 4: Add a Simple Stock Tracker

Once orders are logging to the Sheet, you can track how many of each item has been ordered with a formula — no additional setup required.

Create a second sheet tab in the same workbook (click + at the bottom left). Name it “Stock.” Set up two columns: Product and Units Ordered. List each of your products in column A. In column B, use COUNTIF to count how many times each product has been ordered from the form responses:

Count orders per product
=COUNTIF('Form Responses 1'!D:D, A2)
Replace D:D with the column in your Form Responses sheet that contains the product/order selection. Replace A2 with the product name in your Stock sheet. Copy this formula down for each product.
Total quantity ordered (if you track quantity separately)
=SUMIF('Form Responses 1'!D:D, A2, 'Form Responses 1'!E:E)
Adds up the Quantity column (column E here) for all rows where the product matches. Shows total units ordered, not just order count. Adjust column letters to match your actual sheet.
Orders today
=COUNTIF('Form Responses 1'!A:A, ">="&TODAY())
Counts form submissions from today (column A is the Timestamp column). A quick daily order count at a glance.
Unpaid orders (using your Payment Received? column)
=COUNTIF('Form Responses 1'!J:J, "No")
Replace J:J with whichever column you put “Payment Received?” in. Gives you a live count of orders awaiting payment — open this tab before processing the day’s orders.

Sharing the Form with Customers

In Google Forms, click Send (top right) → click the link icon → copy the link. This is your order form URL. Put it everywhere:

  • WhatsApp Business bio — the clickable website link in your profile
  • WhatsApp Quick Reply — a shortcut that sends the form link when someone asks “how do I order?”
  • Instagram bio — the single link slot, or via a link-in-bio page if you need multiple links
  • WhatsApp Catalog item links — add the form URL as the “Link” field on your catalog items, so customers can go directly from a catalog product to the order form
  • Your website — embed via Insert → Embed (Google Forms) → copy the iframe code → paste into your website’s HTML
Shorten the URL. Google Forms URLs are long and ugly. Use Bitly (free) to create a short link like bit.ly/abenas-orders that’s easier to share verbally and looks cleaner in a WhatsApp message.

Before vs After: A Full Order Scenario

❌ Before — a Tuesday without the system
9am: WhatsApp message from Ama — “I want 2 jollof rice packs for Friday, deliver to East Legon.” You screenshot and keep scrolling. 11am: Instagram DM from Kofi — same kind of order. 2pm: You can’t remember if Ama said 2 or 3 packs. You message back. No reply. Ama gets her order wrong. She’s unhappy.
✅ After — the same Tuesday
Ama fills in the form. Immediately receives “Your order from Abena’s Kitchen is confirmed ✓” with her order details. You receive an alert email: “🛒 New Order — Ama Owusu — Jollof Rice Pack.” You open Sheets once. Every order from the day is there, in rows. You process them in sequence. No missed orders. No misremembered quantities.

What This System Can’t Do (And the Upgrade Path)

⚠️ 100 emails/day limit
Gmail accounts can send 100 emails per day via Apps Script. At high order volume this becomes a constraint. Google Workspace accounts (paid) raise this to 1,500/day.
💳 No payment collection
The form captures the order but not the payment. You still need to manually send a payment link (Paystack/Flutterwave) or accept MoMo separately. The form is an order capture tool, not a checkout.
📱 No WhatsApp confirmation
The system sends email, not WhatsApp. Customers who rarely check email may not see the confirmation. The Make.com upgrade below adds WhatsApp.
🔢 No real inventory management
The COUNTIF formulas show cumulative orders, not live stock. You can’t prevent someone from ordering a sold-out item — you have to catch it manually when processing.

🔧 The Make.com Upgrade Path

When you outgrow the Apps Script email system, Make.com’s free tier connects Google Forms to everything else. Each of the limitations above has a direct Make.com solution:

No WhatsApp confirmationAdd a Make.com scenario triggered by new Sheet rows: send a WhatsApp message to the customer’s phone number from the form, using the same WhatsApp Business API pattern from the order confirmations guide.
No payment linkAdd a Make.com step that generates a Paystack or Flutterwave payment link for the specific order amount and sends it to the customer’s email or WhatsApp — connected to the Paystack guide’s webhook automation.
No stock decrementAdd a Make.com step that looks up the ordered product in a “Stock” sheet and reduces available quantity when an order is submitted — triggering an owner alert if stock reaches zero.
Email limitMake.com sends notifications via Gmail (which uses Google’s full sending quota) or Telegram — neither is constrained by the Apps Script 100/day limit.

Common Mistakes to Avoid

❌ Field names in the script don’t match the form
The script pulls values by looking for exact field names — responses["Full Name"][0] only works if your form field is literally named “Full Name.” If you named it “Customer’s Full Name” or “Name” the script silently returns nothing and the confirmation email sends with blank values.
→ Fix: After pasting the script, go through each responses["..."][0] line and confirm it matches the exact name of the corresponding field in your form. Copy-paste from the form to be sure.
❌ Running the trigger install multiple times
If you click “Add Trigger” multiple times without removing previous triggers, the script runs multiple times per submission — sending 2 or 3 confirmation emails per order. Customers notice and it looks broken.
→ Fix: In Apps Script → Triggers (clock icon), you should see only ONE trigger for onFormSubmit. If there are duplicates, delete the extras with the trash icon.
❌ Not validating the email field
Without response validation on the email field, a customer can enter “yes” or their phone number in the email field. The script runs, tries to send to an invalid email address, fails silently, and the customer receives nothing. They think something is wrong with your system.
→ Fix: Add response validation on the email field: three dots → Response validation → Text → Email address. This forces a valid email format before the form will submit.
❌ Sharing the edit URL instead of the live form URL
Google Forms has two URLs: the edit URL (ends in /edit, shows the form builder — only visible to editors) and the live form URL (what customers should see). Sharing the /edit URL either shows nothing to the customer or gives them access to edit your form.
→ Fix: Always share from the Send button (eye icon or link icon). The live URL ends in /viewform. Test it in an incognito window before sharing widely to confirm customers see the form correctly.
❌ No payment step after the order form
The form captures the order. It doesn’t collect payment. Without a clear next step for payment, customers may assume their order is fully complete and you’ll deliver without them paying — leading to awkward follow-up conversations.
→ Fix: In the form’s confirmation message (Settings → Presentation → Confirmation message) write: “Your order is received! We’ll send you a payment link via email within [X time]. Please complete payment to confirm your order.” Set expectations in the confirmation message itself.

Frequently Asked Questions

Do customers need a Google account to fill in the form?

No — and this is important to verify in your settings. Go to Google Forms Settings → Responses → make sure “Restrict to users in [your organization]” is turned off and “Require sign-in” is not enabled. With these off, anyone with the link can fill in the form without any Google account.

Can I collect payment through the form itself?

Google Forms doesn’t have a built-in payment collection step. The cleanest approach: in your form confirmation message, tell customers you’ll send a payment link shortly. Then manually send a Paystack or Flutterwave payment link to their email. The Make.com upgrade described above automates this — a new form submission triggers a Make.com scenario that generates and emails a payment link immediately, without any manual step from you.

What happens to the confirmation email if the customer’s email is wrong?

Apps Script’s MailApp will throw an error and the email won’t send, but the order still logs to the Sheet. You won’t be notified of the failed email automatically. Add response validation to the email field (as described in the mistakes section) to prevent invalid emails from being submitted in the first place — the vast majority of blank confirmation emails trace back to skipping this validation step.

Can I use this for a restaurant or food business with a daily changing menu?

Yes, with one adaptation: use the Dropdown field for menu items, and update the dropdown options each day to reflect what’s available. Google Forms lets you edit a live form without breaking the link — changes take effect immediately for anyone opening the form after you save. You can also add a “Today’s specials” description section at the top of the form that you update daily.

When should I move from this to WooCommerce or a proper e-commerce platform?

When payment collection needs to be part of the same flow (rather than a follow-up step), when you need customer accounts and order history, or when your product catalogue is large enough that a dropdown list stops being practical. The Google Form system is a genuine long-term solution for service businesses, food sellers, and custom order businesses — it’s not just a stepping stone. Migrate when a specific limitation becomes a real daily problem, not on a fixed timeline.


You Now Have a Working Order System

A Google Form that captures structured order data. A Sheet that logs every submission automatically. An Apps Script that sends a confirmation email to the customer and an alert to you the moment a form is submitted. A Stock tab with formulas that show cumulative orders per product. That’s a complete order capture system — built in under two hours, at zero cost, requiring no monthly subscription and no website.

More at OurInternetBusiness.com

Practical guides on automation, online business systems, and growing income from Ghana and across Africa. Visit OurInternetBusiness.com and bookmark it.