Purpose: This document provides a complete outline and narration script for recording a demo video to submit for Google OAuth verification.
Table of Contents
- Pre-Recording Checklist
- Technical Requirements
- Video Structure Overview
- Complete Narration Script
- Post-Recording Checklist
- Common Rejection Reasons
Pre-Recording Checklist
Complete ALL of these steps before you start recording:
-
Revoke existing Google consent
- Go to myaccount.google.com/permissions
- Find "Consul" and click "Remove Access"
- Wait 5-10 minutes for changes to propagate to Google's servers
- This ensures the full consent screen appears during recording
-
Use production environment
- Record using your live production URL (not localhost)
- Google requires the demo to be in your production environment
-
Set browser to English
- Google reviewers need to see everything in English
- Check browser language settings
-
Prepare your browser window
- Maximize browser window
- When OAuth popup appears, you'll need to widen it to show the full URL
- Test this beforehand
-
Prepare test data
- Have several emails in inbox (some unread, some without labels)
- Have files in Google Drive (not created by Consul)
- Have calendar events
- Have contacts saved
-
Prepare screen recording software
- Recommended: OBS Studio, Loom, or QuickTime
- Test audio levels if doing voice narration
- Set recording resolution to at least 1080p
-
Clear notifications and distractions
- Turn off system notifications
- Close unnecessary tabs and apps
- Use a clean browser profile if possible
Technical Requirements
Google will reject your video if these elements are missing:
| Requirement | Description | How to Verify |
|---|---|---|
| Client ID Visible | The client_id parameter must be visible in the OAuth URL | Widen the popup window, use zoom/annotation |
| All Scopes Displayed | Every requested scope must appear on consent screen | Scroll through the entire list on camera |
| English Language | Consent screen must be in English | Check language toggle (bottom-left of consent screen) |
| "Allow" Button Shown | Must show the consent approval button | Pause on the screen before clicking |
| Production Environment | Must use live production URL | Verify URL bar shows production domain |
| Each Scope Demonstrated | Show functionality for every scope | Follow the script sections below |
Video Structure Overview
Target Duration: 6-8 minutes
| Section | Duration | Purpose |
|---|---|---|
| Introduction | 30 sec | Introduce app and video purpose |
| OAuth Flow | 90 sec | Show consent screen with all requirements |
| Gmail Demo | 2 min | Demonstrate all Gmail operations |
| Drive Demo | 90 sec | Demonstrate Drive search and access |
| Docs Demo | 60 sec | Demonstrate document operations |
| Calendar Demo | 60 sec | Demonstrate calendar operations |
| Contacts Demo | 45 sec | Demonstrate contact lookups |
| Conclusion | 30 sec | Summarize scope necessity |
Complete Narration Script
PART 1: Introduction
Duration: 30 seconds
[SCREEN: Show Consul landing page or dashboard]
"This is a demonstration of Consul, an AI executive assistant that helps users manage their email, calendar, documents, and contacts through natural conversation.
This video will show the complete OAuth consent flow and demonstrate how each requested Google API scope is used within the application.
Let's begin by connecting a Google account."
PART 2: OAuth Consent Flow
Duration: 90 seconds
This is the most critical section. Take your time and ensure every element is visible.
Step 2.1: Initiate Connection
[SCREEN: Click "Connect with Google" button]
"I'll click 'Connect with Google' to begin the OAuth authorization flow."
[SCREEN: Google sign-in appears - select account]
"I'll select the Google account to connect."
Step 2.2: Show Client ID in URL
[SCREEN: OAuth consent popup appears]
[ACTION: WIDEN THE POPUP WINDOW so full URL is visible]
[ACTION: Use annotation/zoom to highlight the client_id parameter]
"Notice the URL in the address bar. I'm highlighting the client_id parameter which matches our registered OAuth client in Google Cloud Console. This confirms this is our verified application requesting access."
[PAUSE for 3-5 seconds with client_id visible]
Step 2.3: Show All Scopes on Consent Screen
[SCREEN: Consent screen showing requested permissions]
[ACTION: Scroll slowly through ALL scopes if they don't fit on one screen]
"The consent screen displays all the permissions Consul is requesting. Let me scroll through each one:
First, basic profile information - the user's email and name for account identification.
Gmail access - this allows the AI to read, compose, send, and manage emails including applying labels and organizing the inbox.
Google Drive access - this allows the AI to search for and retrieve documents when the user asks for files by name or description.
Google Docs access - this allows the AI to create, read, and edit documents on the user's behalf.
Google Calendar access - this allows the AI to view schedules, create events, and check availability.
Contacts and Directory access - this allows the AI to look up email addresses when the user refers to contacts by name."
[ACTION: Verify language toggle shows "English" - mention if visible]
"The consent screen is displayed in English as required."
Step 2.4: Grant Consent
[SCREEN: Show the blue "Allow" button clearly]
"The user reviews these permissions and clicks Allow to grant Consul access."
[ACTION: Click "Allow"]
[SCREEN: Redirect back to Consul app]
"The authorization is complete. The user is now connected and their name and email are displayed in the application."
PART 3: Gmail Scope Demonstration
Duration: 2 minutes
Scope: https://mail.google.com/
[SCREEN: Consul chat interface]
"Now I'll demonstrate how Consul uses Gmail access. This is a restricted scope, and I'll show why the narrower scopes Google suggested - gmail.compose, gmail.readonly, and gmail.send - are insufficient for our use case."
Step 3.1: Reading Emails
[ACTION: Type in chat: "Show me my unread emails"]
"First, the AI reads the user's inbox. I'll ask it to show unread emails."
[SCREEN: AI responds with list of emails]
"The AI retrieves and displays the user's unread messages with sender, subject, and preview."
Step 3.2: Applying Labels (CRITICAL)
[ACTION: Type in chat: "Apply the 'Action Required' label to the first email"]
"Now I'll demonstrate label operations. This is critical because applying labels requires the Gmail messages.modify endpoint, which is NOT available with gmail.compose, gmail.readonly, or gmail.send scopes.
I'll ask the AI to apply an 'Action Required' label to this email."
[SCREEN: AI confirms label applied]
"The AI has applied the label. This operation uses the addLabelIds parameter of the messages.modify endpoint, which requires gmail.modify scope at minimum."
Step 3.3: Marking as Read (CRITICAL)
[ACTION: Type in chat: "Mark this email as read"]
"Similarly, marking emails as read modifies the email's label state by removing the UNREAD label. This also requires the messages.modify endpoint."
[SCREEN: AI confirms marked as read]
"The email is now marked as read."
Step 3.4: Starring Emails (CRITICAL)
[ACTION: Type in chat: "Star this email"]
"Starring an email adds the STARRED label, another modify operation not supported by the suggested narrower scopes."
[SCREEN: AI confirms starred]
Step 3.5: Archiving Emails (CRITICAL)
[ACTION: Type in chat: "Archive this email"]
"Archiving removes the INBOX label from an email. Again, this is a label modification that requires gmail.modify or broader."
[SCREEN: AI confirms archived]
"The email has been archived and will no longer appear in the inbox."
Step 3.6: Composing and Sending
[ACTION: Type in chat: "Draft a reply to Sarah's email saying I'll review the proposal by Friday"]
"The AI can also compose emails. I'll ask it to draft a reply."
[SCREEN: AI shows draft created]
[ACTION: Type in chat: "Send it"]
"And send the email."
[SCREEN: AI confirms sent]
"The email has been sent."
Step 3.7: Deleting Emails
[ACTION: Type in chat: "Delete that spam email"]
"When explicitly requested, the AI can delete unwanted emails."
[SCREEN: AI confirms deleted]
"To summarize: email triage - which is core to Consul's value - requires label modification operations. These operations are not supported by gmail.compose, gmail.readonly, or gmail.send. This is why we require the full Gmail scope."
PART 4: Google Drive Scope Demonstration
Duration: 90 seconds
Scope: https://www.googleapis.com/auth/drive
[SCREEN: Consul chat interface]
"Now I'll demonstrate Google Drive access. Google suggested using the drive.file scope, but I'll show why that doesn't work for an AI assistant."
Step 4.1: Searching Drive (CRITICAL)
[ACTION: Type in chat: "Find my Q4 financial report"]
"The key difference is that drive.file only allows access to files the user explicitly selects through a file picker. But in a conversational AI, users ask for files by description.
Watch what happens when I ask the AI to find a document."
[SCREEN: AI searches and returns results]
"The AI searched the user's entire Drive and found matching documents. This file was NOT created by Consul - it existed in the user's Drive before. With drive.file scope, the AI could not search for or access this file without interrupting the conversation to display a file picker.
That would fundamentally break the conversational experience. Users expect the AI to find files autonomously, like a human assistant would."
Step 4.2: Accessing File Contents
[ACTION: Type in chat: "Open that document and summarize it"]
"I'll ask the AI to open and summarize the document."
[SCREEN: AI retrieves and summarizes content]
"The AI retrieved the full document content and provided a summary."
Step 4.3: Listing Folders
[ACTION: Type in chat: "What files are in my Projects folder?"]
"The AI can also browse folder structures."
[SCREEN: AI lists folder contents]
Step 4.4: Sharing Files
[ACTION: Type in chat: "Share the Q4 report with john@example.com"]
"And share files with others."
[SCREEN: AI confirms sharing]
"To summarize: an AI assistant needs to proactively search and access files based on conversation context. The drive.file scope requires a file picker for every access, which is incompatible with natural conversation."
PART 5: Google Docs Scope Demonstration
Duration: 60 seconds
Scope: https://www.googleapis.com/auth/documents
[SCREEN: Consul chat interface]
"Now I'll demonstrate Google Docs operations."
Step 5.1: Creating Documents
[ACTION: Type in chat: "Create a new document called Team Meeting Notes"]
"The AI can create new Google Docs."
[SCREEN: AI confirms document created]
"A new document has been created."
Step 5.2: Reading Documents
[ACTION: Type in chat: "What's in my project proposal document?"]
"The AI can read and summarize existing documents."
[SCREEN: AI summarizes document content]
Step 5.3: Editing Documents
[ACTION: Type in chat: "Add a section about next steps to the meeting notes"]
"And the AI can edit documents by adding content."
[SCREEN: AI confirms content added]
"The content has been added to the document."
PART 6: Google Calendar Scope Demonstration
Duration: 60 seconds
Scope: https://www.googleapis.com/auth/calendar
[SCREEN: Consul chat interface]
"Now I'll demonstrate Calendar operations."
Step 6.1: Viewing Schedule
[ACTION: Type in chat: "What's on my calendar today?"]
"The AI can retrieve the user's schedule."
[SCREEN: AI lists calendar events]
"The AI shows today's events with times and details."
Step 6.2: Creating Events
[ACTION: Type in chat: "Schedule a meeting with Sarah tomorrow at 2pm for 30 minutes"]
"The AI can create new calendar events."
[SCREEN: AI confirms event created]
"The meeting has been added to the calendar."
Step 6.3: Checking Availability
[ACTION: Type in chat: "When am I free next Tuesday?"]
"And the AI can check availability to help with scheduling."
[SCREEN: AI shows available times]
PART 7: Contacts Scope Demonstration
Duration: 45 seconds
Scopes: contacts, contacts.other.readonly, directory.readonly
[SCREEN: Consul chat interface]
"Finally, I'll demonstrate how Contacts access is used."
Step 7.1: Contact Resolution
[ACTION: Type in chat: "Send an email to Sarah about the project update"]
"When a user asks to email someone by first name, the AI needs to resolve that to an email address. Watch as I ask to email 'Sarah' without specifying her email."
[SCREEN: AI looks up contact and sends email]
"The AI found Sarah in the user's contacts and sent the email to her address. Without Contacts access, users would need to specify full email addresses every time."
Step 7.2: Looking Up Contact Info
[ACTION: Type in chat: "What's John's phone number?"]
"Users can also ask for contact information directly."
[SCREEN: AI returns contact info]
PART 8: Conclusion
Duration: 30 seconds
[SCREEN: Return to Consul dashboard or chat]
"This demonstration has shown how Consul uses each requested OAuth scope to provide a comprehensive AI executive assistant experience.
To summarize the restricted scopes:
The Gmail scope enables email triage with label management. Applying labels, marking as read, starring, and archiving all require the messages.modify endpoint, which is not available in gmail.compose, gmail.readonly, or gmail.send.
The Drive scope enables conversational file search and retrieval. Users ask for files by description, and the AI searches their Drive. This is not possible with drive.file, which requires a file picker for every access.
Each scope is essential to delivering the functionality users expect from an AI executive assistant.
Thank you for reviewing this demonstration."
Post-Recording Checklist
After recording, verify these items before uploading:
- Client ID is clearly visible in the OAuth URL (use zoom if needed in editing)
- All scopes are shown on the consent screen
- "Allow" button is visible before clicking
- Language is English on consent screen
- Each scope has a demonstration showing its use
- Audio is clear (if using voice narration)
- Video resolution is at least 1080p
- Total length is under 10 minutes (ideally 6-8 minutes)
Upload Instructions
- Upload to YouTube
- Set visibility to Unlisted (not Private, not Public)
- Copy the video URL
- Test the URL in an incognito window to ensure it's accessible
- Submit the URL in Google Cloud Console
Common Rejection Reasons
Avoid these mistakes that cause Google to reject demo videos:
| Mistake | Why It Happens | How to Fix |
|---|---|---|
| Client ID not visible | OAuth popup too narrow | Widen popup window, use annotation |
| Missing consent screen | Previously granted consent | Revoke access before recording |
| Scopes not shown | Didn't scroll through all scopes | Scroll slowly through entire list |
| "Allow" button not shown | Clicked too fast | Pause 3-5 seconds on consent screen |
| Wrong language | Browser set to non-English | Check language toggle on consent |
| Not production environment | Recorded on localhost | Use production URL |
| Scope functionality not shown | Rushed through demo | Demonstrate each scope explicitly |
| No narration/explanation | Assumed context was obvious | Add voice or text explaining each step |
Resources
- Google Demo Video Requirements
- Google OAuth Verification Guide - CloudSponge
- Sensitive Scope Verification
- Restricted Scope Verification
Version History
| Date | Changes |
|---|---|
| 2025-02-04 | Initial version created for OAuth verification resubmission |