Paste any Zoom, Google Meet, or Teams recording URL into a simple form along with the contact email, company name, call purpose, and sales rep name and the workflow logs everything to HubSpot automatically. WayinVideo transcribes the full call with speaker labels and timestamps, then GPT-4o-mini extracts nine structured CRM fields including pain points, objections, key quotes, next steps, deal stage recommendation, sentiment, and a confidence score. A formatted note is created on the matching HubSpot contact and a follow-up task is created with the agreed next steps. Everything is also logged to Google Sheets with the HubSpot Note ID, Task ID, and Contact ID. Built for sales teams, account managers, and agencies who want structured CRM notes created automatically after every call.
⚠️ WayinVideo API key appears in 2 steps — replace
YOUR_WAYINVIDEO_API_KEYin both 2. WayinVideo — Submit Transcription and 4. WayinVideo — Get Transcript Results. Missing either one will cause the workflow to fail.
⚠️ HubSpot Private App token appears in 3 steps — replace
YOUR_HUBSPOT_PRIVATE_APP_TOKENin 11. HTTP — Search HubSpot Contact, 13. HTTP — Create HubSpot Note, and 14. HTTP — Create HubSpot Task. Missing any one will cause those steps to fail.
Estimated Setup Time: 25–30 minutes
Import the workflow — Open n8n → Workflows → Import from JSON → paste the workflow JSON → click Import
Get your WayinVideo API key — Log in to your WayinVideo account → go to Account Settings → copy your API key
Add your WayinVideo API key to node 2 — Open node 2. WayinVideo — Submit Transcription → find the Authorization header value Bearer YOUR_WAYINVIDEO_API_KEY → replace YOUR_WAYINVIDEO_API_KEY with your actual key
Add your WayinVideo API key to node 4 — Open node 4. WayinVideo — Get Transcript Results → find the same Authorization header → replace YOUR_WAYINVIDEO_API_KEY with the same key
Connect OpenAI — Open node 9. OpenAI — GPT-4o-mini Model → click the credential dropdown → add your OpenAI API key → test the connection
Create your HubSpot Private App — Go to your HubSpot account → Settings → Integrations → Private Apps → Create a private app → give it a name → under Scopes, enable: crm.objects.contacts.write, crm.objects.notes.write, crm.objects.tasks.write → click Create app → copy the access token
Add your HubSpot token to node 11 — Open node 11. HTTP — Search HubSpot Contact → find the Authorization header value Bearer YOUR_HUBSPOT_PRIVATE_APP_TOKEN → replace YOUR_HUBSPOT_PRIVATE_APP_TOKEN with your actual token
Add your HubSpot token to node 13 — Open node 13. HTTP — Create HubSpot Note → find the same Authorization header → replace YOUR_HUBSPOT_PRIVATE_APP_TOKEN with the same token
Add your HubSpot token to node 14 — Open node 14. HTTP — Create HubSpot Task → find the same Authorization header → replace YOUR_HUBSPOT_PRIVATE_APP_TOKEN with the same token
Create your Google Sheet tab — Open your Google Sheet → add a tab named exactly CRM Call Log → add these 16 column headers in row 1: Contact Email, Contact Name, Company, Call Purpose, Call Date, Sales Rep, Call Duration (min), HubSpot Contact ID, HubSpot Note ID, HubSpot Task ID, Deal Stage, Sentiment, Confidence Score, Follow-up Date, Recording URL, Created On
Connect Google Sheets — Open node 15. Google Sheets — Log CRM Entry → click the document field → replace YOUR_GOOGLE_SHEET_ID by selecting your spreadsheet or entering the Sheet ID (the string between /d/ and /edit in your Sheet URL) → click the credential dropdown → add Google Sheets OAuth2 → authorize access
Activate the workflow — Toggle the workflow to Active → copy the Form URL from node 1. Form — Call Recording + CRM Details → open it in a browser to submit your first call
Step 1 — Form: Call Recording + CRM Details
You open the form URL in a browser and fill in seven fields: the call recording URL (Zoom, Google Meet, Teams, or Loom), the contact email address in HubSpot, the contact name, the company name, the call purpose (e.g. Discovery Call, Demo, Negotiation), the call date, and the sales rep name. Submitting the form starts the workflow.
Step 2 — HTTP: WayinVideo — Submit Transcription
The recording URL is sent to the WayinVideo transcription API with the target language set to English. WayinVideo accepts the job and returns a task ID confirming transcription has started.
Step 3 — Wait: 90 Seconds
The workflow pauses for 90 seconds before the first status check. Sales calls are typically 30–60 minutes long and need more initial processing time than short videos.
Step 4 — HTTP: WayinVideo — Get Transcript Results
A GET request checks the WayinVideo results endpoint using the task ID from step 2. It returns the current processing status and, once complete, the full speaker-labeled transcript.
Step 5 — IF: Transcription Complete?
This is the polling gate. If the status equals SUCCEEDED (YES path), the transcript is ready and the workflow moves forward to formatting. If still processing (NO path), the workflow routes to 6. Wait — 30 Seconds Retry which pauses 30 seconds then loops back to step 4 to check again. This repeats until SUCCEEDED.
Step 6 — Wait: 30 Seconds Retry
When the transcript is not yet ready, the workflow waits 30 seconds then returns to step 4 for another check. The loop continues automatically.
Step 7 — Code: Format Transcript
Each segment is formatted as [Speaker Name | MM:SS] text. Total call duration in minutes, unique speaker names, and all seven form inputs are packaged here for the AI prompt.
Step 8 — AI Agent: Extract CRM Note
GPT-4o-mini receives the formatted transcript and a detailed system prompt. It extracts nine labeled sections: a 3–4 sentence call summary, pain points the prospect actually mentioned, objections raised during the call, the most important quotes, next steps with owners, the agreed follow-up date (or TBD), a deal stage from a fixed seven-option list, a sentiment label from a fixed five-option list, and a confidence score from 1–10. GPT is instructed to write only from what was actually said — no invented content.
Step 9 — OpenAI: GPT-4o-mini Model
This is the language model powering the CRM extraction. It runs with default settings for consistent, structured output.
Step 10 — Code: Parse CRM Output
All nine labeled sections are extracted from the AI output using regex. A full formatted HubSpot note body is assembled with sections for summary, pain points, objections, quotes, next steps, and a deal intelligence line showing stage, sentiment, and confidence score in one readable block. A follow-up timestamp is calculated — if a specific date was mentioned in the call it is used; if not, a default of 7 days from now is set for the HubSpot task due date. All call metadata is carried forward for the sheet log.
Step 11 — HTTP: Search HubSpot Contact
A POST request searches HubSpot for a contact matching the email address you submitted. It returns the contact's details including the HubSpot internal contact ID.
Step 12 — Code: Extract HubSpot Contact ID
The contact ID is extracted from the search results. If no contact is found for that email, the step throws a clear error stopping the workflow — preventing a note from being created on the wrong contact or no contact at all.
Step 13 — HTTP: Create HubSpot Note
A POST request creates an engagement note on the HubSpot contact using the full formatted note body. The note timestamp is set to the call date you submitted. The note is associated with the contact using HubSpot's standard association type ID 202.
Step 14 — HTTP: Create HubSpot Task
A follow-up task is created on the same HubSpot contact. The task subject includes the contact name and company. The task body contains the next steps extracted from the call. The task due date is set to the follow-up timestamp calculated in step 10. The task is marked HIGH priority and type CALL, and starts with NOT_STARTED status.
Step 15 — Google Sheets: Log CRM Entry
One row is appended to your CRM Call Log tab with all 16 columns: contact email, name, company, call purpose, date, sales rep, duration, HubSpot Contact ID, Note ID, Task ID, deal stage, sentiment, confidence score, follow-up date, recording URL, and the log timestamp.
✅ Contact lookup by email — No manual contact ID lookup needed — the workflow finds the HubSpot contact automatically using the email you provide at submission
✅ Nine structured CRM fields per call — Pain points, objections, key quotes, deal stage, sentiment, and confidence score are all extracted separately — not lumped into one generic note
✅ Fixed deal stage and sentiment options — GPT is constrained to exact picklist values for both fields so every entry in your sheet is filterable and consistent
✅ Follow-up task created automatically — You never need to manually create a follow-up task — it is generated from the next steps in the call with the agreed due date already set
✅ HubSpot Note ID and Task ID logged to Sheets — Every row in your Google Sheets log contains the exact HubSpot IDs so you can cross-reference or deep-link directly to the record
✅ 7-day default due date when follow-up not mentioned — If no specific follow-up date was discussed, the task is automatically due in 7 days so nothing falls through the cracks
✅ Full note body formatted for HubSpot readability — The note is structured with labeled sections and a deal intelligence summary line so any sales rep who opens the contact record can scan it in 30 seconds
Add a retry limit to stop infinite polling — Before node 6. Wait — 30 Seconds Retry, add a Set step that increments a poll counter, then add a second IF check to stop after 15 polls and send a Slack or Gmail error notification instead of looping indefinitely — this is noted as a known risk in the workflow overview.
Create the HubSpot contact if not found — In node 12. Code — Extract HubSpot Contact ID, instead of throwing an error when no contact is found, add an HTTP step that creates the contact in HubSpot using the form's contact name, email, and company name — then continue to note and task creation.
Update the HubSpot deal stage property — After node 13. HTTP — Create HubSpot Note, add a PATCH request to https://api.hubapi.com/crm/v3/objects/contacts/{id} with the dealstage property set to the extracted deal stage value — keeping the contact record's pipeline stage in sync with every call.
Send the rep a summary email after logging — After node 15. Google Sheets — Log CRM Entry, add a Gmail step that sends the sales rep a plain-text email with the call summary, action items, and a direct link to the HubSpot contact so they have everything in their inbox immediately.
Log calls to a HubSpot Deal instead of Contact — In nodes 13 and 14, change the association type and target object from contacts to deals — and add a step before note creation that searches HubSpot for a deal associated with the contact — routing notes and tasks to the deal record instead.
WayinVideo returning an error on submission:
YOUR_WAYINVIDEO_API_KEY in node 2. WayinVideo — Submit Transcription is replaced with your actual API key — not the placeholderWorkflow stuck in the polling loop:
HubSpot contact not found:
HubSpot note or task not being created:
YOUR_HUBSPOT_PRIVATE_APP_TOKEN is replaced in all three steps: 11. HTTP — Search HubSpot Contact, 13. HTTP — Create HubSpot Note, and 14. HTTP — Create HubSpot Taskcrm.objects.contacts.write, crm.objects.notes.write, crm.objects.tasks.write — check in HubSpot Settings → Integrations → Private AppsGoogle Sheets not logging the row:
YOUR_GOOGLE_SHEET_ID in node 15. Google Sheets — Log CRM Entry is replaced with your actual sheet ID from the URLNeed help setting this up or want a custom version built for your team or agency?
📧 Email: [email protected]
🌐 Website: https://www.incrementors.com/