Skip to content

feat: register Crove CRM native card in App Store - #64

Merged
JOY (JOY) merged 2 commits into
mainfrom
dev
Sep 3, 2026
Merged

feat: register Crove CRM native card in App Store#64
JOY (JOY) merged 2 commits into
mainfrom
dev

Conversation

@JOY

@JOY JOY (JOY) commented Sep 3, 2026

Copy link
Copy Markdown

Summary

  • Registered native Crove CRM (@calcom/crovecrm) in the Cal.com App Store under CRM category (/apps/categories/crm).
  • Integrated CrmServiceMap with direct booking sync and EventType App Card UI.
  • All 115 packages in scope passed urbo type-check.

Test plan

  • Yarn turbo type-check: 115/115 packages passed
  • App Store CLI build generated metadata cleanly

Note

Medium Risk
Introduces outbound sync of booking and attendee data to a third-party CRM using stored API credentials, on the same path as other CRM apps but worth verifying credential handling and sync failure behavior.

Overview
Adds Crove CRM as a first-class App Store CRM app (crovecrm), including store metadata, zod schemas for optional api_key / api_url, and autogenerated registry entries (metadata, schemas, EventTypeAddonMap, CrmServiceMap).

The new CroveCrmIntegrationService delegates to @calcom/features/crove-crm to push booking created, rescheduled, and cancelled events to Crove and to upsert contacts on create; contact lookup and calendar availability are left as no-ops. Event types get a standard enable/disable app card on the Apps tab.

Reviewed by Cursor Bugbot for commit ea63716. Configure here.

@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 48e5f551-895f-4e87-982c-50333cd0204a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@cursor

cursor Bot commented Sep 3, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_31381699-d85b-44df-aa21-d678660dc7d6)

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new CRM integration for Crove CRM, adding the necessary components, configurations, services, schemas, and icons. The review feedback highlights a few improvement opportunities: adding optional chaining when mapping over event.attendees in CrmService.ts to prevent potential runtime errors, and declaring missing workspace dependencies (@calcom/features and @calcom/lib) in package.json to ensure correct dependency resolution and task execution.

Comment on lines +25 to +29
attendees: event.attendees.map((a) => ({
email: a.email,
name: a.name,
timeZone: a.timeZone,
})),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using event.attendees.map directly can lead to a runtime error if event.attendees is undefined or null. It is safer to use optional chaining and provide a fallback empty array, similar to how it is handled in deleteEvent.

Suggested change
attendees: event.attendees.map((a) => ({
email: a.email,
name: a.name,
timeZone: a.timeZone,
})),
attendees: event.attendees?.map((a) => ({
email: a.email,
name: a.name,
timeZone: a.timeZone,
})) || [],

Comment on lines +50 to +54
attendees: event.attendees.map((a) => ({
email: a.email,
name: a.name,
timeZone: a.timeZone,
})),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using event.attendees.map directly can lead to a runtime error if event.attendees is undefined or null. It is safer to use optional chaining and provide a fallback empty array, similar to how it is handled in deleteEvent.

Suggested change
attendees: event.attendees.map((a) => ({
email: a.email,
name: a.name,
timeZone: a.timeZone,
})),
attendees: event.attendees?.map((a) => ({
email: a.email,
name: a.name,
timeZone: a.timeZone,
})) || [],

Comment on lines +7 to +9
"devDependencies": {
"@calcom/types": "workspace:*"
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The package imports from @calcom/features and @calcom/lib, but these workspace dependencies are not declared in package.json. To ensure correct Turbo task graph execution, caching, and dependency resolution, please add them to devDependencies.

  "devDependencies": {
    "@calcom/features": "workspace:*",
    "@calcom/lib": "workspace:*",
    "@calcom/types": "workspace:*"
  }

@JOY
JOY (JOY) merged commit 25d3433 into main Sep 3, 2026
28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant