fraim-framework 2.0.55 → 2.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/registry/ai-manager-rules/customer-development-phases/phase1-customer-profiling.md +101 -0
- package/dist/registry/ai-manager-rules/customer-development-phases/phase2-platform-discovery.md +235 -0
- package/dist/registry/ai-manager-rules/customer-development-phases/phase3-prospect-qualification.md +243 -0
- package/dist/registry/ai-manager-rules/customer-development-phases/phase4-inventory-compilation.md +206 -0
- package/dist/registry/ai-manager-rules/user-survey-phases/phase1-survey-scoping.md +60 -0
- package/dist/registry/ai-manager-rules/user-survey-phases/phase2-survey-build-linkedin.md +23 -0
- package/dist/registry/ai-manager-rules/user-survey-phases/phase3-survey-build-reddit.md +22 -0
- package/dist/registry/ai-manager-rules/user-survey-phases/phase4-survey-build-x.md +21 -0
- package/dist/registry/ai-manager-rules/user-survey-phases/phase5-survey-build-facebook.md +19 -0
- package/dist/registry/ai-manager-rules/user-survey-phases/phase6-survey-build-custom.md +15 -0
- package/dist/registry/ai-manager-rules/user-survey-phases/phase7-survey-dispatch.md +45 -0
- package/dist/registry/templates/bootstrap/ARCHITECTURE-TEMPLATE.md +53 -0
- package/dist/registry/templates/bootstrap/CODE-QUALITY-REPORT-TEMPLATE.md +37 -0
- package/dist/registry/templates/bootstrap/TEST-COVERAGE-REPORT-TEMPLATE.md +35 -0
- package/dist/registry/templates/business-development/IDEATION-REPORT-TEMPLATE.md +29 -0
- package/dist/registry/templates/business-development/PRICING-STRATEGY-TEMPLATE.md +126 -0
- package/dist/registry/templates/customer-development/customer-interview-template.md +99 -0
- package/dist/registry/templates/customer-development/customer-persona-template.md +69 -0
- package/dist/registry/templates/customer-development/follow-up-email-templates.md +132 -0
- package/dist/registry/templates/customer-development/insight-analysis-template.md +74 -0
- package/dist/registry/templates/customer-development/prospect-inventory-template.csv +3 -0
- package/dist/registry/templates/customer-development/search-strategy-template.md +123 -0
- package/dist/registry/templates/customer-development/strategic-recommendations-template.md +53 -0
- package/dist/registry/templates/customer-development/thank-you-email-template.html +124 -0
- package/dist/registry/templates/customer-development/thank-you-note-template.md +16 -0
- package/dist/registry/templates/customer-development/triage-log-template.md +278 -0
- package/dist/registry/templates/customer-development/weekly-newsletter-template.html +204 -0
- package/dist/registry/templates/evidence/Design-Evidence.md +30 -0
- package/dist/registry/templates/evidence/Implementation-BugEvidence.md +94 -0
- package/dist/registry/templates/evidence/Implementation-FeatureEvidence.md +129 -0
- package/dist/registry/templates/evidence/Spec-Evidence.md +19 -0
- package/dist/registry/templates/help/HelpNeeded.md +14 -0
- package/dist/registry/templates/legal/NDA-TEMPLATE.md +170 -0
- package/dist/registry/templates/legal/PATENT-TEMPLATE.md +372 -0
- package/dist/registry/templates/legal/TRADEMARK-TEMPLATE.md +339 -0
- package/dist/registry/templates/legal/contract-review-checklist.md +193 -0
- package/dist/registry/templates/legal/review-report-template.md +198 -0
- package/dist/registry/templates/legal/saas-terms-template.md +174 -0
- package/dist/registry/templates/legal/sow-template.md +117 -0
- package/dist/registry/templates/legal/template-variables.md +131 -0
- package/dist/registry/templates/marketing/DOMAIN-REGISTRATION-TEMPLATE.md +194 -0
- package/dist/registry/templates/marketing/HBR-ARTICLE-TEMPLATE.md +66 -0
- package/dist/registry/templates/marketing/STORYTELLING-TEMPLATE.md +130 -0
- package/dist/registry/templates/marketing/WEBSITE-TEMPLATE.md +262 -0
- package/dist/registry/templates/marketing/github-pages-workflow.yml +64 -0
- package/dist/registry/templates/replicate/implementation-checklist.md +39 -0
- package/dist/registry/templates/replicate/use-cases-template.md +88 -0
- package/dist/registry/templates/retrospective/RETROSPECTIVE-TEMPLATE.md +55 -0
- package/dist/registry/templates/specs/BUGSPEC-TEMPLATE.md +37 -0
- package/dist/registry/templates/specs/FEATURESPEC-TEMPLATE.md +66 -0
- package/dist/registry/templates/specs/TECHSPEC-TEMPLATE.md +39 -0
- package/dist/registry/workflows/bootstrap/create-architecture.md +38 -0
- package/dist/registry/workflows/bootstrap/detect-broken-windows.md +300 -0
- package/dist/registry/workflows/bootstrap/evaluate-code-quality.md +35 -0
- package/dist/registry/workflows/bootstrap/verify-test-coverage.md +36 -0
- package/dist/registry/workflows/brainstorming/blue-sky-brainstorming.md +211 -0
- package/dist/registry/workflows/brainstorming/codebase-brainstorming.md +165 -0
- package/dist/registry/workflows/business-development/create-business-plan.md +737 -0
- package/dist/registry/workflows/business-development/ideate-business-opportunity.md +55 -0
- package/dist/registry/workflows/business-development/price-product.md +325 -0
- package/dist/registry/workflows/compliance/detect-compliance-requirements.md +78 -0
- package/dist/registry/workflows/compliance/generate-audit-evidence.md +75 -0
- package/dist/registry/workflows/compliance/soc2-evidence-generator.md +332 -0
- package/dist/registry/workflows/customer-development/insight-analysis.md +156 -0
- package/dist/registry/workflows/customer-development/insight-triage.md +938 -0
- package/dist/registry/workflows/customer-development/interview-preparation.md +452 -0
- package/dist/registry/workflows/customer-development/linkedin-outreach.md +593 -0
- package/dist/registry/workflows/customer-development/strategic-brainstorming.md +146 -0
- package/dist/registry/workflows/customer-development/thank-customers.md +203 -0
- package/dist/registry/workflows/customer-development/user-survey-dispatch.md +60 -0
- package/dist/registry/workflows/customer-development/users-to-target.md +112 -0
- package/dist/registry/workflows/customer-development/weekly-newsletter.md +366 -0
- package/dist/registry/workflows/deploy/cloud-deployment.md +310 -0
- package/dist/registry/workflows/improve-fraim/contribute.md +32 -0
- package/dist/registry/workflows/improve-fraim/file-issue.md +32 -0
- package/dist/registry/workflows/learning/build-skillset.md +212 -0
- package/dist/registry/workflows/learning/synthesize-learnings.md +284 -0
- package/dist/registry/workflows/legal/contract-review-analysis.md +382 -0
- package/dist/registry/workflows/legal/nda.md +69 -0
- package/dist/registry/workflows/legal/patent-filing.md +76 -0
- package/dist/registry/workflows/legal/saas-contract-development.md +213 -0
- package/dist/registry/workflows/legal/trademark-filing.md +77 -0
- package/dist/registry/workflows/marketing/content-creation.md +37 -0
- package/dist/registry/workflows/marketing/convert-to-pdf.md +235 -0
- package/dist/registry/workflows/marketing/create-modern-website.md +456 -0
- package/dist/registry/workflows/marketing/domain-registration.md +323 -0
- package/dist/registry/workflows/marketing/hbr-article.md +73 -0
- package/dist/registry/workflows/marketing/launch-checklist.md +37 -0
- package/dist/registry/workflows/marketing/marketing-strategy.md +45 -0
- package/dist/registry/workflows/marketing/storytelling.md +65 -0
- package/dist/registry/workflows/performance/analyze-performance.md +65 -0
- package/dist/registry/workflows/product-building/design.md +103 -0
- package/dist/registry/workflows/product-building/implement.md +74 -0
- package/dist/registry/workflows/product-building/iterate-on-pr-comments.md +70 -0
- package/dist/registry/workflows/product-building/prep-issue.md +41 -0
- package/dist/registry/workflows/product-building/prototype.md +65 -0
- package/dist/registry/workflows/product-building/resolve.md +168 -0
- package/dist/registry/workflows/product-building/retrospect.md +86 -0
- package/dist/registry/workflows/product-building/spec.md +181 -0
- package/dist/registry/workflows/product-building/test.md +125 -0
- package/dist/registry/workflows/productivity-report/productivity-report.md +263 -0
- package/dist/registry/workflows/quality-assurance/browser-validation.md +221 -0
- package/dist/registry/workflows/quality-assurance/iterative-improvement-cycle.md +562 -0
- package/dist/registry/workflows/replicate/replicate-discovery.md +336 -0
- package/dist/registry/workflows/replicate/replicate-to-issues.md +324 -0
- package/dist/registry/workflows/reviewer/review-implementation-vs-design-spec.md +638 -0
- package/dist/registry/workflows/reviewer/review-implementation-vs-feature-spec.md +675 -0
- package/dist/registry/workflows/startup-credits/aws-activate-application.md +535 -0
- package/dist/registry/workflows/startup-credits/google-cloud-application.md +647 -0
- package/dist/registry/workflows/startup-credits/microsoft-azure-application.md +538 -0
- package/dist/src/ai-manager/ai-manager.js +4 -6
- package/dist/tests/test-users-to-target-workflow.js +2 -2
- package/package.json +1 -1
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase1-customer-profiling.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase1-survey-scoping.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase2-platform-discovery.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase2-survey-build-linkedin.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase3-prospect-qualification.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase3-survey-build-reddit.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase4-inventory-compilation.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase4-survey-build-x.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase5-survey-build-facebook.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase6-survey-build-custom.md +0 -11
- package/registry/stubs/workflows/customer-development/ai-coach-phases/phase7-survey-dispatch.md +0 -11
- package/registry/stubs/workflows/customer-development/templates/customer-persona-template.md +0 -11
- package/registry/stubs/workflows/customer-development/templates/search-strategy-template.md +0 -11
|
@@ -0,0 +1,647 @@
|
|
|
1
|
+
# Google Cloud for Startups Application Guide
|
|
2
|
+
|
|
3
|
+
**Complete step-by-step guide with Playwright automation instructions for applying to Google Cloud for Startups credits (up to $350K for AI Tier).**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ⚠️ IMPORTANT: Collect User Information First
|
|
8
|
+
|
|
9
|
+
**Before starting automation, you MUST ask the user for the following information:**
|
|
10
|
+
|
|
11
|
+
- **Company Name**
|
|
12
|
+
- **Founder/Contact Name** (first and last name)
|
|
13
|
+
- **Business Email** (MUST match website domain)
|
|
14
|
+
- **Phone Number** (format: digits only, no dashes)
|
|
15
|
+
- **Company Website** (full URL)
|
|
16
|
+
- **Founded Date** (month and year)
|
|
17
|
+
- **Location:** City, State, Zip Code
|
|
18
|
+
- **State/Province**
|
|
19
|
+
- **Country**
|
|
20
|
+
- **Industry**
|
|
21
|
+
- **Job Role**
|
|
22
|
+
- **Job Title**
|
|
23
|
+
- **Funding Level** (e.g., "Bootstrapped", "Pre-seed", "Seed")
|
|
24
|
+
- **Founded Date Range** (e.g., "3-12 months", "1-2 years")
|
|
25
|
+
- **Accelerators** (usually "NONE" if not part of an accelerator)
|
|
26
|
+
- **Google Cloud Billing Account ID** (format: `XXXXXX-XXXXXX-XXXXXX`, 18 characters)
|
|
27
|
+
- User can find this in: https://console.cloud.google.com/billing
|
|
28
|
+
- **CRITICAL:** Billing account admin email domain must match website domain
|
|
29
|
+
|
|
30
|
+
**Store these values in variables and use them throughout the automation steps below.**
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Overview
|
|
35
|
+
|
|
36
|
+
**Program:** Google Cloud for Startups Cloud Program
|
|
37
|
+
**Credits:** Up to $350,000 USD (AI Tier) or $200,000 USD (Scale Tier)
|
|
38
|
+
**URL:** https://cloud.google.com/startup/apply
|
|
39
|
+
**Processing Time:** 3-5 business days (or 7-10 days for new billing accounts)
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Prerequisites
|
|
44
|
+
|
|
45
|
+
### Required Information
|
|
46
|
+
- **Company Name:** [ASK USER]
|
|
47
|
+
- **Founder Name:** [ASK USER]
|
|
48
|
+
- **Business Email:** [ASK USER] (MUST match website domain)
|
|
49
|
+
- **Phone:** [ASK USER] (format: digits only)
|
|
50
|
+
- **Website:** [ASK USER] (full URL)
|
|
51
|
+
- **Founded:** [ASK USER] (month and year)
|
|
52
|
+
- **Location:** [ASK USER - City, State, Zip]
|
|
53
|
+
- **State:** [ASK USER]
|
|
54
|
+
- **Country:** [ASK USER]
|
|
55
|
+
- **Industry:** [ASK USER] (e.g., Technology)
|
|
56
|
+
- **Job Role:** [ASK USER]
|
|
57
|
+
- **Job Title:** [ASK USER]
|
|
58
|
+
- **Funding Level:** [ASK USER] (e.g., Bootstrapped)
|
|
59
|
+
- **Founded Date Range:** [ASK USER] (e.g., 3-12 months)
|
|
60
|
+
- **Accelerators:** [ASK USER] (usually "NONE")
|
|
61
|
+
|
|
62
|
+
### Required Accounts & Setup
|
|
63
|
+
- **Google Account:** For signing in
|
|
64
|
+
- **Business Email:** [ASK USER] (must be set up and match website domain)
|
|
65
|
+
- **Google Cloud Billing Account ID:** [ASK USER] (format: `XXXXXX-XXXXXX-XXXXXX`)
|
|
66
|
+
- Find in: https://console.cloud.google.com/billing
|
|
67
|
+
- **Important:** Billing account admin email domain must match website domain
|
|
68
|
+
|
|
69
|
+
### Pre-Application Setup
|
|
70
|
+
|
|
71
|
+
**If business email doesn't exist:**
|
|
72
|
+
1. Set up email service (Zoho Mail, Google Workspace, etc.) for user's domain
|
|
73
|
+
2. Create business email address
|
|
74
|
+
3. Configure DNS records (MX, SPF, TXT)
|
|
75
|
+
4. Verify email is working
|
|
76
|
+
|
|
77
|
+
**If billing account admin email doesn't match domain:**
|
|
78
|
+
1. Navigate to: https://console.cloud.google.com/billing
|
|
79
|
+
2. Open billing account (user will provide ID)
|
|
80
|
+
3. Go to Account Management
|
|
81
|
+
4. Add business email as Billing Account Administrator
|
|
82
|
+
5. Wait for email verification (may require Google Cloud Identity setup)
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Playwright Automation Steps
|
|
87
|
+
|
|
88
|
+
### Step 1: Navigate to Google Cloud for Startups Application Page
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
// Navigate to application page
|
|
92
|
+
await page.goto('https://cloud.google.com/startup/apply');
|
|
93
|
+
await page.waitForTimeout(3000);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Expected Result:** Page loads showing application form.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
### Step 2: Sign In with Google Account
|
|
101
|
+
|
|
102
|
+
```javascript
|
|
103
|
+
// If sign-in required, wait for user to sign in manually
|
|
104
|
+
// Or automate if credentials available
|
|
105
|
+
await page.waitForURL(/accounts.google.com|cloud.google.com/, { timeout: 30000 });
|
|
106
|
+
|
|
107
|
+
// After sign-in, wait for form to load
|
|
108
|
+
await page.waitForSelector('input[type="text"], input[type="email"]', { timeout: 10000 });
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Note:** User must sign in manually with Google Account. Wait for navigation to application form.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### Step 3: Fill Personal Information
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
// Use user-provided information - REPLACE WITH ACTUAL VALUES FROM USER
|
|
119
|
+
const firstName = '[USER_FIRST_NAME]'; // ASK USER
|
|
120
|
+
const lastName = '[USER_LAST_NAME]'; // ASK USER
|
|
121
|
+
const businessEmail = '[USER_BUSINESS_EMAIL]'; // ASK USER (must match website domain)
|
|
122
|
+
const phone = '[USER_PHONE]'; // ASK USER (digits only)
|
|
123
|
+
|
|
124
|
+
// Fill first name
|
|
125
|
+
await page.getByRole('textbox', { name: /first name/i }).fill(firstName);
|
|
126
|
+
await page.waitForTimeout(500);
|
|
127
|
+
|
|
128
|
+
// Fill last name
|
|
129
|
+
await page.getByRole('textbox', { name: /last name/i }).fill(lastName);
|
|
130
|
+
await page.waitForTimeout(500);
|
|
131
|
+
|
|
132
|
+
// Fill business email (CRITICAL: must match website domain)
|
|
133
|
+
await page.getByRole('textbox', { name: /business email/i }).fill(businessEmail);
|
|
134
|
+
await page.waitForTimeout(1000);
|
|
135
|
+
|
|
136
|
+
// Verify no error appears (personal emails like @gmail.com will be rejected)
|
|
137
|
+
const emailError = page.locator('text=/personal email|business email required/i');
|
|
138
|
+
if (await emailError.isVisible()) {
|
|
139
|
+
throw new Error('Business email validation failed - must use domain matching website');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Fill business phone (format: digits only)
|
|
143
|
+
await page.getByRole('textbox', { name: /business phone|phone/i }).fill(phone);
|
|
144
|
+
await page.waitForTimeout(500);
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Expected Result:** Personal information filled, no email validation errors.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### Step 4: Fill Company Information
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
// Use user-provided information - REPLACE WITH ACTUAL VALUES FROM USER
|
|
155
|
+
const companyName = '[USER_COMPANY_NAME]'; // ASK USER
|
|
156
|
+
const website = '[USER_WEBSITE]'; // ASK USER (full URL)
|
|
157
|
+
|
|
158
|
+
// Fill company name
|
|
159
|
+
await page.getByRole('textbox', { name: /company name|startup name/i }).fill(companyName);
|
|
160
|
+
await page.waitForTimeout(500);
|
|
161
|
+
|
|
162
|
+
// Fill startup website domain (full URL)
|
|
163
|
+
await page.getByRole('textbox', { name: /website|domain/i }).fill(website);
|
|
164
|
+
await page.waitForTimeout(500);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Expected Result:** Company information filled.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### Step 5: Select Industry (Dropdown)
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
// Use user-provided industry - REPLACE WITH ACTUAL VALUE FROM USER
|
|
175
|
+
const industry = '[USER_INDUSTRY]'; // ASK USER (e.g., "Technology")
|
|
176
|
+
|
|
177
|
+
// Click industry dropdown
|
|
178
|
+
await page.getByRole('combobox', { name: /industry/i }).click();
|
|
179
|
+
await page.waitForTimeout(1000);
|
|
180
|
+
|
|
181
|
+
// Type industry name
|
|
182
|
+
await page.keyboard.type(industry);
|
|
183
|
+
await page.waitForTimeout(1000);
|
|
184
|
+
|
|
185
|
+
// Select industry from dropdown
|
|
186
|
+
await page.getByRole('option', { name: new RegExp(`^${industry}$`, 'i') }).click();
|
|
187
|
+
await page.waitForTimeout(1000);
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Expected Result:** Industry selected.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### Step 6: Select Job Role (Dropdown)
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
// Use user-provided job role - REPLACE WITH ACTUAL VALUE FROM USER
|
|
198
|
+
const jobRole = '[USER_JOB_ROLE]'; // ASK USER
|
|
199
|
+
|
|
200
|
+
// Click job role dropdown
|
|
201
|
+
await page.getByRole('combobox', { name: /job role/i }).click();
|
|
202
|
+
await page.waitForTimeout(1000);
|
|
203
|
+
|
|
204
|
+
// Type job role
|
|
205
|
+
await page.keyboard.type(jobRole.split('/')[0].trim()); // Type first part (e.g., "CEO")
|
|
206
|
+
await page.waitForTimeout(1000);
|
|
207
|
+
|
|
208
|
+
// Select job role from dropdown
|
|
209
|
+
await page.getByRole('option', { name: new RegExp(jobRole, 'i') }).click();
|
|
210
|
+
await page.waitForTimeout(1000);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Expected Result:** Job role selected.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
### Step 7: Fill Job Title
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
// Use user-provided job title - REPLACE WITH ACTUAL VALUE FROM USER
|
|
221
|
+
const jobTitle = '[USER_JOB_TITLE]'; // ASK USER
|
|
222
|
+
|
|
223
|
+
// Fill job title
|
|
224
|
+
await page.getByRole('textbox', { name: /job title/i }).fill(jobTitle);
|
|
225
|
+
await page.waitForTimeout(500);
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Expected Result:** Job title filled.
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
### Step 8: Select AI Startup (Radio Button)
|
|
233
|
+
|
|
234
|
+
```javascript
|
|
235
|
+
// ASK USER if their startup is AI-first
|
|
236
|
+
// If yes, select AI startups for up to $350K credits
|
|
237
|
+
// If no, skip this step (will get Scale Tier up to $200K)
|
|
238
|
+
|
|
239
|
+
// Select "AI startups" radio button (if applicable)
|
|
240
|
+
const isAIStartup = '[USER_IS_AI_STARTUP]'; // ASK USER (true/false)
|
|
241
|
+
if (isAIStartup === 'true' || isAIStartup === true) {
|
|
242
|
+
await page.getByRole('radio', { name: /AI startups|AI.*startup/i }).click();
|
|
243
|
+
await page.waitForTimeout(500);
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Expected Result:** AI Startup option selected (if applicable).
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### Step 9: Click "Submit & Continue"
|
|
252
|
+
|
|
253
|
+
```javascript
|
|
254
|
+
// Click submit/continue button
|
|
255
|
+
await page.getByRole('button', { name: /submit.*continue|continue|next/i }).click();
|
|
256
|
+
await page.waitForTimeout(3000);
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Expected Result:** Form progresses to next page.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
### Step 10: Fill Additional Company Details (Page 2)
|
|
264
|
+
|
|
265
|
+
```javascript
|
|
266
|
+
// Use user-provided information - REPLACE WITH ACTUAL VALUES FROM USER
|
|
267
|
+
const businessEmail = '[USER_BUSINESS_EMAIL]'; // ASK USER
|
|
268
|
+
const website = '[USER_WEBSITE]'; // ASK USER
|
|
269
|
+
|
|
270
|
+
// Fill business email again (if required on second page)
|
|
271
|
+
const businessEmailField = page.getByRole('textbox', { name: /business email/i });
|
|
272
|
+
if (await businessEmailField.isVisible()) {
|
|
273
|
+
await businessEmailField.fill(businessEmail);
|
|
274
|
+
await page.waitForTimeout(500);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Fill startup website domain (if required again)
|
|
278
|
+
const websiteField = page.getByRole('textbox', { name: /website|domain/i });
|
|
279
|
+
if (await websiteField.isVisible()) {
|
|
280
|
+
await websiteField.fill(website);
|
|
281
|
+
await page.waitForTimeout(500);
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
### Step 11: Enter Google Cloud Billing Account ID
|
|
288
|
+
|
|
289
|
+
```javascript
|
|
290
|
+
// Use user-provided billing account ID - REPLACE WITH ACTUAL VALUE FROM USER
|
|
291
|
+
const billingAccountId = '[USER_BILLING_ACCOUNT_ID]'; // ASK USER (format: XXXXXX-XXXXXX-XXXXXX)
|
|
292
|
+
|
|
293
|
+
// Fill billing account ID
|
|
294
|
+
await page.getByRole('textbox', { name: /billing.*account.*ID|billing account/i }).fill(billingAccountId);
|
|
295
|
+
await page.waitForTimeout(1000);
|
|
296
|
+
|
|
297
|
+
// Verify no error appears
|
|
298
|
+
const billingError = page.locator('text=/invalid.*billing|billing.*domain.*match/i');
|
|
299
|
+
if (await billingError.isVisible()) {
|
|
300
|
+
const errorText = await billingError.textContent();
|
|
301
|
+
console.error(`Billing account error: ${errorText}`);
|
|
302
|
+
|
|
303
|
+
// If error says admin email domain must match, need to:
|
|
304
|
+
// 1. Add business email as billing account admin
|
|
305
|
+
// 2. Or set up Google Cloud Identity for user's domain
|
|
306
|
+
throw new Error('Billing account admin email domain must match website domain');
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**Expected Result:** Billing account ID accepted, no validation errors.
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
### Step 12: Select Funding Level
|
|
315
|
+
|
|
316
|
+
```javascript
|
|
317
|
+
// Use user-provided funding level - REPLACE WITH ACTUAL VALUE FROM USER
|
|
318
|
+
const fundingLevel = '[USER_FUNDING_LEVEL]'; // ASK USER (e.g., "Bootstrapped", "Pre-seed")
|
|
319
|
+
|
|
320
|
+
// Select funding level radio button
|
|
321
|
+
await page.getByRole('radio', { name: new RegExp(fundingLevel, 'i') }).click();
|
|
322
|
+
await page.waitForTimeout(500);
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Expected Result:** Funding level selected.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
### Step 13: Select Founded Date Range
|
|
330
|
+
|
|
331
|
+
```javascript
|
|
332
|
+
// Use user-provided founded date range - REPLACE WITH ACTUAL VALUE FROM USER
|
|
333
|
+
const foundedRange = '[USER_FOUNDED_RANGE]'; // ASK USER (e.g., "3-12 months", "1-2 years")
|
|
334
|
+
|
|
335
|
+
// Select founded date range radio button
|
|
336
|
+
await page.getByRole('radio', { name: new RegExp(foundedRange.replace('-', '.*'), 'i') }).click();
|
|
337
|
+
await page.waitForTimeout(500);
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**Expected Result:** Founded date range selected.
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
### Step 14: Fill Address Information
|
|
345
|
+
|
|
346
|
+
```javascript
|
|
347
|
+
// Use user-provided address - REPLACE WITH ACTUAL VALUES FROM USER
|
|
348
|
+
const city = '[USER_CITY]'; // ASK USER
|
|
349
|
+
const zipCode = '[USER_ZIP_CODE]'; // ASK USER
|
|
350
|
+
const streetAddress = '[USER_STREET_ADDRESS]'; // ASK USER (if required)
|
|
351
|
+
|
|
352
|
+
// Fill street address (if required)
|
|
353
|
+
const streetField = page.getByRole('textbox', { name: /street|address/i });
|
|
354
|
+
if (await streetField.isVisible() && streetAddress) {
|
|
355
|
+
await streetField.fill(streetAddress);
|
|
356
|
+
await page.waitForTimeout(500);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Fill city
|
|
360
|
+
await page.getByRole('textbox', { name: /city/i }).fill(city);
|
|
361
|
+
await page.waitForTimeout(500);
|
|
362
|
+
|
|
363
|
+
// Fill postal code
|
|
364
|
+
await page.getByRole('textbox', { name: /postal|zip/i }).fill(zipCode);
|
|
365
|
+
await page.waitForTimeout(500);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
### Step 15: Select State (Dropdown)
|
|
371
|
+
|
|
372
|
+
```javascript
|
|
373
|
+
// Use user-provided state - REPLACE WITH ACTUAL VALUE FROM USER
|
|
374
|
+
const state = '[USER_STATE]'; // ASK USER (e.g., "Washington" or "WA")
|
|
375
|
+
|
|
376
|
+
// Click state dropdown
|
|
377
|
+
await page.getByRole('combobox', { name: /state|province/i }).click();
|
|
378
|
+
await page.waitForTimeout(1000);
|
|
379
|
+
|
|
380
|
+
// Type state name
|
|
381
|
+
await page.keyboard.type(state);
|
|
382
|
+
await page.waitForTimeout(1000);
|
|
383
|
+
|
|
384
|
+
// Select state from dropdown
|
|
385
|
+
await page.getByRole('option', { name: new RegExp(`^${state}$|^${state}$`, 'i') }).click();
|
|
386
|
+
await page.waitForTimeout(1000);
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**Expected Result:** State selected.
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
### Step 16: Select Accelerators (Dropdown)
|
|
394
|
+
|
|
395
|
+
```javascript
|
|
396
|
+
// Use user-provided accelerators - REPLACE WITH ACTUAL VALUE FROM USER
|
|
397
|
+
// Usually "NONE" if not part of an accelerator
|
|
398
|
+
const accelerators = '[USER_ACCELERATORS]'; // ASK USER (usually "NONE")
|
|
399
|
+
|
|
400
|
+
// Click accelerators dropdown
|
|
401
|
+
await page.getByRole('combobox', { name: /accelerator|incubator|partner/i }).click();
|
|
402
|
+
await page.waitForTimeout(1000);
|
|
403
|
+
|
|
404
|
+
// Type accelerator name
|
|
405
|
+
await page.keyboard.type(accelerators);
|
|
406
|
+
await page.waitForTimeout(1000);
|
|
407
|
+
|
|
408
|
+
// Select from dropdown
|
|
409
|
+
const acceleratorOption = page.getByRole('option', { name: new RegExp(`^${accelerators}$`, 'i') });
|
|
410
|
+
if (await acceleratorOption.isVisible()) {
|
|
411
|
+
await acceleratorOption.click();
|
|
412
|
+
} else {
|
|
413
|
+
// Try clicking outside to close if already selected
|
|
414
|
+
await page.keyboard.press('Escape');
|
|
415
|
+
}
|
|
416
|
+
await page.waitForTimeout(1000);
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Expected Result:** Accelerators selected (usually "NONE").
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
### Step 17: Accept Terms and Conditions
|
|
424
|
+
|
|
425
|
+
```javascript
|
|
426
|
+
// Check terms checkbox
|
|
427
|
+
const termsCheckbox = page.getByRole('checkbox', { name: /terms|agreement/i });
|
|
428
|
+
if (await termsCheckbox.isVisible()) {
|
|
429
|
+
await termsCheckbox.check();
|
|
430
|
+
await page.waitForTimeout(500);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Check credits deposit checkbox (if present)
|
|
434
|
+
const creditsCheckbox = page.getByRole('checkbox', { name: /credits|deposit/i });
|
|
435
|
+
if (await creditsCheckbox.isVisible()) {
|
|
436
|
+
await creditsCheckbox.check();
|
|
437
|
+
await page.waitForTimeout(500);
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
**Expected Result:** All required checkboxes checked.
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
### Step 18: Submit Application
|
|
446
|
+
|
|
447
|
+
```javascript
|
|
448
|
+
// Click final submit button
|
|
449
|
+
await page.getByRole('button', { name: /submit.*application|submit/i }).click();
|
|
450
|
+
await page.waitForTimeout(5000);
|
|
451
|
+
|
|
452
|
+
// Wait for confirmation page or success message
|
|
453
|
+
await page.waitForSelector('text=/success|submitted|thank you|application.*received/i', { timeout: 10000 });
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
**Expected Result:** Application submitted successfully, confirmation page appears.
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
## Handling Billing Account Domain Mismatch Error
|
|
461
|
+
|
|
462
|
+
### Error: "Your Billing account ID admin email domain must match the website domain"
|
|
463
|
+
|
|
464
|
+
**Solution Steps:**
|
|
465
|
+
|
|
466
|
+
#### Option 1: Add Business Email as Billing Account Administrator
|
|
467
|
+
|
|
468
|
+
```javascript
|
|
469
|
+
// Use user-provided billing account ID - REPLACE WITH ACTUAL VALUE FROM USER
|
|
470
|
+
const billingAccountId = '[USER_BILLING_ACCOUNT_ID]'; // ASK USER
|
|
471
|
+
const businessEmail = '[USER_BUSINESS_EMAIL]'; // ASK USER
|
|
472
|
+
|
|
473
|
+
// Navigate to billing account management
|
|
474
|
+
await page.goto(`https://console.cloud.google.com/billing/${billingAccountId}/manage`);
|
|
475
|
+
await page.waitForTimeout(3000);
|
|
476
|
+
|
|
477
|
+
// Click "Add principal" button
|
|
478
|
+
await page.getByRole('button', { name: /add principal/i }).click();
|
|
479
|
+
await page.waitForTimeout(2000);
|
|
480
|
+
|
|
481
|
+
// Enter business email
|
|
482
|
+
await page.getByRole('textbox', { name: /new principal|email/i }).fill(businessEmail);
|
|
483
|
+
await page.waitForTimeout(2000);
|
|
484
|
+
|
|
485
|
+
// Select role: Billing Account Administrator
|
|
486
|
+
await page.getByRole('combobox', { name: /role/i }).click();
|
|
487
|
+
await page.waitForTimeout(1000);
|
|
488
|
+
await page.getByRole('option', { name: /billing.*account.*administrator/i }).click();
|
|
489
|
+
await page.waitForTimeout(1000);
|
|
490
|
+
|
|
491
|
+
// Click Save
|
|
492
|
+
await page.getByRole('button', { name: /save/i }).click();
|
|
493
|
+
await page.waitForTimeout(3000);
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Note:** This may require Google Cloud Identity to be set up for user's domain first.
|
|
497
|
+
|
|
498
|
+
#### Option 2: Set Up Google Cloud Identity
|
|
499
|
+
|
|
500
|
+
```javascript
|
|
501
|
+
// Use user-provided information - REPLACE WITH ACTUAL VALUES FROM USER
|
|
502
|
+
const companyName = '[USER_COMPANY_NAME]'; // ASK USER
|
|
503
|
+
const firstName = '[USER_FIRST_NAME]'; // ASK USER
|
|
504
|
+
const lastName = '[USER_LAST_NAME]'; // ASK USER
|
|
505
|
+
const currentEmail = '[USER_CURRENT_EMAIL]'; // ASK USER (for verification)
|
|
506
|
+
const domain = '[USER_DOMAIN]'; // ASK USER (extract from website, e.g., "example.com")
|
|
507
|
+
const username = '[USER_USERNAME]'; // ASK USER (for business email, e.g., "founder")
|
|
508
|
+
const password = '[USER_PASSWORD]'; // ASK USER (or generate secure password)
|
|
509
|
+
const phone = '[USER_PHONE]'; // ASK USER (for verification)
|
|
510
|
+
|
|
511
|
+
// Navigate to Cloud Identity signup
|
|
512
|
+
await page.goto('https://workspace.google.com/gcpidentity/signup?sku=identitybasic');
|
|
513
|
+
await page.waitForTimeout(3000);
|
|
514
|
+
|
|
515
|
+
// Fill business name
|
|
516
|
+
await page.getByRole('textbox', { name: /business name/i }).fill(companyName);
|
|
517
|
+
await page.waitForTimeout(500);
|
|
518
|
+
|
|
519
|
+
// Select number of employees
|
|
520
|
+
await page.getByRole('radio', { name: /one|just you/i }).click();
|
|
521
|
+
await page.waitForTimeout(500);
|
|
522
|
+
|
|
523
|
+
// Click Next
|
|
524
|
+
await page.getByRole('button', { name: /next/i }).click();
|
|
525
|
+
await page.waitForTimeout(2000);
|
|
526
|
+
|
|
527
|
+
// Fill contact info
|
|
528
|
+
await page.getByRole('textbox', { name: /first name/i }).fill(firstName);
|
|
529
|
+
await page.getByRole('textbox', { name: /last name/i }).fill(lastName);
|
|
530
|
+
await page.getByRole('textbox', { name: /current email/i }).fill(currentEmail);
|
|
531
|
+
await page.getByRole('button', { name: /next/i }).click();
|
|
532
|
+
await page.waitForTimeout(2000);
|
|
533
|
+
|
|
534
|
+
// Enter domain
|
|
535
|
+
await page.getByRole('textbox', { name: /domain name/i }).fill(domain);
|
|
536
|
+
await page.getByRole('button', { name: /next/i }).click();
|
|
537
|
+
await page.waitForTimeout(2000);
|
|
538
|
+
|
|
539
|
+
// Confirm domain
|
|
540
|
+
await page.getByRole('button', { name: /next/i }).click();
|
|
541
|
+
await page.waitForTimeout(2000);
|
|
542
|
+
|
|
543
|
+
// Create username and password
|
|
544
|
+
await page.getByRole('textbox', { name: /username/i }).fill(username);
|
|
545
|
+
await page.getByRole('textbox', { name: /password/i }).fill(password);
|
|
546
|
+
await page.getByRole('textbox', { name: /confirm password/i }).fill(password);
|
|
547
|
+
await page.getByRole('button', { name: /agree.*continue/i }).click();
|
|
548
|
+
await page.waitForTimeout(5000);
|
|
549
|
+
|
|
550
|
+
// Complete phone verification (manual step required)
|
|
551
|
+
// User must verify phone number
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
|
|
556
|
+
## Manual Steps (If Automation Fails)
|
|
557
|
+
|
|
558
|
+
### Common Issues and Solutions
|
|
559
|
+
|
|
560
|
+
1. **Business Email Validation Error:**
|
|
561
|
+
- Ensure email uses domain matching website (not @gmail.com)
|
|
562
|
+
- Verify email is set up and working
|
|
563
|
+
- Check DNS records are configured correctly
|
|
564
|
+
|
|
565
|
+
2. **Billing Account Domain Mismatch:**
|
|
566
|
+
- Add business email as billing account administrator
|
|
567
|
+
- Or set up Google Cloud Identity for user's domain
|
|
568
|
+
- Wait for email verification
|
|
569
|
+
|
|
570
|
+
3. **Dropdown Not Opening:**
|
|
571
|
+
- Try clicking multiple times
|
|
572
|
+
- Use keyboard navigation (Tab, Enter, Arrow keys)
|
|
573
|
+
- Use `page.evaluate()` for direct DOM manipulation
|
|
574
|
+
|
|
575
|
+
4. **Element Not Found:**
|
|
576
|
+
- Wait longer for page to load
|
|
577
|
+
- Check if element is in iframe
|
|
578
|
+
- Use more generic selectors
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## Verification
|
|
583
|
+
|
|
584
|
+
### Check Application Status
|
|
585
|
+
|
|
586
|
+
```javascript
|
|
587
|
+
// Navigate to Google Cloud for Startups dashboard (if available)
|
|
588
|
+
// Or check email for confirmation
|
|
589
|
+
await page.goto('https://cloud.google.com/startup');
|
|
590
|
+
await page.waitForTimeout(3000);
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
## Expected Outcomes
|
|
596
|
+
|
|
597
|
+
- **Application Submitted:** Confirmation page or email
|
|
598
|
+
- **Processing Time:** 3-5 business days (or 7-10 for new billing accounts)
|
|
599
|
+
- **Approval Email:** Sent to business email address
|
|
600
|
+
- **Credits Added:** Automatically deposited to billing account upon approval
|
|
601
|
+
|
|
602
|
+
---
|
|
603
|
+
|
|
604
|
+
## Troubleshooting
|
|
605
|
+
|
|
606
|
+
### If Application Fails
|
|
607
|
+
|
|
608
|
+
1. **Check Browser Console:**
|
|
609
|
+
```javascript
|
|
610
|
+
page.on('console', msg => console.log('Browser console:', msg.text()));
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
2. **Take Screenshot:**
|
|
614
|
+
```javascript
|
|
615
|
+
await page.screenshot({ path: 'google-cloud-application-error.png', fullPage: true });
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
3. **Check Validation Errors:**
|
|
619
|
+
```javascript
|
|
620
|
+
const errors = await page.locator('[role="alert"], .error, [class*="error"]').all();
|
|
621
|
+
for (const error of errors) {
|
|
622
|
+
console.log('Error:', await error.textContent());
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
---
|
|
627
|
+
|
|
628
|
+
## Next Steps After Submission
|
|
629
|
+
|
|
630
|
+
1. **Monitor Email:** Check user's business email for approval notification
|
|
631
|
+
2. **Check Billing Dashboard:** Verify credits appear in Google Cloud Console
|
|
632
|
+
3. **Follow Up:** If no response after 10 business days, contact Google Cloud support
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
## Resources
|
|
637
|
+
|
|
638
|
+
- **Google Cloud for Startups:** https://cloud.google.com/startup
|
|
639
|
+
- **Application Page:** https://cloud.google.com/startup/apply
|
|
640
|
+
- **Billing Console:** https://console.cloud.google.com/billing
|
|
641
|
+
- **Cloud Identity Setup:** https://workspace.google.com/gcpidentity/signup?sku=identitybasic
|
|
642
|
+
|
|
643
|
+
---
|
|
644
|
+
|
|
645
|
+
**Last Updated:** November 2025
|
|
646
|
+
**Status:** Ready for automation
|
|
647
|
+
**Credits:** Up to $350,000 USD (AI Tier) or $200,000 USD (Scale Tier)
|