| name | plaud-recordings-to-google-drive-sync |
| description | Plaud Recordings to Google Drive Sync: Automatically backs up your Plaud recordings to Google Drive and keeps a tracking spreadsheet in Google Sheets. Each time you run this workflow, it downloads any new recordings from your Plaud account to a "Plaud Recordings" folder in Drive, creates a transcript for each recording (using Plaud's built-in transcripts when available, or automatic speech-to-text otherwise), saves the transcript alongside the audio file, identifies what each recording is about. |
| version | 1.0.1 |
| homepage | https://www.agentpmt.com/agent-workflow-skills/plaud-recordings-to-google-drive-sync |
| compatibility | Agent instructions for AgentPMT-hosted remote tool calls. Follow this skill body for supported account, wallet, and setup routes. No local command runtime is declared. |
| metadata | {"author":"agentpmt","openclaw":{"homepage":"https://www.agentpmt.com/agent-workflow-skills/plaud-recordings-to-google-drive-sync"}} |
Plaud Recordings to Google Drive Sync
Freshness
Last updated: 2026-08-07.
If the current date is more than 7 days after the last updated date, reinstall this skill from skills.sh or ClawHub before relying on endpoints, schemas, setup steps, or examples.
What This Workflow Does
Automatically backs up your Plaud recordings to Google Drive and keeps a tracking spreadsheet in Google Sheets. Each time you run this workflow, it downloads any new recordings from your Plaud account to a "Plaud Recordings" folder in Drive, creates a transcript for each recording (using Plaud's built-in transcripts when available, or automatic speech-to-text otherwise), saves the transcript alongside the audio file, identifies what each recording is about (meeting, interview, note, etc.), and logs everything in a spreadsheet with links to the audio and transcript files. You can run this as often as you like - it only processes new recordings and won't duplicate anything. Just connect your Plaud, Google Drive, and Google Sheets accounts and run it whenever you want to sync your latest recordings.
Required Setup
- AgentPMT overview:
../what-is-agentpmt.
- Account MCP/REST setup:
../agentpmt-account-mcp-rest-api-setup.
Core AgentPMT setup skills:
- What AgentPMT is: ../what-is-agentpmt
- AgentPMT account MCP/REST setup: ../agentpmt-account-mcp-rest-api-setup
skills.sh install script:
npx skills add AgentPMT/agent-skills --skill what-is-agentpmt
npx skills add AgentPMT/agent-skills --skill agentpmt-account-mcp-rest-api-setup
Workflow Session Management
Call AgentPMT-Workflow-Skills with start_workflow before the first step and end_workflow after the final step.
{"action":"start_workflow","skill_id":"plaud-recordings-to-google-drive-sync"}
{"action":"end_workflow","skill_id":"plaud-recordings-to-google-drive-sync","rating":5,"comment":"completed"}
Workflow Process
- Find or Create Sheet
- Tool product: Google Sheets.
- Tool skill:
../google-sheets.
- ClawHub page: https://clawhub.ai/agentpmt/google-sheets.
- skills.sh install:
npx skills add AgentPMT/agent-skills --skill google-sheets.
- Marketplace: https://www.agentpmt.com/marketplace/google-sheets-api.
- Tool instructions: Locate the tracking spreadsheet. First run action 'search' with query 'Plaud Recordings'. If a spreadsheet named exactly 'Plaud Recordings' exists, use its spreadsheet_id; if none exists, run action 'create' with title 'Plaud Recordings' and initial_headers ['Recording ID','Recording Link','Status','Recording Type','Transcript Link','Recorded At'] on the first tab. Then run action 'get_headers' and, for EACH of 'Recording Type', 'Transcript Link', and 'Recorded At' that an existing sheet is missing, add it with action 'append_column' (one call per missing column, in that order). Do not assume the tab is called 'Sheet1' — read the real tab name from get_headers. Output the spreadsheet_id AND the tab name (sheet_name) for all downstream Sheets steps.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
- Ensure Drive Folder
- Tool product: Google Drive.
- Tool skill:
../google-drive.
- ClawHub page: https://clawhub.ai/agentpmt/google-drive.
- skills.sh install:
npx skills add AgentPMT/agent-skills --skill google-drive.
- Marketplace: https://www.agentpmt.com/marketplace/google-drive.
- Tool instructions: Run action 'ensure_folder_path' with ensure_path 'Plaud Recordings' to create the folder at My Drive root if it does not already exist. Output the resulting folder_id for the upload steps.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
- Read Logged IDs
- Tool product: Google Sheets.
- Tool skill:
../google-sheets.
- ClawHub page: https://clawhub.ai/agentpmt/google-sheets.
- skills.sh install:
npx skills add AgentPMT/agent-skills --skill google-sheets.
- Marketplace: https://www.agentpmt.com/marketplace/google-sheets-api.
- Tool instructions: Using the spreadsheet_id and sheet_name from the Find or Create Sheet step, run action 'read' with range 'A2:A' to get every value in the 'Recording ID' column below the header. Output the set of Recording IDs already logged. If only the header exists, output an empty set. IMPORTANT: treat this as a fast prefilter only. It is re-checked authoritatively inside the loop at claim time, because another run of this workflow can log recordings after this read happens.
ERRORS: a '500 Internal Server Error' almost always means the file_id is wrong or the recording no longer exists — it does NOT mean Plaud is down. Re-check the id and retry once; if it still fails, output {fetch_failed: true}, skip the remaining steps for this recording, and do NOT log a row for it (leaving it unlogged makes the next run retry it). Separately, 'OAuth credential expired or revoked', 'Credential for requirement Plaud OAuth is outdated / connection schema has changed', and a 422 missing_credentials response all mean the SAME thing: the Plaud credential must be re-authorised. Do not spend retries on them — call AgentPMT-Send-Human-Request with request_type enable_tool and stop the run.
AUDIO URL: read 'presigned_url'. When it comes back null, that is USUALLY A TRANSIENT signing failure, not a permanent state — the tool says so in its own response. Wait about 60 seconds and call get_file again, up to 3 attempts total. Only if it is still null after those retries, record presigned_url as unavailable and continue, because a transcript can still be produced from Plaud's own copy.
PLAUD'S OWN TRANSCRIPT: do NOT try to read transcripts out of get_file's 'source_list' — on current accounts that array is routinely empty even for recordings Plaud has processed. Instead call action 'get_transcript' with file_id and block 'transaction' (the raw transcript, with speaker names and timestamps). It returns one page of utterances at a time: whenever the response carries a 'next_cursor', call get_transcript again passing it as 'cursor' until no cursor remains, collecting every utterance. Block 'transaction_polish' returns Plaud's AI-cleaned transcript in the same per-utterance shape if you prefer it. Set has_plaud_transcript true ONLY when this yields at least one non-empty utterance; an empty result or an error here is normal and simply means Plaud has no transcript, so fall through to Speech-to-Text.
Output: presigned_url (or unavailable), recording id, start_at (naive ISO, UTC), duration (ms), has_plaud_transcript, and the collected utterances array when present.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
- Claim Row in Sheet
- Tool product: Google Sheets.
- Tool skill:
../google-sheets.
- ClawHub page: https://clawhub.ai/agentpmt/google-sheets.
- skills.sh install:
npx skills add AgentPMT/agent-skills --skill google-sheets.
- Marketplace: https://www.agentpmt.com/marketplace/google-sheets-api.
- Tool instructions: Claim this recording in the sheet BEFORE doing any expensive upload or transcription work, so a second run executing at the same time cannot process it as well. This step is the workflow's duplicate guard.
STEP 1 — RE-READ, DO NOT TRUST THE EARLIER SET: call action 'read' on the Plaud Recordings spreadsheet (spreadsheet_id and sheet_name from the Find or Create Sheet step) with range 'A2:A' RIGHT NOW. The logged-ID set gathered at the start of the run is stale by this point — a concurrent run may have logged this very recording in the meantime. Use this fresh read.
STEP 2: if the current recording id already appears in that fresh column A, another run owns it. Output {already_claimed: true}, append NOTHING, and skip every remaining step for this recording — no audio upload, no transcription, no transcript upload, no row update.
STEP 3: otherwise immediately append one row with action 'append_rows' and value_input_option 'USER_ENTERED', as an object keyed by headers: {'Recording ID': the current recording id, 'Recording Link': '', 'Status': 'claimed', 'Recording Type': '', 'Transcript Link': '', 'Recorded At': the recording's start_at exactly as Plaud returned it (naive ISO timestamp, UTC)}. Output {already_claimed: false}.
The blank Recording Link and the placeholder 'claimed' status are filled in by the Update Status & Type step at the end. A row still reading 'claimed' after a run means that run died partway and the recording needs attention.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
- Upload Audio to Drive
- Tool product: Google Drive.
- Tool skill:
../google-drive.
- ClawHub page: https://clawhub.ai/agentpmt/google-drive.
- skills.sh install:
npx skills add AgentPMT/agent-skills --skill google-drive.
- Marketplace: https://www.agentpmt.com/marketplace/google-drive.
- Tool instructions: If already_claimed is true, do nothing and output an empty Drive audio link. If presigned_url was still unavailable after the retries in the Get Plaud File step, skip the upload and output an empty Drive audio link — that is not a failure. Otherwise upload the recording audio into the Plaud Recordings folder with action 'upload_file_from_storage': source_file_url = the presigned_url, parent_folder_id = the folder_id from the Ensure Drive Folder step, filename '.mp3', content_type 'audio/mpeg', max_upload_bytes 262144000. Read uploaded_file.web_view_link from the response and output it as the Drive audio link. Never upload the same recording id twice in one run — Drive happily stores two files with identical names, so a repeated upload silently creates a duplicate.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
- Get Transcript (Plaud or STT)
IF already_claimed is true: do nothing, output {skipped: true, reason: 'claimed by another run'}.
IF has_plaud_transcript is true: do NOT call this tool at all — output {used_plaud_transcript: true} and reuse the utterances collected by get_transcript in the Get Plaud File step.
IF presigned_url is unavailable AND has_plaud_transcript is false: there is nothing to transcribe — output {skipped: true, reason: 'no audio url'}.
OTHERWISE call Speech-to-Text: choose the action by recording duration (up to 15 min 'transcribe_quick', up to 30 min 'transcribe_standard', up to 60 min 'transcribe_extended'; over 60 minutes DO NOT transcribe — output {skipped: true, reason: 'exceeds 60 minute limit'}). Pass public_url set to the presigned_url, output_format 'json', and enable_diarization true ONLY when the recording duration is 20 minutes or less (diarization is provider-limited to 20 minutes — for longer recordings set enable_diarization false). The submit response is a task envelope: if its status is already 'completed', use outputs[0] directly; if 'processing', poll action 'get_task' with the returned task_id every 15 seconds until status is 'completed' or 'failed'. Short clips can still take a couple of minutes, so keep polling rather than giving up.
A task can complete SUCCESSFULLY with an empty result (transcript '', words [], speakers []) when the audio contains no speech. That is a success, not a failure — pass it through so the transcript file is still saved and the row is still finished.
On genuine failure, check error_details.recommended_actions and retry once with the recommended larger tier if one is suggested; otherwise treat as skipped with the error as the reason. Output {used_plaud_transcript: false} plus outputs[0]'s json_data (transcript, words, speakers), result_file_id, and result_signed_url.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
- Save Transcript to Drive
- Tool product: Google Drive.
- Tool skill:
../google-drive.
- ClawHub page: https://clawhub.ai/agentpmt/google-drive.
- skills.sh install:
npx skills add AgentPMT/agent-skills --skill google-drive.
- Marketplace: https://www.agentpmt.com/marketplace/google-drive.
- Tool instructions: If transcription was skipped for any reason (including already_claimed), do nothing and output {skipped: true}. Otherwise save the transcript JSON into the Plaud Recordings folder (parent_folder_id from the Ensure Drive Folder step) with action 'upload_file_from_storage', filename ' - transcription.json', content_type 'application/json'.
WHEN used_plaud_transcript is true: base64-encode the utterances array collected via get_transcript in the Get Plaud File step and pass it as source_content_base64 together with that filename. This works regardless of how long the recording is.
WHEN the transcript came from Speech-to-Text: pass the completed task's result_signed_url as source_file_url, or result_file_id as source_file_id if the signed URL is unavailable.
Read uploaded_file.web_view_link from the response and output the transcript file's Drive link.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
- Distill Recording Type
- Prompt: Determine the recording's purpose/type from what the speaker says at the very beginning.
- Update Status & Type
Otherwise finalise this recording's row in the Plaud Recordings spreadsheet (spreadsheet_id and sheet_name from the Find or Create Sheet step) using action 'update_row' with key_column 'Recording ID' and key_value set to the current recording id. ALWAYS set 'Recording Link' to the Drive audio link from the Upload Audio to Drive step (or '' when the audio was unavailable) — the claim row was written with it blank. Then set the rest according to the outcome:
- transcript saved (from Plaud or Speech-to-Text): {'Status': 'transcribed', 'Recording Type': the recording_type from the Distill Recording Type step, 'Transcript Link': the transcript file's Drive link from the Save Transcript to Drive step}
- skipped because the recording exceeded 60 minutes: {'Status': 'download only', 'Recording Type': 'too long to transcribe'}
- skipped for any other reason: {'Status': 'download only', 'Recording Type': 'not transcribed'}
This step is what clears the placeholder 'claimed' status, so it must run for every recording this run actually claimed.
- Default parameters are configured on this workflow node; use the linked tool skill for schema details.
Tool Skill Links
AgentPMT Reference