Recued
Menu
← Back to recipes

Turn new Cal.com transcripts into project work

by recued-core v5 42 views

Use “Turn new Cal.com transcripts into project work” in Recued. When a transcript is ready, review supported progress and task changes in the projects you share, plus an index of what you promised, so the next meeting starts from current work.

Complete workflow

Use Meeting Outcomes - Cal.com Transcripts in Recued. When a transcript is ready, turn supported outcomes into reviewed follow-through in the projects you share with the people in the meeting, ready for the next meeting.

You are viewing one recipe in this workflow. Installing it opens the complete pack so its other recipes and background automations arrive together.

Use “Turn new Cal.com transcripts into project work” in Recued. When a transcript is ready, review supported progress and task changes in the projects you share, plus an index of what you promised, so the next meeting starts from current work.

pack:meeting-outcomes-calcom-webhookmeeting-outcomesproject-managementfederated-project
by recued-core pinned v5
View pack details, dependencies, and permissions →

Keep work current for the next meeting

When a Cal Video transcript is ready, this recipe reads the meeting title, attendees, and transcript from your connected Cal.com account. It turns supported decisions, action items, and commitments into reviewed project follow-through. Approved changes keep projects and tasks current, so the next meeting can reuse that progress instead of asking people to report it again.

It can update progress on an existing task, create a task in a shared project, and record what you yourself promised. It never changes a task it did not read during the same run. Unclear ownership, weak matches, and suggestions below your confidence setting stay in Needs review.

Only federated projects

Every project this recipe writes to has to be a federated project. A task assigned to someone in an ordinary local project can never reach them: people receive work by reading a federated project, and a local one gives them nothing to read. Recued used to write those tasks anyway, into your own copy, and call the work assigned.

This does not mean anyone else has to be on Recued. A federated project is simply the container that can become theirs later. Seat a colleague in it by email today, and on the day they run their own Recued you fill in their contract on the participant you already have — every task assigned to them since is theirs immediately, with nothing re-modelled.

So a meeting about a local project produces a review list and no changes. Federate the project first, or act on the review by hand.

Who gets what

Work that belongs to someone else becomes a task in a federated project, assigned to them — which needs exactly one active participant whose email matches that attendee. Add them under Add participant, where an email alone is enough. If nobody matches, or more than one does, the suggestion stays in Needs review instead of being assigned by guesswork.

Work that is yours is recorded as a commitment rather than a task: your own index of what you owe and by when. The assignment list is built from the booking’s attendees, and Cal.com lists you as its host, so your own side never comes back to you as an assignment. You can turn commitments off. Promises made to you are not recorded twice; they are already the other person’s task, where their progress on it is the better signal.

A meeting that clearly calls for a new project is reported, never created — a new project would be local, and a local project is exactly what this recipe refuses to write into.

What Recued reads about the meeting

Cal.com’s own recording is read when the booking has one. Anything you attach is read as well, not instead — both accounts are labelled and both go to the review, and the two are reconciled rather than one silently winning. Attach your notes when a meeting was never transcribed, or when the transcript missed the part that mattered. A meeting with no recording and no attached notes is the one case Recued stops on: there is nothing to reconcile from.

Connect Cal.com

In the pack’s webhook setup, choose the Cal.com transcription profile and enter a strong signing secret. Add the displayed Recued address as a webhook in Cal.com, use the same secret, and subscribe only to RECORDING_TRANSCRIPTION_GENERATED. Recued verifies the signature, uses the event only to identify the booking, and reads the current meeting details through the Cal.com connection you selected.

One meeting, one set of changes

Once a meeting has produced work, Recued records that. A second transcript for the same booking arrives as a new event and starts a fresh run — that run shows you what it would propose but writes nothing, so you are not left with two copies of the same tasks. Turn on Allow reconciling a meeting again when you mean to. A run that produced no work records nothing, so it never blocks a later attempt.

Approvals and timing

Cal.com transcript links are private and expire after one hour, so Recued asks before downloading the transcript. Approve that request promptly. Apply mode then pauses before writing project or task changes. Preview mode writes nothing, but its webhook result is not saved as a review page for later.

How it works 175 steps

Inspect the data fetches, transforms, gates, and output this recipe runs.

Process (175 steps)
◆ webhook_event core.webhook.event.get
Get webhook event
■ profile_exact compare
Check if webhook event delivery profile id is one of cal.webhook.v1
■ decoded_schema_exact compare
Check if webhook event delivery decoded schema id is one of cal.webhook.v1
■ transport_exact compare
Check if webhook event delivery transport assurance is one of authenticated
■ source_truth_policy_exact compare
Check if webhook event delivery minimum source truth policy is one of provider_readback_required
■ envelope_valid all
Check if all conditions are true
⚠ envelope_guard guard
Stop if envelope valid equals
■ transcription_event_exact compare
Check if webhook event event provider event type is one of RECORDING_TRANSCRIPTION_GENERATED
⚠ transcription_event_guard guard
Stop if transcription event exact equals
■ payload_event_matches compare
Check if webhook event payload triggerEvent is one of webhook event event provider event type
⚠ payload_event_guard guard
Stop if payload event matches equals
■ meeting_key trim
Trim whitespace from webhook event event provider resource id
⚠ source_guard guard
Stop if meeting key is empty
◆ booking_read recued-core.calcom.booking.read
Read booking on calcom
■ booking default
Apply default
⚠ booking_guard guard
Stop if booking uid is empty
■ meeting_title default
Apply default
◆ attendee_read recued-core.calcom.booking.attendee.search
Search booking attendee on calcom
■ attendee_source_rows default
Apply default
■ attendee_index_raw map
Extract from each item
◆ transcript_link_read recued-core.calcom.booking.transcript.search
Search booking transcript on calcom
■ transcript_links default
Apply default
■ has_transcript_links compare
Check if transcript links has data
◆ transcript_downloads recued-core.curl.http.get_text
Get text http on curl
■ transcript_link_count count
Count items in transcript links
■ complete_downloads filter
Filter by condition
■ complete_download_count count
Count items in complete downloads
■ transcript_complete compare
Check if complete download count equals transcript link count
⚠ transcript_complete_guard guard
Stop if transcript complete equals
■ transcript_parts map
Extract from each item
■ meeting_material_raw join
Join items with " "
■ meeting_material trim
Trim whitespace from meeting material raw
■ has_meeting_material compare
Check if meeting material has data
■ notes_supplied compare
Check if setting supplementary notes has data
◆ supplementary_notes_markdown recued-core.docling.document.to_markdown
To markdown document on docling
skip: step.notes_supplied equal false
■ supplementary_notes_ref default
Apply default
■ has_supplementary_notes compare
Check if supplementary notes ref has data
■ confidence_threshold clamp
Clamp setting confidence threshold between 0 and 1
■ action_cap clamp
Clamp setting max actions between 1 and 50
■ attendee_index_trimmed map
Extract email from each item
■ attendee_index map
Extract email_trimmed from each item
■ attendee_emails pluck
Extract email from each item
■ attendee_names pluck
Extract name from each item
■ attendee_phone_numbers pluck
Extract phone_number from each item
■ host_index_raw default
Apply default
■ host_index_trimmed map
Extract email from each item
■ host_index map
Extract email_trimmed from each item
■ host_emails pluck
Extract email from each item
■ host_names pluck
Extract name from each item
■ config_project_refs default
Apply default
■ has_config_projects compare
Check if config project refs has data
■ booking_metadata default
Apply default
■ metadata_project_text default
Apply default
■ has_metadata_projects compare
Check if metadata project text has data
■ metadata_project_split split
Split metadata project text into parts
■ metadata_project_refs ternary
Apply ternary
■ resolved_project_refs ternary
Apply ternary
■ project_selection_source ternary
Apply ternary
■ requested_project_refs_raw slice
Take a subset of
■ requested_project_refs unique
Remove duplicates from
⚠ project_guard guard
Stop if requested project refs is empty
◆ project_reads core.work-entity.get
Get work entity
■ found_project_reads filter
Filter by condition
■ candidate_projects map
Extract from each item
■ requested_found_refs pluck
Extract id from each item
⚠ found_project_guard guard
Stop if requested found refs is empty
◆ federation_reads recued-core.federated-projects.federation.search
Search federation on federated projects
■ federation_groups map
Extract from each item
■ federations flatten
Flatten nested lists in
■ federated_project_refs pluck
Extract project_ref from each item
■ project_refs unique
Remove duplicates from
⚠ federated_project_guard guard
Stop if project refs is empty
■ federated_projects filter
Filter by condition
◆ task_reads core.work-entity.list
List work entity
◆ participant_reads recued-core.federated-projects.participant.search
Search participant on federated projects
■ task_groups map
Extract from each item
■ candidate_tasks flatten
Flatten nested lists in
■ candidate_task_ids pluck
Extract id from each item
■ participant_groups map
Extract from each item
■ participants_raw flatten
Flatten nested lists in
■ participants_index_raw map
Extract from each item
■ participants_index_trimmed map
Extract owner_email from each item
■ participants_index map
Extract owner_email_trimmed from each item
■ eligible_participants filter
Filter by condition
■ eligible_assignment_rows map
Extract from each item
■ assignment_groups group_by
Group by pair_key
■ exact_assignment_groups filter
Filter by condition
■ eligible_assignment_keys pluck
Extract pair_key from each item
■ exact_assignment_rows filter
Filter by condition
■ meeting_material_pii_protect pii-protect
Apply pii-protect
✦ extract_meeting_evidence core.ai.extract
AI extracts structured fields from data
skip: step.has_meeting_material equal false
■ extract_meeting_evidence_pii_restore pii-restore
Apply pii-restore
■ primary_evidence default
Apply default
✦ extract_supplementary_evidence core.ai.extract
AI extracts structured fields from data
skip: step.has_supplementary_notes equal false
■ supplementary_evidence default
Apply default
■ evidence_accounts_raw default
Apply default
■ evidence_accounts filter
Filter by condition
■ evidence_account_count count
Count items in evidence accounts
■ evidence_source_names pluck
Extract source from each item
■ evidence_source join
Join items with " + "
⚠ evidence_guard guard
Stop if evidence account count equals
■ meeting_evidence default
Apply default
■ write_in default
Apply default
■ reconcile_pii_protect pii-protect
Apply pii-protect
✦ reconcile core.ai.extract
AI extracts structured fields from data
■ reconcile_pii_restore pii-restore
Apply pii-restore
■ proposal_defaults defaults
Apply defaults
■ task_updates_valid filter
Filter by condition
■ task_updates_due map
Extract due_at_iso from each item
■ task_updates slice
Take a subset of
■ federated_task_creates_valid filter
Filter by condition
■ federated_task_creates_grounded enrich_by
Apply enrich_by
■ task_creates_grounded default
Apply default
■ task_creates_due map
Extract due_at_iso from each item
■ task_creates_priority map
Extract priority from each item
■ task_creates slice
Take a subset of
■ project_signals_valid filter
Filter by condition
■ project_signals slice
Take a subset of
■ record_commitments compare
Check if setting record commitments equals true
■ commitments_owned filter
Filter by condition
■ commitments_directed map
Extract owner_role from each item
■ commitments_valid filter
Filter by condition
■ commitments_due map
Extract promised_for_at_iso from each item
■ project_link_rows map
Extract from each item
■ commitments_project_linked enrich_by
Apply enrich_by
■ commitments_counterparty_lower map
Extract counterparty_email from each item
■ attendee_link_rows map
Extract from each item
■ commitments_linked enrich_by
Apply enrich_by
■ commitments slice
Take a subset of
■ preview_mode compare
Check if setting write mode equals preview
■ reconciled_mark_id sha256
Apply sha256
◆ reconciled_read core.storage.shared.read
Read storage shared
■ already_reconciled compare
Check if reconciled read found equals true
■ reapply_allowed compare
Check if setting allow reapply equals true
■ duplicate_blocked all
Check if all conditions are true
■ writes_suppressed any
Check if any of the conditions are true
■ commitment_write_skipped any
Check if any of the conditions are true
◆ apply_task_updates core.work-entity.task.update
Update work entity task
skip: step.writes_suppressed equal true
■ task_creates_key_source map
Extract from each item
■ task_creates_key_hash map
Extract key_source from each item
■ task_creates_keyed map
Extract from each item
■ commitments_key_source map
Extract from each item
■ commitments_key_hash map
Extract key_source from each item
■ commitments_keyed map
Extract from each item
◆ apply_task_creates core.work-entity.task.create
Create work entity task
skip: step.writes_suppressed equal true
◆ apply_commitments core.work-entity.commitment.propose
Propose work entity commitment
skip: step.commitment_write_skipped equal true
■ task_update_count count
Count items in task updates
■ task_create_count count
Count items in task creates
■ project_signal_count count
Count items in project signals
■ commitment_count count
Count items in commitments
■ review_count count
Count items in needs review
■ task_update_results default
Apply default
■ task_create_results default
Apply default
■ commitment_results default
Apply default
■ task_updates_written filter
Filter by condition
■ task_creates_written filter
Filter by condition
■ commitments_written filter
Filter by condition
■ task_update_written_count count
Count items in task updates written
■ task_create_written_count count
Count items in task creates written
■ commitment_written_count count
Count items in commitments written
■ task_update_refusals filter
Filter by condition
■ task_create_refusals filter
Filter by condition
■ commitment_refusals filter
Filter by condition
■ task_update_refusal_rows map
Extract from each item
■ task_create_refusal_rows map
Extract from each item
■ commitment_refusal_rows map
Extract from each item
■ write_refusals flatten
Flatten nested lists in
■ write_refusal_count count
Count items in write refusals
■ applied_count math
Calculate: {{step.task_update_written_count}} + {{step.task_create_written_count}} + {{step.commitment_written_count}}
■ should_mark_reconciled all
Check if all conditions are true
◆ reconciled_mark_write core.storage.shared.write
Write storage shared
skip: step.should_mark_reconciled equal false
■ proposal_table to_table
Format results as a data table
■ review_table to_table
Format results as a data table
■ refusal_table to_table
Format results as a data table
■ card to_summary
Format results as a summary card
▼
Output
summary card
table proposal_table
table review_table
table refusal_table
json task_updates
json project_signals
json commitments
Settings 9 configurable

Configurable at install. Defaults shown — change them anytime in Recued.

write mode setting = apply
max actions setting = 24
project refs setting =
allow reapply setting = false
meeting title setting =
record commitments setting = true
supplementary notes setting = [object Object]
confidence threshold setting = 0.75
reconcile state prefix setting = recipe.meeting-outcomes

Uses (16 operations)

Webhooks Get webhook event core.webhook.event.get
Pack operation Read booking on calcom recued-core.calcom.booking.read
Pack operation Search booking attendee on calcom recued-core.calcom.booking.attendee.search
Pack operation Search booking transcript on calcom recued-core.calcom.booking.transcript.search
Pack operation Get text http on curl recued-core.curl.http.get_text
Pack operation To markdown document on docling recued-core.docling.document.to_markdown
Tasks & notes Get work entity core.work-entity.get
Pack operation Search federation on federated projects recued-core.federated-projects.federation.search
Tasks & notes List work entity core.work-entity.list
Pack operation Search participant on federated projects recued-core.federated-projects.participant.search
AI models AI extracts structured fields from data core.ai.extract
Shared store Read storage shared core.storage.shared.read
Tasks & notes Update work entity task core.work-entity.task.update
Tasks & notes Create work entity task core.work-entity.task.create
Tasks & notes Propose work entity commitment core.work-entity.commitment.propose
Shared store Write storage shared core.storage.shared.write

Trust & control

What installing this recipe would let it do. Recued grants these permissions at install — review them there before approving.

What it's allowed to do

Read Webhooks core.webhook.event.get read-only
Read Tasks & notes core.work-entity.get read-only
Read Tasks & notes core.work-entity.list read-only
Read AI models core.ai.extract read-only
Read Shared store core.storage.shared.read read-only
Write Tasks & notes core.work-entity.task.update external change
Write Tasks & notes core.work-entity.task.create external change
Write Tasks & notes core.work-entity.commitment.propose external change
Write Shared store core.storage.shared.write external change

7 more aren't listed here. You'll see them at install.

Data it touches

SurfacesWebhooksTasks & notesAI modelsShared store
Warehousedata.shared

About

Tags

pack:meeting-outcomes-calcom-webhookmeeting-outcomesproject-managementfederated-projecttaskcommitmentcalcomai_surfacewebhookautomatic

Details

175 steps 9 configurable settings recipe_id: reconcile-meeting-outcomes-calcom-webhook