Haeminway haemin/way
한국어
2 min read

Form auto-reply emails that annoy customers, and how to fix them

A form auto-reply email sent to the wrong kind of inquiry can cost customer trust. Pick the template by inquiry type and keep a review step before automated sends.

Route each inquiry through the right response gate

A new form is classified; pricing receives a scoped acknowledgement, while uncertain or legal requests go to human review, and each response is sent only after its appropriate gate.View full-size diagram
Visual guideChoose a response by category and send only after the matching gate. Uncertain or legal questions wait for a person; no cache or lock is shown as a delivery guarantee.

A customer uses your contact form to complain and gets back a cheerful “Thanks for your interest!” email. They trust the business less than before they wrote.

The answer: form auto-replies hurt trust when they go out without sorting the inquiry type or any human check. Choose the template by inquiry type, block duplicate sends with a lock (LockService), and keep a review gate for anything sensitive. For intake and reply automation built this way, see work automation.

How auto-replies erode trust

Bad Form Auto-Replies Damage Customer Trust operating model diagram

A generic thank-you message arriving within ten seconds signals automation. When the actual answer arrives late or mismatched, churn follows immediately.

Category-based template design

Add a category column to the response sheet. The onFormSubmit handler reads the value and selects the matching template.

categorytemplate keyhuman review
pricingprice_v2false
legalescalatetrue
bugbug_ackfalse

Guarded MailApp send skeleton

function sendAutoReply(e) {
  const lock = LockService.getScriptLock();
  if (!lock.tryLock(30000)) return;
  try {
    const cat = e.values[3];
    if (cat === 'escalate') return;
    const template = getTemplate(cat);
    MailApp.sendEmail({
      to: e.values[1],
      subject: template.subject,
      htmlBody: template.body,
      replyTo: '[email protected]'
    });
  } finally {
    lock.releaseLock();
  }
}

Rate limiting and deduplication

Store a submission key in CacheService for 24 hours to block duplicates. When the per-minute quota approaches 20 messages, queue remaining items in ScriptProperties and process via time-driven triggers.

Adding a human review gate

If category equals escalate or prior sends exceed three, skip the send and post to Slack instead.

Takeaway

Combining LockService and CacheService eliminates both concurrency collisions and duplicate deliveries.

Failure modes and exceptions

  • Sheets date coercion turns timestamps into strings and breaks dedupe keys.
  • Installed triggers stop firing; see installed-not-working.
  • service-invoked-too-many-times quota reached requires exponential backoff.

When not to use this approach

For more than 500 monthly inquiries or sub-one-hour SLAs, replace GAS automation with a dedicated mail service. See when-to-leave-gas.

Final review criteria

The useful question is not how many features the automation has. It is whether the workflow can be understood, recovered, and safely rerun after something goes wrong.

  • Raw input is separated from the human-facing working view.
  • Each run records success, failure, processed count, and error message.
  • Replaying the same input does not create duplicate results.
  • Permission changes, quota errors, and external API failures are visible later.

For low-risk internal tasks, that may be enough. For customer replies, booking confirmation, inventory updates, payments, or legal records, the threshold is higher: compare Apps Script against a dedicated SaaS or a small server-backed system before relying on it.

Frequently asked questions

Should every form submission get an automatic reply?
No. Send automatic replies only for inquiry types where a standard answer is correct, such as pricing or bug acknowledgments. Complaints, legal questions and anything sensitive should go to a person first.
How do I stop the same person from getting two auto-replies?
Wrap the send in LockService so two triggers cannot run it at once, and keep a submission key (for example in CacheService or a log sheet) so a repeated submission is skipped instead of answered again.
When is Google Apps Script the wrong tool for form auto-replies?
When inquiry volume is high, replies must go out under a tight response-time promise, or Apps Script mail quotas become a regular problem. A dedicated mail or helpdesk service is the safer choice then.