Table of Contents
- 1 The Business Situation
- 2 The Existing Process
- 3 What the New System Needed to Do
- 4 Implementation Approaches Considered
- 4.1 Enhanced Google Sheets
- 4.2 Airtable with n8n
- 4.3 Notion with n8n
- 4.4 HubSpot
- 4.5 Lightweight CRM Products
- 5 The Selected Solution
- 5.1 Existing tools retained
- 5.2 Manual work removed or reduced
- 6 System Architecture and Data Flow
- 7 Data Structure
- 7.1 Related Tables
- 8 Workflow Statuses and Ownership
- 9 Step-by-Step Implementation
- 9.1 Step 1: Prepare the Accounts and Permissions
- 9.2 Step 2: Build the Intake
- 9.3 Step 3: Create the System of Record
- 9.4 Step 4: Connect the Tools
- 9.5 Step 5: Build the Core Automation
- 9.6 Step 6: Add Approvals, Reminders, and Escalations
- 9.7 Step 7: Add Documents and File Management
- 9.8 Step 8: Add Reporting and Operational Views
- 9.9 Step 9: Add Security and Governance Controls
- 9.10 Step 10: Deploy and Test
- 10 Code and Configuration
- 10.1 Complete n8n Intake Normalization Code
- 10.2 Duplicate Search Configuration
- 10.3 Reminder Query Configuration
- 10.4 n8n Error Workflow
- 11 Failure Handling and Operational Reliability
- 12 A Complete Example
- 13 Implementation Cost
- 14 Estimated Time and Cost Savings
- 15 Adding AI to the Automation
- 15.1 The Recommended AI Enhancement
- 15.2 Benefits of the AI Enhancement
- 15.3 What Remains Rule-Based or Human-Controlled
- 15.4 Estimating the Additional Value of AI
- 16 Testing Checklist
- 17 Ongoing Maintenance
- 18 When to Move to Dedicated Software
- 19 Implementation Checklist
The Business Situation
This representative scenario concerns a 25-person professional services business selling operations advisory, managed services, and training engagements. The sales process involves the founder and managing director, a sales operations coordinator, three practice leads who own opportunities, and a finance manager who reviews nonstandard commercial terms.
Note: This case study is provided as a representative example of the types of AI integration and digital transformation solutions Intelligex designs and delivers. Actual engagements are tailored to each client’s goals, constraints, existing systems, timeline, and available resources, so the approach, tools, and outcomes may vary.
The business receives approximately 45 new inquiries or referrals each month and normally has between 55 and 70 open opportunities. Opportunities range from small training assignments to multi-month service engagements. Most initial inquiries arrive through referrals, direct email, telephone conversations, and existing client relationships.
The company already uses Google Workspace. Its sales records, however, are held in a Google Sheet maintained primarily by the founder. The spreadsheet contains company names, estimated values, and occasional notes, but stage names are inconsistent, next actions are frequently missing, and reminders exist mainly in the founder’s memory and inbox.
The founder prepares a weekly forecast by reading the spreadsheet, searching email threads, and asking practice leads for updates. Opportunity owners cannot reliably tell which records require action, and executive leadership cannot distinguish committed work from early-stage interest without additional discussion.
The business needs to change because inquiry volume is no longer low enough for one person to coordinate informally. The objective is not simply to create a cleaner spreadsheet. It is to establish a repeatable pipeline with defined ownership, measurable stages, required next actions, automated reminders, loss analysis, and a forecast that can be reviewed without reconstructing every opportunity from email.
The Existing Process
The original sales process followed this sequence:
- A prospect contacted the founder, a practice lead, or another employee.
- The recipient forwarded the inquiry to the founder or mentioned it during a meeting.
- The founder added a row to the sales spreadsheet when time allowed.
- The founder estimated the value and selected a stage, often using wording that differed from previous entries.
- Follow-up happened through individual Gmail accounts without a shared activity record.
- Practice leads reported progress verbally or by email.
- The founder updated some rows before the weekly leadership meeting.
- Won and lost opportunities were closed inconsistently, and loss reasons were rarely recorded.
- The founder manually grouped expected work into a weekly forecast.
| Current step | Operational problem | Business effect |
|---|---|---|
| Inquiry reception | Leads arrive through several people and inboxes. | Some inquiries are recorded late or not recorded at all. |
| Spreadsheet entry | One person creates and maintains most rows. | The pipeline depends on the founder’s availability. |
| Stage selection | Stage labels are entered as free text. | Filtering and conversion reporting are unreliable. |
| Ownership | Responsibility is implied rather than assigned. | Two people may follow up, or everyone may assume someone else has done it. |
| Next actions | Actions and dates are stored in notes or remembered. | Follow-ups are missed and aging opportunities remain open. |
| Email communication | Messages are held in personal Gmail threads. | Other team members cannot see whether contact occurred. |
| Proposal management | Proposal files are stored in personal or inconsistent folders. | Staff spend time locating the current version. |
| Forecast preparation | The founder reconciles the sheet with email and verbal updates. | Weekly reporting takes time and still contains uncertainty. |
| Closing records | Loss reasons and final values are optional. | Leadership cannot identify recurring causes of lost work. |
Duplicate data entry also occurred. A practice lead might maintain a personal list, the founder would copy part of it into the central spreadsheet, and proposal details would be entered again in a document. Each copy could contain a different value, close date, or status.
The spreadsheet did not provide a dependable audit history. Google Sheets version history could show that a cell changed, but it did not create a clear sales activity explaining who changed a stage, what communication occurred, or why an opportunity was lost.
Most importantly, the process could not be measured consistently. The business knew the approximate pipeline value, but it could not reliably calculate stage conversion, average time in stage, overdue actions, forecast categories, or loss reasons.
What the New System Needed to Do
The company defined the business rules before selecting technology. This prevented the project from becoming a direct copy of the inconsistent spreadsheet.
| Area | Requirement | Control |
|---|---|---|
| Intake | Provide one internal method for recording referrals, calls, and emailed inquiries. | Required fields and controlled choices in Google Forms. |
| Validation | Reject or flag missing contact details, invalid values, and unsupported service categories. | Form validation plus n8n validation. |
| Record creation | Create one opportunity record for each legitimate inquiry. | Submission key and potential-duplicate search. |
| Identification | Give every opportunity a stable identifier. | Airtable autonumber and formula-generated opportunity ID. |
| Ownership | Assign an accountable owner immediately. | Service-based routing with an existing-account override. |
| Workflow | Use one controlled set of sales stages. | Single-select stage field and transition rules. |
| Action management | Require an open opportunity to have a next action and date. | Data-quality views, reminders, and escalation rules. |
| Forecasting | Record value, probability, forecast category, and expected close date. | Calculated weighted value and weekly forecast views. |
| Communication | Send an acknowledgement and notify the assigned owner. | Gmail actions initiated by n8n. |
| Approvals | Keep discounts and nonstandard terms under human control. | Sequential finance and managing-director approval where required. |
| Documents | Store proposal material in a consistent location. | Restricted Google Drive folders linked to Airtable. |
| Reporting | Show new, overdue, incomplete, forecast, won, lost, and failed records. | Airtable views and interface pages. |
| Exceptions | Make failures visible instead of silently dropping data. | Automation status, error records, retries, and a manual-review queue. |
| Audit evidence | Record stage changes, messages, approvals, and automation executions. | Linked Activities and Automation Failures tables. |
| Manual override | Allow authorized staff to reassign or correct records. | Documented override fields and activity entries. |
The company also decided that routing, reminders, stage validation, and threshold checks should remain deterministic. These tasks use known values and business rules, so they do not require artificial intelligence.
Implementation Approaches Considered
| Approach | Connected tools | Effort | Recurring cost profile | Customization | Main limitation |
|---|---|---|---|---|---|
| Enhanced Google Sheets | Sheets, Forms, Apps Script or n8n, Gmail | Low to moderate | Low incremental cost when Workspace is already licensed | High, but script-dependent | Weak relational data, permissions, and workflow discipline as volume grows |
| Airtable with n8n | Forms, Sheets, Airtable, n8n, Gmail, Drive | Moderate | Database seats plus automation service | High for a small operational team | Requires governance to avoid uncontrolled fields and views |
| Notion database with n8n | Forms, Notion, n8n, Gmail | Moderate | Workspace seats plus automation service | Good for notes and linked documentation | Less suitable for strict pipeline controls and high-frequency operational reporting |
| HubSpot CRM | HubSpot, Gmail, forms, optional external automation | Moderate | Per-seat and feature-dependent CRM subscription | Strong standard CRM model | Advanced workflow and reporting needs may require higher product tiers |
| Lightweight dedicated CRM | A CRM such as Pipedrive, Capsule, or Zoho Bigin, plus email and automation | Moderate | Per-seat CRM subscription | Good for established sales workflows | Custom approval, operational data, and cross-department processes may be constrained |
Enhanced Google Sheets
The least disruptive option was to retain Google Sheets and add controlled dropdowns, protected ranges, formulas, Apps Script, and n8n. This would improve the current process quickly. It was not selected because multiple related activities, role-based views, attachments, and record-level workflow controls would remain difficult to maintain. The design would also continue to resemble a spreadsheet rather than an operational system.
Airtable with n8n
Airtable offered structured fields, linked records, controlled views, formulas, attachments, and interface pages while remaining understandable to staff familiar with spreadsheets. n8n could connect the Google Form response sheet, Airtable, Gmail, and Google Drive without placing workflow logic inside the base.
Notion with n8n
Notion was attractive for combining account notes, meeting records, and sales documentation. It was less suitable for this implementation because the priority was disciplined operational processing, date-driven queues, and forecast calculations. Notion could still remain the company’s general knowledge platform if already in use.
HubSpot
HubSpot would provide a more conventional CRM foundation and could be the right choice if the company needed marketing automation, email tracking, larger contact databases, or more extensive customer lifecycle management. For this scenario, it introduced more capability and subscription dependency than the six-person sales group needed immediately. Product packaging and workflow availability should always be confirmed against current vendor documentation.
Lightweight CRM Products
A lightweight CRM could reduce configuration work because pipelines, activities, and email features are already part of the product model. This option becomes more attractive when the business wants a prescriptive sales process rather than a flexible operational database. The company chose Airtable because it also wanted custom approval records, operational exceptions, migration flexibility, and reporting fields that could later support delivery handoff.
The Selected Solution
The selected design uses Google Forms for controlled intake, the linked Google Sheet as a staging source, Airtable as the system of record, n8n as the automation layer, Gmail for communication, and Google Drive for proposal documents. Airtable views and interface pages provide pipeline reporting.
| Tool | Responsibility | Reason selected |
|---|---|---|
| Google Forms | Internal inquiry and referral intake | Already familiar to employees and supports required fields and controlled choices |
| Google Sheets | Native response staging and processing reference | Google Forms writes responses to it automatically |
| Airtable | Opportunities, activities, routing, exceptions, approvals, and reporting | Provides structured records and linked tables without a custom application |
| n8n | Validation, duplicate checks, routing, synchronization, reminders, and error handling | Connects the selected systems and keeps logic visible in workflows |
| Gmail | Prospect acknowledgements, owner alerts, reminders, escalations, and forecast emails | Uses the company’s existing Google Workspace environment |
| Google Drive | Restricted proposal and commercial document folders | Retains familiar document collaboration and version history |
| Optional AI service | Inquiry summarization and categorization suggestions | Useful only after deterministic intake and routing work reliably |
Existing tools retained
- Google Workspace identities and access controls
- Google Forms for internal data capture
- Gmail for business communication
- Google Drive for proposal collaboration
- The old spreadsheet as a read-only migration archive
Manual work removed or reduced
- Copying form details into a pipeline
- Choosing an owner for routine service categories
- Sending standard acknowledgement messages
- Searching for missing next actions
- Preparing the basic weekly forecast totals
- Remembering routine reminders and escalations
Humans still qualify opportunities, conduct discovery, set realistic values, approve commercial exceptions, decide whether to submit proposals, and mark opportunities won or lost. The automation coordinates work but does not make final commercial decisions.
System Architecture and Data Flow
- Intake: Google Forms, with responses written to a protected Google Sheet.
- System of record: Airtable Opportunities, Activities, Team Routing, and Automation Failures tables.
- Automation layer: n8n workflows using Google OAuth credentials and an Airtable personal access token.
- Document storage: Restricted Google Drive opportunity folders.
- Notifications: Gmail from a dedicated sales inbox.
- Reporting: Airtable grid views, grouped views, and interface pages.
- AI layer: Optional structured inquiry analysis after normal validation.
-
Form submission: An employee records an inquiry in Google Forms. Required values include contact details, service interest, estimated value, close date, source, and inquiry summary. Google Forms validates obvious input errors before accepting the response.
-
Staging record: Google Forms writes the response to its linked Google Sheet. The row contains the form timestamp and collected submitter email. Additional protected columns hold processing status, Airtable record ID, processed timestamp, and error message.
-
Automation trigger: The n8n Google Sheets Trigger detects the new row. It receives the column values and, where exposed by the connector, the source row number. If the row reference is not exposed, the workflow performs a lookup using the timestamp and contact email.
-
Validation and transformation: An n8n Code node trims text, normalizes email and company names, parses currency and dates, creates a deterministic submission key, selects a routing owner, and calculates the initial priority. Invalid rows follow the manual-review branch.
-
Duplicate prevention: n8n searches Airtable for the submission key. An exact match means the same source event has already been processed. It then searches open opportunities with the same normalized contact email and company. A likely business duplicate is attached to the existing record as a new inquiry activity rather than silently creating another opportunity.
-
Opportunity creation: For a valid, nonduplicate submission, n8n creates the Airtable opportunity. Airtable returns its record identifier. Formula fields then generate the visible opportunity ID and weighted value.
-
Audit activity: n8n creates a linked Activity record containing the source, submission key, execution ID, summary, and creation result. The returned Gmail and Drive identifiers are added later as additional activities.
-
Source update: n8n writes the processing outcome, Airtable record ID, and processed timestamp back to the Google Sheet. If this update fails, the Airtable opportunity remains valid and the failure workflow records the reconciliation issue.
-
Communication: Gmail sends a deterministic acknowledgement to the contact when contact permission is confirmed. A separate message notifies the opportunity owner. Returned message identifiers are recorded where the connector provides them.
-
Ongoing management: Scheduled n8n workflows inspect Airtable for overdue actions, approval requests, missing documents, and weekly forecast records. They send reminders, create exception activities, and update automation fields.
-
Document setup: When an opportunity becomes Qualified, n8n finds or creates its Google Drive folder, records the returned folder ID and link, and notifies the owner if required documents remain missing.
-
Failure path: A persistent node failure invokes an n8n error workflow. The error is written to the Automation Failures table when Airtable is available, the sales operations coordinator is notified, and the original execution remains available for inspection and replay.
Data Structure
The Airtable base is named Sales Pipeline Operations. It contains four core tables: Opportunities, Activities, Team Routing, and Automation Failures. The optional AI fields are stored on Opportunities so that suggestions can be compared with the final human selections.
| Field | Type | Required | Source | Allowed values or validation | Purpose |
|---|---|---|---|---|---|
| Sequence | Autonumber | Yes | Airtable | System-generated | Supports a readable opportunity ID. |
| Opportunity ID | Formula | Yes | Airtable | OPP-year-sequence | Human-readable reference used in emails and file names. |
| Record ID | Formula | Yes | Airtable | RECORD_ID() |
Stable Airtable identifier for integrations. |
| Submission Key | Single-line text | Yes for form records | n8n | Deterministic FORM-prefixed value | Prevents duplicate processing of the same event. |
| Created Date | Created-time field | Yes | Airtable | System-generated | Records when the opportunity entered Airtable. |
| Last Updated | Last-modified-time field | Yes | Airtable | Tracks selected sales fields | Supports monitoring and change detection. |
| Requester | Yes | Google Forms | Verified employee email | Identifies who submitted the inquiry. | |
| Company Name | Single-line text | Yes | Google Forms | Trimmed, maximum length governed by form design | Prospect or client organization. |
| Company Key | Single-line text | Yes | n8n | Lowercase normalized company name | Supports potential-duplicate matching. |
| Contact Name | Single-line text | Yes | Google Forms | Nonblank | Primary prospect contact. |
| Contact Email | Yes | Google Forms | Valid email syntax | Used for acknowledgement and duplicate checks. | |
| Contact Phone | Phone or text | No | Google Forms | Normalized only for display | Alternative contact method. |
| Service Interest | Single select | Yes | Google Forms | Operations Advisory, Managed Services, Training & Enablement, Other / Unsure | Routes the opportunity and supports service reporting. |
| Region | Single select | Yes | Google Forms | Domestic, International, Remote / Unspecified | Supports delivery and reporting considerations. |
| Lead Source | Single select | Yes | Google Forms | Referral, Existing Client, Website, Email, Event, Partner, Other | Measures inquiry sources. |
| Inquiry Summary | Long text | Yes | Google Forms | Minimum meaningful description | Provides initial context. |
| Owner | Single select | Yes | n8n or authorized user | Three practice leads or sales coordinator | Defines accountability. |
| Owner Email | Yes | n8n or Team Routing table | Active company account | Used by notification workflows. | |
| Stage | Single select | Yes | n8n and owner | Controlled pipeline stages | Represents current sales progress. |
| Priority | Single select | Yes | n8n, then owner | Low, Normal, High | Supports queue ordering without making acceptance decisions. |
| Opportunity Value | Currency number | Yes | Submitter, then owner | Zero or positive, reviewed during qualification | Working expected revenue before tax. |
| Probability | Percent or number | Yes | Stage default, then authorized owner | 0 to 100 | Supports weighted pipeline calculations. |
| Weighted Value | Formula | Yes | Airtable | Value multiplied by probability | Provides a planning measure, not a revenue commitment. |
| Expected Close Date | Date | Yes for open opportunities | Form and owner | Valid date | Places the opportunity in a reporting period. |
| Next Action | Single-line text | Yes for open opportunities | n8n and owner | Specific action, not a general note | States what must happen next. |
| Next Action Date | Date | Yes for open opportunities | n8n and owner | Valid date | Drives reminders and overdue views. |
| Forecast Category | Single select | Yes | Stage default and owner | Pipeline, Best Case, Commit, Closed, Omitted | Separates early interest from expected work. |
| Loss Reason | Single select | Required when Lost | Owner | Price, Timing, No Decision, Competitor, Scope Mismatch, Budget, Relationship, Other | Supports loss analysis. |
| Loss Notes | Long text | Conditional | Owner | Required when Loss Reason is Other | Adds context without expanding the controlled list. |
| Field | Type | Updated by | Purpose |
|---|---|---|---|
| Source Timestamp | Text or date | n8n | Preserves the original Google Forms submission time. |
| Source Row Reference | Text | n8n | Links processing back to the response sheet row. |
| External System ID | Text | n8n | Stores an applicable source or downstream identifier. |
| Acknowledgement Sent At | Date and time | n8n | Confirms successful prospect communication. |
| Gmail Message ID | Text | n8n | Records the returned Gmail identifier when available. |
| Drive Folder ID | Text | n8n | Prevents duplicate folder creation. |
| Document Link | URL | n8n | Opens the restricted opportunity folder. |
| Approval Required | Checkbox | Formula or n8n | Indicates that commercial review is required. |
| Approval Status | Single select | Approvers and n8n | Not Required, Draft, Requested, Finance Approved, Final Approved, Rejected, More Information. |
| Requested Discount | Percent | Owner | Applies approval thresholds. |
| Nonstandard Terms | Checkbox | Owner | Routes terms to finance review. |
| Approval Requested At | Date and time | n8n | Starts approval reminder timing. |
| Approval Decision At | Date and time | n8n | Records completion evidence. |
| Automation Status | Single select | n8n | Ready, Processing, Complete, Needs Review, Communication Failed, Document Failed. |
| Last Automation Run | Date and time | n8n | Supports monitoring and reconciliation. |
| Retry Count | Integer | n8n | Shows how many recovery attempts have occurred. |
| Exception Type | Single select | n8n or coordinator | Missing Data, Potential Duplicate, Invalid Value, Integration Failure, Approval Block, Other. |
| Error Message | Long text | n8n | Stores a safe operational error without credentials or sensitive payloads. |
| Last Reminder At | Date and time | n8n | Prevents repeated reminders on the same day. |
| Escalation Level | Integer | n8n | Records the current reminder escalation level. |
| Notes | Long text | Authorized users | Stores concise information not represented by another field. |
Related Tables
- Activities
- Contains one record for each submission, owner notification, prospect message, stage change, approval decision, reminder, material meeting, and closure event. Each Activity links to one Opportunity, while one Opportunity can have many Activities.
- Team Routing
- Contains owner label, service category, employee email, backup owner, active status, and escalation role. This table allows ownership changes without rewriting every workflow, although the initial code example also shows a simple configuration-based routing option.
- Automation Failures
- Contains failure ID, workflow name, n8n execution ID, opportunity ID, submission key, occurred time, safe error summary, retry count, status, recovery owner, and resolution notes.
Airtable does not provide a general database uniqueness constraint for the Submission Key field. Uniqueness is therefore enforced by searching before creation, recording the key, retaining n8n executions, and reconciling duplicate keys through a dedicated view.
Workflow Statuses and Ownership
| Status | Meaning | Owner | Entry condition | Exit condition | Reminder and escalation rule |
|---|---|---|---|---|---|
| New | Inquiry has been recorded but not reviewed. | Routed practice lead or sales coordinator | Valid form record or approved manual import | Contact attempt recorded or record marked duplicate | Reminder next business day; coordinator escalation after two business days overdue |
| Contacting | Initial contact is in progress. | Opportunity owner | Owner starts outreach | Discovery scheduled, nurture selected, or opportunity lost | Next action required; escalation after two and five business days |
| Discovery Scheduled | A discovery meeting has a confirmed date. | Opportunity owner | Meeting arranged | Discovery completed or meeting cancelled | Reminder before meeting and when no post-meeting action is recorded |
| Qualified | Need, fit, timing, and working value have been reviewed. | Practice lead | Human qualification complete | Proposal sent, nurture selected, or opportunity lost | Missing close date, next action, or Drive folder appears in an exception view |
| Proposal Sent | A proposal has been issued. | Practice lead | Required approval completed and proposal activity recorded | Negotiation, verbal commit, won, or lost | Follow-up date required; overdue reminders begin on the next action date |
| Negotiation | Scope, price, or terms are being discussed. | Practice lead | Prospect has responded to the proposal | Verbal commit, revised proposal, won, or lost | High-priority reminder after one overdue business day |
| Verbal Commit | The prospect has indicated intent, but final evidence is incomplete. | Practice lead | Human records the commitment and evidence | Won, negotiation, or lost | Sales coordinator alerted if no next action or close date passes |
| Nurture | Potential fit exists, but active pursuit is deferred. | Sales coordinator | Owner sets a future review date and reason | Returned to Contacting or closed Lost | Monthly or quarterly reminder based on review date |
| Won | Commercial acceptance has been received. | Practice lead, then delivery handoff owner | Signed agreement, purchase order, or approved acceptance evidence | Closed | No sales reminder; handoff checklist must be completed |
| Lost | The opportunity will not proceed in the current cycle. | Opportunity owner | Loss reason and close date recorded | Closed, or reopened with documented reason | No reminders; missing loss reason appears in data-quality view |
An owner can move a record backward when new information changes the situation. For example, Verbal Commit can return to Negotiation. A record marked Proposal Sent without the required approval is returned to Qualified by the validation workflow and receives an Approval Block exception.
Potential duplicates, unsupported values, missing required fields, and conflicting ownership are sent to manual review. A rejected commercial exception does not automatically mark the opportunity Lost. The owner decides whether to revise the proposal, seek further information, or close the opportunity.
Step-by-Step Implementation
Step 1: Prepare the Accounts and Permissions
-
Create a production Airtable base and a separate test base. Limit production base access to the three practice leads, sales operations coordinator, finance manager, and managing director. Broader employees use the intake form rather than editing the pipeline.
-
Create a dedicated Google Workspace sales inbox such as
sales@YOUR_DOMAIN. It should be a managed user mailbox that n8n can authenticate through OAuth. Give appropriate staff delegated access if the business requires shared human use. Do not connect an employee’s personal mailbox as the permanent automation identity. -
Create a restricted Google Drive parent folder named
Sales Opportunities. Grant access to the sales group and finance manager. Disable public link sharing. The n8n Google credential must be able to create folders within this parent. -
Create an n8n project for the sales workflows. Assign one automation administrator and one backup owner. Whether n8n Cloud or a managed self-hosted deployment is used, require encrypted credential storage, backups, and access logging.
-
Create an Airtable personal access token from a controlled integration identity. Scope it only to the production base and the record read/write permissions needed by the workflows. Schema read permission is needed only if the selected n8n operation requires it. Store the token in n8n credentials, never in a Code node.
-
Create Google OAuth credentials in n8n for Google Sheets, Gmail, and Google Drive. Authorize only the required accounts and scopes. Test token refresh before deployment.
-
Create two test users: one opportunity owner and one approver. Use reserved example addresses or controlled internal accounts. Do not use real prospect information during development.
-
Record the following configuration values in the deployment documentation:
YOUR_SPREADSHEET_IDYOUR_RESPONSE_SHEET_NAMEYOUR_AIRTABLE_BASE_IDYOUR_AIRTABLE_PIPELINE_URLYOUR_DRIVE_PARENT_FOLDER_IDYOUR_SALES_INBOXYOUR_SALES_OPERATIONS_EMAILYOUR_MANAGING_DIRECTOR_EMAIL
| Role | Form | Airtable | Drive | n8n |
|---|---|---|---|---|
| General employee | Submit | No production base access | No pipeline folder access | No access |
| Practice lead | Submit | Edit assigned sales records | Sales folder access | No credential access |
| Sales operations coordinator | Submit and administer | Operational administration | Sales folder access | Monitor runs and perform approved retries |
| Finance manager | Submit | Approval and relevant commercial fields | Commercial documents | No credential access |
| Automation administrator | Administer | Integration access | Integration access | Workflow and credential administration |
If the selected Airtable edition does not provide the desired interface-only or field-level restrictions, reduce the number of base editors and place sensitive approval details in a separate restricted table. Required licensing features should be confirmed with current vendor documentation before purchase.
Step 2: Build the Intake
Create a Google Form named New Sales Opportunity Intake. Restrict it to authenticated employees in the Google Workspace domain and collect the submitter’s verified email address. Allow multiple responses because employees will enter more than one opportunity.
| Field | Form type | Required | Validation or choices |
|---|---|---|---|
| Company name | Short answer | Yes | Nonblank; instruct users to enter the trading name once |
| Contact name | Short answer | Yes | Nonblank |
| Contact email | Short answer | Yes | Email address validation |
| Contact phone | Short answer | No | Include country code when applicable |
| Service interest | Dropdown | Yes | Operations Advisory, Managed Services, Training & Enablement, Other / Unsure |
| Region | Dropdown | Yes | Domestic, International, Remote / Unspecified |
| Existing client? | Multiple choice | Yes | Yes, No, Unsure |
| Existing account owner | Dropdown in conditional section | Conditional | Practice lead roles and Unknown |
| Estimated opportunity value | Short answer | Yes | Number greater than or equal to zero; currency stated in field description |
| Estimated decision date | Date | Yes | Best current estimate; owner must review it after discovery |
| Lead source | Dropdown | Yes | Referral, Existing Client, Website, Email, Event, Partner, Other |
| Inquiry summary | Paragraph | Yes | Ask for business need, requested outcome, timing, and relevant context |
| Contact permission confirmed? | Multiple choice | Yes | Yes, the contact expects follow-up; No or unsure |
Use section branching so that Existing account owner appears only when Existing client is Yes. If the employee selects No or unsure for contact permission, the opportunity is still recorded but no automated external email is sent.
The confirmation message should state that the inquiry has been submitted to sales operations and that urgent matters should also be raised through the normal internal escalation channel. It should not display prospect data in the confirmation page.
Do not request financial account information, identity documents, confidential client files, or special-category personal data through this form. Attachments are intentionally excluded. Proposal documents are added only after qualification to the restricted Drive folder.
Google Forms does not provide database-grade duplicate prevention. n8n handles exact event duplication and likely business duplicates after submission. Restricting the form to authenticated employees reduces spam and creates a known requester identity.
Link the form to a new Google Sheet. Name the response tab Form Responses 1 or record the actual generated name in configuration. Add these protected columns at the far right:
- Automation Status
- Airtable Record ID
- Processed At
- Error Message
Do not sort, delete, or manually rewrite the response rows. Create separate reporting tabs if staff need to inspect form submissions.
Step 3: Create the System of Record
Create the four Airtable tables described in the Data Structure section. Use field names exactly as documented so that n8n mappings remain readable.
Configure the Opportunity ID formula as follows:
"OPP-" & DATETIME_FORMAT(CREATED_TIME(), "YYYY") & "-" & RIGHT("00000" & {Sequence}, 5)
Configure the Record ID formula:
RECORD_ID()
Configure Weighted Value:
ROUND({Opportunity Value} * {Probability} / 100, 2)
Create a Next Action Health formula:
IF(
OR({Stage} = "Won", {Stage} = "Lost"),
"Closed",
IF(
NOT({Next Action Date}),
"Missing",
IF(
IS_BEFORE({Next Action Date}, TODAY()),
"Overdue",
IF(IS_SAME({Next Action Date}, TODAY(), "day"), "Due today", "Future")
)
)
)
Create an Age in Days formula:
DATETIME_DIFF(TODAY(), {Created Date}, "days")
Create a Processing Minutes formula where both timestamps exist:
IF(
AND({Acknowledgement Sent At}, {Created Date}),
DATETIME_DIFF({Acknowledgement Sent At}, {Created Date}, "minutes")
)
Set default stage probabilities as documented business assumptions:
- New: 10 percent
- Contacting: 15 percent
- Discovery Scheduled: 25 percent
- Qualified: 45 percent
- Proposal Sent: 65 percent
- Negotiation: 80 percent
- Verbal Commit: 90 percent
- Won: 100 percent
- Lost: 0 percent
- Nurture: 5 percent
These percentages are planning assumptions. They should be recalibrated after the company has sufficient stage-conversion history.
Create the following initial views:
- New and Unassigned
- My Open Opportunities
- Actions Due Today
- Overdue Actions
- Missing Next Action
- Closing This Month
- Closing This Quarter
- Commit Forecast
- Approval Queue
- Potential Duplicates
- Lost Without Reason
- Automation Failures
- Recently Won
Import the existing open pipeline only after standardizing company names, assigning owners, mapping legacy stages, and requiring a next action and expected close date. Import recent won and lost history separately if it is reliable enough to support analysis. Add Legacy Spreadsheet as the source and create an import activity for every migrated record.
Make the original founder spreadsheet read-only after migration acceptance. Retain it according to the company’s records policy instead of allowing parallel editing.
Step 4: Connect the Tools
| Source | Destination | Trigger or action | Authentication | Returned identifier | Failure response |
|---|---|---|---|---|---|
| Google Forms | Google Sheets | Native form response write | Google Workspace | Timestamp and response row | Forms retains the response; administrator inspects form and sheet permissions |
| Google Sheets | n8n | New row polling trigger | Google OAuth | Row reference when available | Next polling cycle retries detection; source remains unprocessed |
| n8n | Airtable | Search, create, and update records | Scoped personal access token | Airtable record ID | Retry transient failure, then log and route to manual review |
| n8n | Gmail | Send acknowledgement and internal messages | Google OAuth | Gmail message ID when returned | Mark Communication Failed and queue retry |
| n8n | Google Drive | Search for or create opportunity folder | Google OAuth | Drive folder ID and link | Mark Document Failed without deleting the opportunity |
| n8n | Google Sheets | Update source processing columns | Google OAuth | Updated row | Create reconciliation failure while retaining Airtable record |
In n8n, create credentials through the credential manager rather than placing tokens in expressions. Test each credential with a read operation before allowing writes.
Configure the Google Sheets Trigger for the linked response sheet and the row-added event. The connector uses polling, so the exact polling interval depends on the deployment and required response time. A five-minute interval is adequate for this scenario.
The source-to-destination field mapping is:
| Google Forms or normalized value | Airtable field | Transformation |
|---|---|---|
| Timestamp | Source Timestamp | Retain raw source value and use Airtable Created Date for system timing |
| Collected email address | Requester | Lowercase and trim |
| Company name | Company Name | Trim repeated whitespace |
| Derived normalized company | Company Key | Lowercase, remove accents and punctuation |
| Contact email | Contact Email | Lowercase and validate |
| Estimated opportunity value | Opportunity Value | Remove currency symbols and separators, then parse as number |
| Estimated decision date | Expected Close Date | Convert to ISO date |
| Service interest | Service Interest | Validate against controlled choices |
| Routing result | Owner and Owner Email | Use service category or confirmed existing account owner |
| Generated initial action | Next Action | Set to Review inquiry and contact prospect |
| Calculated next business day | Next Action Date | Skip Saturday and Sunday |
The Airtable Create action returns the record ID. Store that value in the source Google Sheet and use it when creating the linked Activity. The Gmail action returns a message identifier when exposed by the connector, and the Drive action returns the folder identifier. Store both rather than relying only on human-readable names.
Step 5: Build the Core Automation
Automation A: Intake to Pipeline
- Trigger: Google Sheets row added to the linked Google Forms response tab.
- Conditions: The source row has not already been marked Complete or Duplicate Ignored.
- Actions: Normalize, validate, generate submission key, search for duplicates, create or update Airtable, create Activity, update source row, send messages.
- Fields updated: Opportunity fields, Automation Status, Last Automation Run, source processing fields, message identifiers.
- Notification: Prospect acknowledgement and owner assignment email.
- Exception: Missing data, likely duplicate, Airtable failure, or communication failure enters the relevant branch.
Build the workflow in this exact processing order:
- Google Sheets Trigger: Watch for rows added to the response sheet.
- Edit Fields: Add workflow name, source spreadsheet ID, and execution ID. Retain the original form fields.
- Code, Normalize Intake: Run the complete JavaScript provided in the Code and Configuration section.
- If, Validation: Continue to normal processing only when
validationValidis true. - Invalid branch: Create a Needs Review opportunity when enough identity information exists, or create an Automation Failure when it does not. Update the source row and notify sales operations. Do not send an external acknowledgement.
- Airtable search, Exact Event: Find a record whose Submission Key equals the generated key.
- If, Exact Duplicate: If found, update the source row to Duplicate Ignored, record the existing Airtable record ID, and stop. Do not resend email.
- Airtable search, Potential Business Duplicate: Search open records using normalized contact email, then compare Company Key in n8n.
- If, Potential Duplicate: Add an Activity to the existing opportunity, set Exception Type to Potential Duplicate, update the source row with the existing record ID, and notify the owner. Do not create a second opportunity automatically.
- Airtable create, Opportunity: Map the validated values. Set Stage to New, Probability to 10, Forecast Category to Pipeline, and Automation Status to Processing.
- Capture identifier: Save the returned Airtable record ID while continuing to reference the normalized data from the named Code node.
- Airtable create, Activity: Create a Form Submission activity linked to the new opportunity.
- Google Sheets update: Set Automation Status to Airtable Created, store the Airtable record ID, and set Processed At.
- Gmail send, Prospect: Send the approved acknowledgement only when contact permission is confirmed.
- Airtable update, Communication: Store Acknowledgement Sent At and Gmail Message ID.
- Gmail send, Owner: Send owner, value, service, next action, due date, and pipeline link.
- Airtable update, Complete: Set Automation Status to Complete, clear Error Message, and update Last Automation Run.
Use named-node expressions such as {{$('Normalize Intake').item.json.contactEmail}} so later node output does not overwrite access to the normalized source values.
Automation B: Stage and Data-Quality Validation
- Trigger: Schedule every 15 minutes and query records modified since the previous successful run.
- Conditions: Open record has missing owner, value, close date, next action, or next action date; or stage conflicts with approval requirements.
- Actions: Set Automation Status to Needs Review, assign Exception Type, create an Activity, and return invalid Proposal Sent records to Qualified.
- Fields updated: Automation Status, Exception Type, Error Message, Stage when transition is invalid.
- Notification: Owner receives one data-quality message per processing cycle.
- Exception: Authorized sales operations staff can document and apply a manual override.
Store the last successful run timestamp in n8n workflow static data or a small control record. Include a short overlap, such as five minutes, and rely on the activity key to prevent duplicate validation activities.
Automation C: Duplicate Reconciliation
- Trigger: Nightly schedule.
- Conditions: Two or more Opportunities have the same Submission Key, or the same Company Key and Contact Email while both are open.
- Actions: Mark records for manual review and notify the sales operations coordinator.
- Fields updated: Exception Type and Automation Status.
- Notification: One digest containing affected opportunity IDs.
- Exception: Records are never merged or deleted automatically.
Automatic deletion is avoided because two simultaneous engagements with the same company and contact can be legitimate. An authorized user chooses the surviving record, moves relevant activities, marks the duplicate, and records the reason.
Step 6: Add Approvals, Reminders, and Escalations
Commercial Approval Rules
- A discount above 10 percent requires finance approval.
- Any nonstandard payment or liability term requires finance approval.
- A discount above 15 percent requires finance approval followed by managing-director approval.
- An opportunity value of at least $50,000 with nonstandard terms requires sequential finance and managing-director approval.
- An approved standard proposal with no threshold exception has Approval Status set to Not Required.
The owner enters Requested Discount and Nonstandard Terms before changing Approval Status to Requested. A scheduled n8n workflow finds newly requested approvals whose notification timestamp is blank.
- Trigger: Five-minute schedule querying Approval Status Requested and blank Approval Requested At.
- Conditions: Discount or terms meet an approval rule.
- Actions: Stamp Approval Requested At, create an Approval Requested Activity, and email the finance manager.
- Fields updated: Approval Required, Approval Status, Approval Requested At, Last Automation Run.
- Notification: Finance receives opportunity ID, value, discount, terms summary, owner, and Airtable pipeline link.
- Exception: Missing commercial information changes status to More Information and notifies the owner.
The finance manager records Approve, Reject, or More Information in Airtable and adds decision notes. For sequential approval, n8n changes the status to Finance Approved and notifies the managing director. The final approver records Final Approved or Rejected.
Approval reminders are sent after one business day. After two business days, the sales operations coordinator is copied. If an approver is unavailable, the documented backup approver in Team Routing receives the request. Delegation must be time-limited and approved.
Approval evidence includes the approver identity, decision, timestamp, notes, threshold values, and linked Activity. Email alone is not treated as the authoritative approval record.
Next-Action Reminders
- Trigger: Weekday Schedule Trigger at 8:00 a.m. in the company’s business timezone.
- Conditions: Stage is open and Next Action Date is today or overdue.
- Actions: Group opportunities by owner, calculate business days overdue, and send one digest per owner.
- Fields updated: Last Reminder At and Escalation Level.
- Notification: Owner digest includes ID, company, stage, value, next action, and due date.
- Exception: Missing or inactive owner routes to the sales operations coordinator.
The escalation sequence is:
- Due today or one business day overdue: owner reminder.
- Two business days overdue: owner reminder copied to the sales operations coordinator.
- Five business days overdue: sales operations coordinator is asked to reassign or resolve. The managing director is included only for high-value or Commit records.
- Ten business days overdue: record is removed from Commit, set to Needs Review, and requires a documented owner decision.
When an owner is on leave, the coordinator updates Team Routing with the temporary backup and effective dates. The reminder workflow uses the backup address during that period.
Step 7: Add Documents and File Management
Create a scheduled n8n workflow that searches for Qualified or later opportunities with a blank Drive Folder ID.
- Trigger: Schedule every 15 minutes.
- Conditions: Stage is Qualified, Proposal Sent, Negotiation, Verbal Commit, or Won, and Drive Folder ID is blank.
- Actions: Sanitize the folder name, search the configured parent folder, reuse an exact match or create a folder, and update Airtable.
- Fields updated: Drive Folder ID, Document Link, Automation Status, Last Automation Run.
- Notification: Owner receives the folder link when it is first created.
- Exception: Failed search or creation sets Document Failed and enters the failure queue.
Use this folder naming convention:
OPP-2026-00184_Company-Name
Remove characters that are unsuitable for file names and limit the company-name portion to a practical length. Use the stable Opportunity ID as the primary match key.
Recommended files use names such as:
OPP-2026-00184_Discovery-Notes_2026-07-15
OPP-2026-00184_Proposal_v01_2026-07-18
OPP-2026-00184_Pricing-Approval_2026-07-18
OPP-2026-00184_Acceptance-Evidence_2026-07-25
Google Drive version history should be used for collaborative Google files. If a proposal is exported to PDF, create a new numbered version rather than overwriting the issued copy. Do not enable unrestricted shared links.
If folder creation succeeds but the Airtable update fails, the next run first searches for the exact Opportunity ID under the parent folder. It reuses the existing folder instead of creating another one.
Missing proposal files appear in a view when Stage is Proposal Sent but Document Link is blank. Large files should follow Google Workspace storage policies and should not be copied into Airtable attachments unless there is a defined reason.
Step 8: Add Reporting and Operational Views
| View | Filter | Primary owner | Operational use |
|---|---|---|---|
| New Records | Stage New | Sales operations | Confirm every inquiry has an owner and action. |
| Awaiting Action | Open stage and action due today | Opportunity owners | Daily work queue. |
| Overdue | Next Action Health Overdue | Sales operations | Follow-up and escalation. |
| Incomplete | Missing owner, value, close date, action, or action date | Sales operations | Data-quality correction. |
| Manual Review | Automation Status Needs Review | Sales operations | Resolve duplicates and validation issues. |
| Approval Queue | Approval Status Requested, Finance Approved, or More Information | Finance and managing director | Commercial decision queue. |
| Closing This Month | Open and close date in current month | Practice leads | Near-term forecast review. |
| Commit Forecast | Forecast Category Commit | Executive leadership | Review expected work and evidence. |
| Recently Completed | Won or Lost in previous 30 days | Leadership | Outcome review. |
| Lost Analysis | Stage Lost, grouped by reason and service | Leadership | Identify recurring loss patterns. |
| Automation Failures | Automation Status not Complete or unresolved failure | Automation administrator | Operational recovery. |
Create an Airtable interface with pages for:
- Pipeline by stage and owner
- Open value and weighted value by expected close month
- Commit and Best Case records
- Overdue actions by owner
- New opportunities by source
- Won and lost value by service
- Loss reasons
- Automation health
The interface reads live Airtable data. A separate n8n forecast workflow runs each Monday morning, retrieves all open opportunities expected to close in the current quarter, groups values by owner and forecast category, and emails the summary to leadership.
Dashboard ownership belongs to the sales operations coordinator. The coordinator verifies the weekly totals against the underlying filtered records before the leadership meeting. Weighted value is a planning metric rather than a guarantee.
Step 9: Add Security and Governance Controls
- Apply least-privilege access to Airtable, n8n, Gmail, and Drive.
- Use a dedicated integration identity rather than a departing employee’s credentials.
- Restrict Google Forms to authenticated employees.
- Do not expose the Airtable base through public shared-view links.
- Store tokens and OAuth credentials only in the n8n credential manager.
- Limit Airtable token access to the required base and record operations.
- Restrict finance notes and approval fields to appropriate users or a separate table.
- Remove former employees from Google Workspace groups, Airtable, Drive, and n8n promptly.
- Retain n8n execution logs long enough to investigate failures without storing unnecessary personal data indefinitely.
- Export or back up critical Airtable data according to the company’s recovery policy.
- Review Drive shared links and inherited permissions regularly.
- Document the lawful basis and privacy notice applicable to prospect data in the company’s jurisdiction.
- Do not send sensitive or regulated data to an AI service without contractual, privacy, and security approval.
- Keep qualification, pricing, approval, acceptance, and loss decisions under human control.
Activity records should contain useful audit evidence but should not copy complete email bodies unless there is a documented requirement. A subject, timestamp, sender, recipient, message ID, and concise outcome are usually sufficient for pipeline operations.
Step 10: Deploy and Test
- Build the form, test sheet, Airtable test base, and inactive n8n workflows.
- Create at least 20 sample records covering every service, owner, stage, and exception branch.
- Run the intake workflow manually and inspect each node’s input and output.
- Complete the full testing checklist later in this article.
- Ask the sales operations coordinator, one practice lead, finance manager, and managing director to complete user acceptance testing.
- Migrate a small set of open opportunities into the test base and validate stage mappings.
- Run a two-week pilot with the coordinator and one practice lead.
- Reconcile every form response against Airtable during the pilot.
- Correct workflow rules, forms, views, and documentation before broader activation.
- Migrate the remaining approved open opportunities.
- Activate workflows in this order: intake, failure handling, reminders, approvals, documents, weekly forecast.
- Make the old founder spreadsheet read-only after acceptance.
- Send launch instructions explaining the form, owner responsibilities, required next actions, and support route.
- Monitor n8n executions daily for the first two weeks.
The rollback procedure is to deactivate n8n workflows, continue collecting form responses in the linked Google Sheet, export the current Airtable base, and process urgent inquiries manually from the sheet. Existing Airtable records should not be deleted during rollback.
Code and Configuration
The selected platforms provide native triggers and actions for most of the implementation. Code is used only where deterministic normalization, date handling, routing, and submission-key creation are easier to maintain in one n8n Code node.
Complete n8n Intake Normalization Code
Create a Code node named Normalize Intake immediately after the Google Sheets Trigger. Set it to run once for all input items. Replace the owner email placeholders and ensure the Google Forms column headings match the property names in the script.
const ROUTES = {
'Operations Advisory': {
owner: 'Operations Lead',
email: 'operations.lead@YOUR_DOMAIN'
},
'Managed Services': {
owner: 'Managed Services Lead',
email: 'managed.services.lead@YOUR_DOMAIN'
},
'Training & Enablement': {
owner: 'Training Lead',
email: 'training.lead@YOUR_DOMAIN'
},
'Other / Unsure': {
owner: 'Sales Operations Coordinator',
email: 'sales.operations@YOUR_DOMAIN'
}
};
const EXISTING_OWNER_ROUTES = {
'Operations Lead': ROUTES['Operations Advisory'],
'Managed Services Lead': ROUTES['Managed Services'],
'Training Lead': ROUTES['Training & Enablement']
};
const ALLOWED_REGIONS = new Set([
'Domestic',
'International',
'Remote / Unspecified'
]);
const ALLOWED_LEAD_SOURCES = new Set([
'Referral',
'Existing Client',
'Website',
'Email',
'Event',
'Partner',
'Other'
]);
function clean(value) {
if (value === null || value === undefined) return '';
return String(value).replace(/\s+/g, ' ').trim();
}
function normalizeEmail(value) {
return clean(value).toLowerCase();
}
function isValidEmail(value) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
}
function normalizeCompany(value) {
return clean(value)
.normalize('NFKD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase()
.replace(/[^a-z0-9]+/g, ' ')
.trim();
}
function parseCurrency(value) {
const raw = clean(value);
if (!raw) return null;
const normalized = raw.replace(/[^0-9.-]/g, '');
if (!normalized || normalized === '-' || normalized === '.') return null;
const amount = Number(normalized);
if (!Number.isFinite(amount) || amount < 0) return null;
return Math.round((amount + Number.EPSILON) * 100) / 100;
}
function validDateParts(year, month, day) {
const date = new Date(Date.UTC(year, month - 1, day));
return (
date.getUTCFullYear() === year &&
date.getUTCMonth() === month - 1 &&
date.getUTCDate() === day
);
}
function parseDateOnly(value) {
const raw = clean(value);
if (!raw) return null;
let match = raw.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);
if (match) {
const year = Number(match[1]);
const month = Number(match[2]);
const day = Number(match[3]);
if (!validDateParts(year, month, day)) return null;
return [
String(year).padStart(4, '0'),
String(month).padStart(2, '0'),
String(day).padStart(2, '0')
].join('-');
}
match = raw.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);
if (match) {
const month = Number(match[1]);
const day = Number(match[2]);
const year = Number(match[3]);
if (!validDateParts(year, month, day)) return null;
return [
String(year).padStart(4, '0'),
String(month).padStart(2, '0'),
String(day).padStart(2, '0')
].join('-');
}
return null;
}
function formatDateOnly(date) {
return [
String(date.getUTCFullYear()).padStart(4, '0'),
String(date.getUTCMonth() + 1).padStart(2, '0'),
String(date.getUTCDate()).padStart(2, '0')
].join('-');
}
function nextBusinessDay(fromDate) {
const result = new Date(fromDate.getTime());
do {
result.setUTCDate(result.getUTCDate() + 1);
} while (result.getUTCDay() === 0 || result.getUTCDay() === 6);
return formatDateOnly(result);
}
function daysUntil(dateOnly, fromDate) {
if (!dateOnly) return null;
const target = new Date(`${dateOnly}T00:00:00.000Z`);
const start = new Date(Date.UTC(
fromDate.getUTCFullYear(),
fromDate.getUTCMonth(),
fromDate.getUTCDate()
));
return Math.ceil((target.getTime() - start.getTime()) / 86400000);
}
function fnv1a64(value) {
let hash = 0xcbf29ce484222325n;
const prime = 0x100000001b3n;
for (let index = 0; index < value.length; index += 1) {
hash ^= BigInt(value.charCodeAt(index));
hash = BigInt.asUintN(64, hash * prime);
}
return hash.toString(16).padStart(16, '0');
}
function isYes(value) {
return /^(yes|true|y|1|yes, the contact expects follow-up)$/i.test(clean(value));
}
const inputItems = $input.all();
const now = new Date();
return inputItems.map((item) => {
const row = item.json;
const sourceTimestampRaw = clean(row['Timestamp']);
const sourceRowNumber =
row['row_number'] ??
row['rowNumber'] ??
row['_rowNumber'] ??
null;
const requester = normalizeEmail(
row['Email Address'] || row['Submitter email']
);
const companyName = clean(row['Company name']);
const companyKey = normalizeCompany(companyName);
const contactName = clean(row['Contact name']);
const contactEmail = normalizeEmail(row['Contact email']);
const contactPhone = clean(row['Contact phone']);
const serviceInterest = clean(row['Service interest']);
const region = clean(row['Region']);
const existingClient = clean(row['Existing client?']);
const existingAccountOwner = clean(row['Existing account owner']);
const leadSource = clean(row['Lead source']);
const inquirySummary = clean(row['Inquiry summary']);
const contactPermission = isYes(row['Contact permission confirmed?']);
const opportunityValue = parseCurrency(
row['Estimated opportunity value']
);
const expectedCloseDate = parseDateOnly(
row['Estimated decision date']
);
const errors = [];
if (!requester || !isValidEmail(requester)) {
errors.push('Requester email is missing or invalid');
}
if (!companyName) {
errors.push('Company name is required');
}
if (!contactName) {
errors.push('Contact name is required');
}
if (!contactEmail || !isValidEmail(contactEmail)) {
errors.push('Contact email is missing or invalid');
}
if (!ROUTES[serviceInterest]) {
errors.push('Service interest is not an allowed value');
}
if (!ALLOWED_REGIONS.has(region)) {
errors.push('Region is not an allowed value');
}
if (!ALLOWED_LEAD_SOURCES.has(leadSource)) {
errors.push('Lead source is not an allowed value');
}
if (opportunityValue === null) {
errors.push('Estimated opportunity value is invalid');
}
if (!expectedCloseDate) {
errors.push('Estimated decision date is invalid');
}
if (inquirySummary.length < 20) {
errors.push('Inquiry summary is too short');
}
if (!contactPermission) {
errors.push('Contact permission is not confirmed');
}
let route = ROUTES[serviceInterest] || ROUTES['Other / Unsure'];
if (
existingClient.toLowerCase() === 'yes' &&
EXISTING_OWNER_ROUTES[existingAccountOwner]
) {
route = EXISTING_OWNER_ROUTES[existingAccountOwner];
}
const closeDateDistance = daysUntil(expectedCloseDate, now);
const priority =
opportunityValue !== null &&
(
opportunityValue >= 50000 ||
(closeDateDistance !== null && closeDateDistance <= 30)
)
? 'High'
: 'Normal';
const submissionSeed = [
sourceTimestampRaw || 'NO_TIMESTAMP',
sourceRowNumber || 'NO_ROW',
contactEmail || 'NO_EMAIL',
companyKey || 'NO_COMPANY',
serviceInterest || 'NO_SERVICE'
].join('|');
const submissionKey = `FORM-${fnv1a64(submissionSeed)}`;
const validationValid = errors.length === 0;
return {
json: {
sourceTimestampRaw,
sourceRowNumber,
requester,
companyName,
companyKey,
contactName,
contactEmail,
contactPhone,
serviceInterest,
region,
existingClient,
existingAccountOwner,
leadSource,
inquirySummary,
contactPermission,
opportunityValue,
expectedCloseDate,
owner: route.owner,
ownerEmail: route.email,
stage: 'New',
probability: 10,
forecastCategory: 'Pipeline',
priority,
nextAction: 'Review inquiry and contact prospect',
nextActionDate: nextBusinessDay(now),
submissionKey,
receivedAt: now.toISOString(),
validationValid,
automationStatus: validationValid ? 'Ready' : 'Needs Review',
exceptionType: validationValid ? '' : 'Missing Data',
errorMessage: errors.join('; '),
shouldSendAcknowledgement:
validationValid && contactPermission,
acknowledgementSubject:
`We received your inquiry: ${companyName || 'sales inquiry'}`,
acknowledgementBody: [
`Hello ${contactName || 'there'},`,
'',
'Thank you for contacting our team. Your inquiry has been recorded and assigned for review.',
'',
'A member of our team will follow up using the information provided.',
'',
'Regards,',
'Sales Team'
].join('\n')
}
};
});
The script has no external dependencies. It does not require API credentials because n8n credentials belong on the connector nodes. It expects form responses using the exact headings shown in the implementation.
To test it, pin one sample Google Sheets trigger item, run the Code node, and verify:
validationValidis true for a complete sample.submissionKeyremains the same when the same input is run again.companyKeyremoves punctuation consistently.opportunityValueis numeric.expectedCloseDateuses ISO date format.ownerandownerEmailmatch the routing rule.nextActionDateskips weekends.
A common failure is a mismatch between the Google Forms heading and the property name in the script. Inspect the Google Sheets Trigger output and either rename the form question or update the corresponding property string.
Duplicate Search Configuration
Use the Airtable List or Search action with this filter formula for an exact event. Interface labels may vary between n8n versions, but the underlying operation must return records matching the formula.
{Submission Key} = '{{$('Normalize Intake').item.json.submissionKey}}'
For likely business duplicates, search by normalized contact email among open records:
AND(
LOWER({Contact Email}) = '{{$('Normalize Intake').item.json.contactEmail}}',
NOT(OR({Stage} = "Won", {Stage} = "Lost"))
)
Then use an n8n filter to compare each returned record’s Company Key with companyKey. This avoids placing an untrusted company name directly inside an Airtable formula string.
Reminder Query Configuration
The weekday reminder workflow can use this Airtable formula:
AND(
{Next Action Date},
NOT(OR({Stage} = "Won", {Stage} = "Lost", {Stage} = "Nurture")),
IS_BEFORE({Next Action Date}, DATEADD(TODAY(), 1, "day"))
)
Enable return-all or pagination in the Airtable node. Even though current volume is low, the workflow should not assume that the first API page contains every overdue record.
n8n Error Workflow
Create a separate workflow named Sales Automation Error Handler with this configuration:
- Use the n8n Error Trigger.
- Extract workflow name, execution ID, failed node, timestamp, and safe error message.
- Search Automation Failures for the execution ID.
- Create the failure record only when it does not already exist.
- Set failure status to Open and recovery owner to the sales operations coordinator.
- Send a Gmail alert containing the workflow name, execution ID, failed node, and n8n execution link.
- If Airtable logging also fails, retain the n8n failed execution as the recovery source and send the Gmail alert where possible.
Configure Airtable, Gmail, Sheets, and Drive nodes to retry transient failures. A practical starting point is three attempts with a delay between attempts. Persistent failures should use the node’s error output or the workflow error handler rather than allowing execution to appear successful.
When an API returns a rate-limit response, respect the provider’s retry guidance and reduce concurrent item processing. Avoid sending one API request per field. Create or update a record with all mapped fields in one operation where possible.
Failure Handling and Operational Reliability
| Failure | User-visible result | Automated response | Manual recovery | Owner |
|---|---|---|---|---|
| Missing required data | Source row shows Needs Review | No external email; exception record or incomplete opportunity created | Correct source data in Airtable and rerun approved recovery workflow | Sales operations |
| Duplicate event | Source row shows Duplicate Ignored | Existing Submission Key returned; no new record or email | None unless the event was incorrectly classified | Automation administrator |
| Potential business duplicate | Existing opportunity receives an activity | Owner notified; no automatic merge | Confirm same opportunity or create a separate record | Sales operations |
| Invalid select value | Record appears in manual-review view | Automation Status set to Needs Review | Map to an allowed value and document correction | Sales operations |
| Airtable unavailable | Form response remains unprocessed | Node retries, then error workflow runs | Replay failed execution after service recovery | Automation administrator |
| Airtable created, source update failed | Sheet does not show Airtable ID | Failure logged with Submission Key | Search Airtable by key and update the source row without recreating | Sales operations |
| Gmail authentication expired | Communication Failed status | Opportunity remains valid; failure alert sent if possible | Reconnect OAuth credential and retry only the message branch | Automation administrator |
| Invalid contact email | No acknowledgement is sent | Validation branch sets Needs Review | Confirm email with requester and update the opportunity | Opportunity owner |
| Gmail send fails after record creation | Opportunity exists with Communication Failed | Retry count increases; no duplicate opportunity | Use recovery workflow keyed by Airtable record ID | Sales operations |
| Drive folder creation fails | Document Link remains blank | Document Failed status and alert | Create or locate folder, then store returned ID and link | Sales operations |
| Drive created, Airtable update failed | Folder exists but is not linked | Next run searches by Opportunity ID before creating | Link existing folder and resolve failure record | Automation administrator |
| Approver unavailable | Approval remains pending | Reminder and backup routing | Apply documented temporary delegation | Sales operations |
| API rate limit | Processing is delayed | Retry with delay and reduce concurrency | Replay remaining failed items after the limit clears | Automation administrator |
| Workflow timeout | Partial run appears in n8n | Error handler logs execution ID | Identify last completed idempotent step and resume from recovery workflow | Automation administrator |
| Notification failure | Pipeline record remains available | Status marks the failed communication | Resend from dedicated recovery workflow | Sales operations |
Idempotency means that replaying the same source event does not create a second opportunity or resend an already successful message. The Submission Key protects creation, while Acknowledgement Sent At, Gmail Message ID, and Drive Folder ID protect downstream actions.
Do not rerun the entire workflow blindly after partial completion. Recovery workflows should accept an Airtable record ID and perform only missing actions, such as updating the source sheet, sending an unsent acknowledgement, or linking an existing Drive folder.
The Automation Failures table acts as a manual dead-letter queue. Staff filter it by Open status, inspect the n8n execution, correct the underlying issue, run the appropriate recovery workflow, and record the resolution. A nightly reconciliation compares recent form submissions with Airtable Submission Keys to identify anything that was not processed.
A Complete Example
An employee records a sample inquiry using controlled test data:
- Company name: Sample Prospect 014
- Contact name: Alex Morgan
- Contact email: [email protected]
- Service interest: Managed Services
- Region: Domestic
- Existing client: No
- Estimated opportunity value: $58,000
- Estimated decision date: October 15, 2026
- Lead source: Referral
- Inquiry summary: The prospect needs recurring operational reporting and process support for a planned service expansion.
- Contact permission: Yes, the contact expects follow-up
- Google Forms writes the response to the linked Sheet with a source timestamp.
- The n8n trigger receives the row and passes it to Normalize Intake.
- The script normalizes the company key to
sample prospect 014, validates the email and date, parses the value as58000, and produces a deterministic FORM-prefixed submission key. - The $58,000 value makes the initial priority High. The Managed Services route assigns the Managed Services Lead.
- The exact Submission Key search returns no records. The open-contact search also returns no matching company key.
- n8n creates the Airtable record. Airtable assigns a sample visible ID such as
OPP-2026-00184and returns its internal record ID. - The new record has Stage New, Probability 10, Forecast Category Pipeline, Next Action Review inquiry and contact prospect, and a next-action date on the following business day.
- n8n creates a Form Submission Activity linked to the opportunity and writes the Airtable record ID back to the source Sheet.
- Gmail sends the approved acknowledgement to the example address and returns a message identifier. n8n stores the sent timestamp and identifier.
- The assigned owner receives an internal message containing the opportunity ID, value, close date, and next action.
- The owner contacts the prospect and moves the record to Discovery Scheduled, then Qualified after the meeting. The owner updates the value and close date based on discovery.
- The document workflow creates
OPP-2026-00184_Sample-Prospect-014in Google Drive and stores the returned folder ID and link. - The owner proposes a 12 percent discount and nonstandard 45-day payment terms. The approval rule sends the request to finance.
- Finance approves the terms. Because the discount is above 10 percent but not above 15 percent, no second approval is required under the representative rule unless leadership applies a manual exception.
- The approval Activity records the decision, approver, timestamp, discount, and notes.
- The owner moves the record to Proposal Sent and sets a follow-up action for three business days later.
- If the first Gmail attempt receives a temporary service error, n8n retries. If all attempts fail, the opportunity remains intact and Communication Failed appears in the exception queue.
- The prospect accepts the proposal. The owner stores acceptance evidence in Drive, changes Stage to Won, sets Probability to 100, Forecast Category to Closed, and records the final value and close date.
- The final record contains the form source, owner, activity history, approval evidence, Gmail identifier, Drive folder ID, and completed pipeline outcome.
Implementation Cost
All amounts below are representative planning assumptions, not vendor quotes or verified client costs. Current subscription pricing, taxes, currency, contract terms, feature availability, and implementation rates must be confirmed before purchase.
| Work item | Hours | Assumed rate | Estimated amount |
|---|---|---|---|
| Process and data design | 12 | $65 per hour | $780 |
| Google Form and Airtable configuration | 14 | $65 per hour | $910 |
| n8n workflow development | 24 | $65 per hour | $1,560 |
| Legacy spreadsheet cleanup and migration | 12 | $65 per hour | $780 |
| Reporting, security, and governance setup | 10 | $65 per hour | $650 |
| Testing and user acceptance | 12 | $65 per hour | $780 |
| Training | 6 | $65 per hour | $390 |
| Documentation | 6 | $65 per hour | $390 |
| Total internal implementation | 96 | $6,240 |
| Cost category | Planning allowance | Basis |
|---|---|---|
| Airtable | $150 | Internal allowance for required editor access; replace with current vendor quote |
| n8n | $60 | Internal allowance for a managed automation environment; replace with selected deployment cost |
| Google Workspace allocation | $40 | Allocated share of existing Forms, Gmail, Sheets, Drive, and identity services |
| Core software total | $250 | Used in the savings model |
| Internal maintenance labour | $260 | Four hours at the assumed $65 loaded hourly cost |
| Optional AI usage | $15 | Planning allowance based on low monthly volume; monitor actual token or request usage |
An optional professional implementation could be budgeted separately. For planning purposes, 60 to 90 specialist hours at an assumed blended rate of $150 per hour would represent $9,000 to $13,500. This would replace some internal implementation effort rather than automatically being added to the full internal labour estimate.
Tools with no separate incremental charge still require setup, security review, monitoring, documentation, and maintenance. Existing Google Workspace expenditure is therefore acknowledged through an internal allocation.
Estimated Time and Cost Savings
The savings model uses these representative assumptions:
- 45 new opportunities per month
- 42 minutes of current handling per opportunity
- 16 minutes of routine handling after core automation
- 10 percent exception rate
- 15 minutes of manual review per exception
- Four monthly maintenance hours
- $65 loaded hourly labour cost
- $250 monthly recurring core software cost
- $6,240 one-time implementation cost
Current monthly labour hours: Monthly volume × current minutes per record ÷ 60
New monthly labour hours: Monthly volume × new minutes per record ÷ 60, plus exception handling and maintenance
Monthly hours recovered: Current monthly labour hours minus new monthly labour hours
Estimated monthly labour value: Monthly hours recovered × loaded hourly labour cost
Net estimated monthly value: Monthly labour value minus recurring tool costs
Estimated payback period: One-time implementation cost ÷ net estimated monthly value
| Calculation | Formula | Result |
|---|---|---|
| Current labour | 45 × 42 ÷ 60 | 31.50 hours |
| New routine labour | 45 × 16 ÷ 60 | 12.00 hours |
| Exception handling | 45 × 10% × 15 ÷ 60 | 1.125 hours |
| Maintenance | 4 hours | 4.00 hours |
| Total new labour | 12 + 1.125 + 4 | 17.125 hours |
| Hours recovered | 31.50 − 17.125 | 14.375 hours |
| Monthly labour value | 14.375 × $65 | $934.38 |
| Net monthly value | $934.38 − $250 | $684.38 |
| Estimated payback | $6,240 ÷ $684.38 | Approximately 9.1 months |
Recovered time does not automatically reduce payroll. It can represent additional capacity, quicker response, reduced overtime, fewer administrative tasks, less dependence on the founder, or the ability to handle more inquiries without adding equivalent coordination work.
Non-financial benefits include clearer ownership, fewer follow-up questions, more consistent stages, improved auditability, faster visibility into overdue work, better loss reporting, and a more consistent prospect experience.
Readers should replace the monthly volume, handling times, exception rate, review time, maintenance effort, loaded labour cost, tool costs, and implementation estimate with their own measured figures.
Adding AI to the Automation
Artificial intelligence should be added only after the intake, ownership, stage, reminder, approval, and failure workflows operate reliably. Most of the value in this implementation comes from ordinary automation and disciplined data design.
Useful AI applications could include:
- Summarizing long inquiry descriptions
- Suggesting a service category for Other / Unsure submissions
- Identifying missing discovery information in free text
- Suggesting urgency for human review
- Comparing a new inquiry with existing opportunity descriptions
- Producing a draft internal briefing before discovery
- Extracting themes from loss notes
AI should not be used for required fields, exact duplicate keys, value thresholds, approval routing, date calculations, owner permissions, or stage validation. Those tasks are better handled with forms, formulas, lookups, and deterministic rules.
The Recommended AI Enhancement
The recommended enhancement is an AI-generated inquiry summary and categorization suggestion. It runs after deterministic validation and before the owner notification. It does not overwrite Service Interest, Priority, Owner, or Stage.
- Trigger: A valid new Airtable opportunity with AI Status blank.
- AI input: Company name, selected service, region, lead source, inquiry summary, estimated value band, and timing.
- System instruction: Summarize supplied information, suggest a service category and urgency, identify missing information, and avoid unsupported assumptions.
- Expected output: Strict JSON matching the defined schema.
- Validation: Parse JSON, enforce allowed values, reject extra fields, and check confidence range.
- Record update: Write only AI Summary, AI Suggested Service, AI Suggested Urgency, AI Missing Information, AI Confidence, and AI Status.
- Human review: The owner accepts or rejects the suggestions during initial review.
- Low confidence: A confidence score below 0.75 sets AI Status to Review Required.
- Failure behavior: Continue the normal workflow without AI output.
Use this system instruction:
You are a sales operations assistant reviewing a business inquiry.
Use only the information supplied in the user message. Do not infer protected personal characteristics, financial capacity, legal conclusions, or facts that are not present.
Create a concise factual summary. Suggest one allowed service category. Suggest urgency only as an operational review aid. Identify information that may be useful for a human discovery conversation.
Do not accept or reject the opportunity. Do not set pricing, approve terms, assign an owner, or send customer-facing text.
Return only JSON matching the provided schema.
Use this reusable user prompt:
Analyze this sales inquiry.
Company name: {{$json.companyName}}
Selected service: {{$json.serviceInterest}}
Region: {{$json.region}}
Lead source: {{$json.leadSource}}
Estimated opportunity value: {{$json.opportunityValue}}
Expected close date: {{$json.expectedCloseDate}}
Inquiry summary: {{$json.inquirySummary}}
Allowed service categories:
Operations Advisory
Managed Services
Training & Enablement
Other / Unsure
Allowed urgency values:
low
normal
high
Require this JSON schema through a model or connector that supports structured output:
{
"type": "object",
"additionalProperties": false,
"properties": {
"summary": {
"type": "string",
"maxLength": 400
},
"suggested_service": {
"type": "string",
"enum": [
"Operations Advisory",
"Managed Services",
"Training & Enablement",
"Other / Unsure"
]
},
"urgency": {
"type": "string",
"enum": [
"low",
"normal",
"high"
]
},
"missing_information": {
"type": "array",
"maxItems": 6,
"items": {
"type": "string",
"enum": [
"budget confirmation",
"decision process",
"stakeholders",
"scope detail",
"timing detail",
"current process",
"success criteria",
"technical constraints"
]
}
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"rationale": {
"type": "string",
"maxLength": 250
}
},
"required": [
"summary",
"suggested_service",
"urgency",
"missing_information",
"confidence",
"rationale"
]
}
A valid response might be:
{
"summary": "The prospect is seeking recurring operational reporting and process support for a planned service expansion.",
"suggested_service": "Managed Services",
"urgency": "normal",
"missing_information": [
"scope detail",
"stakeholders",
"success criteria"
],
"confidence": 0.88,
"rationale": "The request describes ongoing support rather than a one-time advisory engagement."
}
In n8n, place the AI connector after Airtable creation and before the owner notification. Configure structured output where the selected provider supports it. Add a validation node after the AI response. If parsing fails, set AI Status to Failed, record a safe error message, and continue to the owner notification without AI fields.
Do not send identity documents, payment data, health data, confidential client documents, protected characteristics, or unrelated email history to the AI service. Log model name, request timestamp, output status, confidence, and estimated usage cost, but avoid retaining unnecessary prompt copies indefinitely.
Benefits of the AI Enhancement
The AI enhancement can reduce the time an owner spends reading long or inconsistent inquiry descriptions. It can also provide more consistent internal summaries and identify discovery questions that might otherwise be missed.
These are AI-specific benefits:
- Faster interpretation of unstructured inquiry text
- More consistent short summaries
- Suggested categorization when the submitter chooses Other / Unsure
- Earlier identification of missing discovery information
- Improved thematic reporting across free-text inquiries
Ownership, reminders, pipeline stages, approvals, document creation, duplicate prevention, and weekly forecasts are benefits of the core automation. They do not depend on AI.
What Remains Rule-Based or Human-Controlled
- Duplicate event prevention: Uses the deterministic Submission Key because exact matching is more reliable than semantic judgment.
- Owner routing: Uses service and account-owner rules so responsibility is explainable.
- Opportunity qualification: Remains a human decision because it involves fit, capability, timing, and commercial judgment.
- Opportunity value: Must be confirmed by the owner rather than generated from vague text.
- Forecast category: Requires owner evidence and management review.
- Discount approval: Remains with finance and the managing director.
- Nonstandard terms: Require authorized human review.
- Proposal release: Requires completed approvals and owner confirmation.
- Won or Lost status: Requires documented human evidence.
- Customer-facing communication: The initial acknowledgement uses an approved deterministic template. High-risk or substantive messages are reviewed by a person.
AI output is advisory. Low-confidence, inaccurate, or incomplete output must not block a valid inquiry or change a high-impact field automatically.
Estimating the Additional Value of AI
The following assumptions compare the original process, the core automation, and the optional AI enhancement:
| Measure | Original process | Core automation | Core automation with AI |
|---|---|---|---|
| Routine handling per record | 42 minutes | 16 minutes | Approximately 13.5 minutes including AI review |
| Inquiry summary | Manually reconstructed | Original form text presented consistently | AI summary reviewed by owner |
| Categorization | Inconsistent | Controlled form and routing rules | Optional suggestion for ambiguous text |
| Final decisions | Human | Human | Human |
Assume AI removes four minutes of reading and summarization per record but requires 1.5 minutes of human review. Also assume a 12 percent correction rate requiring three additional minutes and a 3 percent AI failure rate requiring the original four-minute fallback.
Gross AI time reduction: 45 × 4 minutes ÷ 60 = 3.00 hours
Required human review: 45 × 1.5 minutes ÷ 60 = 1.125 hours
Correction time: 45 × 12% × 3 minutes ÷ 60 = 0.27 hours
Failure fallback: 45 × 3% × 4 minutes ÷ 60 = 0.09 hours
Net additional capacity: 3.00 − 1.125 − 0.27 − 0.09 = 1.515 hours per month
Gross labour value: 1.515 × $65 = $98.48 per month
Net value after assumed $15 AI cost: $83.48 per month
This modest result reflects the low monthly volume. AI may be operationally useful for consistency even when the direct financial return is limited. Actual correction rates, failure rates, review times, and usage costs should be measured during a controlled pilot.
Testing Checklist
Use sample data and controlled test accounts before processing real prospect information.
| Test | Expected result |
|---|---|
| Normal submission | One Airtable opportunity, one form activity, source update, acknowledgement, and owner notification |
| Missing required field | Form blocks submission or n8n routes it to Needs Review |
| Invalid email | No external message; safe validation error recorded |
| Invalid value or date | Needs Review status and source error message |
| Duplicate submission event | No second opportunity or duplicate acknowledgement |
| Potential business duplicate | Activity added to existing record and owner notified |
| Duplicate trigger delivery | Submission Key makes second execution idempotent |
| Failed Airtable authentication | Retries occur, error workflow runs, source remains recoverable |
| Expired Google credential | Workflow fails visibly and requires credential reconnection |
| Failed API request | Retry policy runs and persistent failure enters the queue |
| Rate-limit response | Processing delays without creating duplicate records |
| Unavailable approver | Reminder and approved backup routing occur |
| Approval rejection | Proposal remains blocked and owner receives decision |
| More information requested | Status and activity reflect the request without closing the opportunity |
| Owner reassignment | Future reminders use the new owner and activity records the change |
| Overdue item | Record appears in overdue view and owner digest |
| Reminder timing | No more than the intended reminder frequency is sent |
| Escalation timing | Coordinator and managing director are included only under defined rules |
| Failed folder creation | Document Failed status without losing the opportunity |
| Folder created but update failed | Recovery reuses the existing Drive folder |
| Failed notification | Communication Failed status and message-only recovery |
| Unauthorized Airtable user | User cannot access the production base or restricted fields |
| Unauthorized Drive user | User cannot open the opportunity folder |
| Malformed AI output | Schema validation rejects output and core workflow continues |
| Inaccurate AI output | Human rejects suggestion; deterministic fields remain unchanged |
| Low-confidence AI output | AI Status becomes Review Required |
| AI service failure | AI Status becomes Failed and owner still receives normal notification |
| Successful proposal approval | Approval evidence and timestamps are complete |
| Successful Won closure | Probability becomes 100, forecast category closes, and handoff is visible |
| Lost without reason | Record appears in data-quality view |
| Reporting totals | Dashboard totals match filtered Airtable records |
| Audit history | Submission, messages, approvals, transitions, and closure activities are linked |
| Retry behavior | Only incomplete actions repeat; completed actions are not duplicated |
| Nightly reconciliation | Unprocessed form rows and duplicate keys are identified |
Ongoing Maintenance
The sales operations coordinator is the primary business owner. The automation administrator is the technical owner, and a second trained administrator is the backup. The managing director owns policy decisions such as stage definitions, approval thresholds, and forecast categories.
| Frequency | Task | Owner |
|---|---|---|
| Daily | Review failed runs, unprocessed form rows, and open Automation Failures | Sales operations |
| Weekly | Check overdue actions, missing next actions, approval backlog, and forecast totals | Sales operations |
| Weekly | Sample recent opportunity records against Gmail and Drive results | Automation administrator |
| Monthly | Review active users, routing addresses, backup owners, and shared links | System owners |
| Monthly | Review n8n executions, API failures, rate limits, and subscription usage | Automation administrator |
| Monthly | Archive resolved failures and inspect duplicate trends | Sales operations |
| Quarterly | Reassess stage probabilities using actual conversion history | Leadership and analytics |
| Quarterly | Test credential recovery, backup restoration, and rollback procedure | Automation administrator |
| Quarterly | Sample AI outputs, correction rates, failures, and usage cost | AI and sales process owner |
| Every six months | Review retention, privacy controls, access model, and approval thresholds | Leadership and responsible governance owner |
| On staff departure | Remove Google, Airtable, Drive, and n8n access and update routing | Workspace and system administrators |
| After any form change | Retest headings, mappings, validation, duplicate logic, and source updates | Automation administrator |
Documentation should include the current field dictionary, stage definitions, routing rules, credential owners, workflow diagrams, test cases, recovery instructions, approval thresholds, and change history. Any workflow change should be tested in the test base before production activation.
When to Move to Dedicated Software
The Airtable and n8n design does not need to be replaced simply because the business grows. It should be reassessed when its operating requirements exceed the controls and maintainability of the current architecture.
Relevant signs include:
- Opportunity volume increases enough that polling, views, or manual review become difficult to manage.
- The business needs advanced territory, hierarchy, or record-level permissions.
- Marketing automation, campaign attribution, and high-volume contact management become core requirements.
- Sales representatives need a specialized mobile or offline experience.
- Multiple business units require different pipelines, currencies, products, and approval structures.
- Formal regulatory or audit requirements demand stronger controls and vendor assurances.
- Customer-facing portals or self-service deal rooms become necessary.
- Email synchronization and activity capture need to work across a much larger sales team.
- Exception rates rise because the flexible data model no longer matches the process.
- n8n workflows require excessive custom maintenance.
- Airtable record, attachment, API, or performance constraints become material.
- Leadership requires more advanced forecasting, revenue intelligence, or account planning.
- The business requires vendor-delivered support and formal service commitments for the complete CRM process.
- Security risk increases because too many users require direct access to the operational base.
At that point, the company can evaluate dedicated CRM, professional services automation, revenue operations, or customer relationship platforms. The structured fields, stages, identifiers, ownership rules, and activity history created in this implementation make that migration more controlled than moving directly from the founder’s spreadsheet.
Implementation Checklist
- Confirm monthly volume, sales roles, stages, owners, approval rules, and reporting needs.
- Select Google Forms, Airtable, n8n, Gmail, and Google Drive for the core implementation.
- Create production and test accounts.
- Assign business owner, technical owner, and backup owner.
- Configure least-privilege permissions and integration identities.
- Build the Google Form with required fields and controlled choices.
- Link the form to a protected Google Sheet.
- Create Opportunities, Activities, Team Routing, and Automation Failures tables.
- Create unique identifiers, formulas, status fields, and validation views.
- Clean and map the legacy spreadsheet before migration.
- Configure Google OAuth and Airtable credentials in n8n.
- Document every source-to-destination field mapping.
- Build validation, routing, duplicate, record-creation, and source-update actions.
- Store returned Airtable, Gmail, and Drive identifiers.
- Configure owner notifications and prospect acknowledgements.
- Configure next-action reminders and escalation rules.
- Configure finance and managing-director approval rules.
- Create restricted Drive folders and document naming conventions.
- Create operational views and weekly forecast reporting.
- Build the n8n error workflow and manual recovery queue.
- Test normal, invalid, duplicate, partial-failure, approval, document, notification, and reporting cases.
- Complete user acceptance testing with sales, finance, and leadership.
- Run a limited pilot before full deployment.
- Make the old spreadsheet read-only after migration acceptance.
- Document one-time, recurring, and maintenance cost assumptions.
- Replace representative savings assumptions with measured company figures.
- Add AI only after the deterministic workflow is stable.
- Require structured AI output, validation, confidence handling, and human review.
- Review failed runs, permissions, credentials, backups, costs, and AI quality on a schedule.
- Define the volume, security, workflow, and reporting criteria that would justify dedicated CRM software.
Get a FREE
Proof of Concept
& Consultation
No Cost, No Commitment!


