Skip to content

feat: Add Sendly SMS app to App Store#28782

Draft
sendly-live wants to merge 10 commits intocalcom:mainfrom
sendly-live:feat/sendly-sms-app
Draft

feat: Add Sendly SMS app to App Store#28782
sendly-live wants to merge 10 commits intocalcom:mainfrom
sendly-live:feat/sendly-sms-app

Conversation

@sendly-live
Copy link
Copy Markdown

Summary

Adds Sendly SMS as a new app in the Cal.com App Store. Sendly provides SMS notifications for Cal.com bookings — confirmations, reminders, rescheduling notices, and cancellation alerts.

Why Sendly over Twilio?

  • Built for bookings — out-of-the-box templates with booking variables ({{attendee_name}}, {{event_title}}, {{start_time}}, etc.)
  • Pre-meeting SMS reminders — configurable timing (e.g., 60 minutes before)
  • No-show follow-ups — automatic SMS when attendees are marked absent
  • Multi-attendee support — SMS to all attendees with phone numbers in group bookings
  • Built-in compliance — TCPA quiet hours, SHAFT content filtering, opt-out handling
  • One-click setup — paste API key, configure events, done

What's included

  • packages/app-store/sendly-sms/config.json — app metadata
  • packages/app-store/sendly-sms/index.ts — app entry point
  • packages/app-store/sendly-sms/api/add.ts — install handler (redirects to Sendly setup)
  • packages/app-store/sendly-sms/components/SendlySmsSetup.tsx — settings UI
  • packages/app-store/sendly-sms/README.mdx — App Store listing
  • packages/app-store/sendly-sms/static/icon.svg — app icon
  • packages/app-store/sendly-sms/.env.example — env template

How it works

  1. User installs Sendly SMS from Cal.com App Store
  2. Enters their Sendly API key (free account at sendly.live)
  3. Completes setup at sendly.live/integrations/calcom (enters Cal.com API key)
  4. Sendly auto-creates a webhook on Cal.com
  5. Booking events trigger SMS to attendees automatically

Supported events

Event Description
Booking Confirmed SMS when a new booking is created
Booking Rescheduled SMS when a booking is moved
Booking Cancelled SMS when a booking is cancelled
Meeting Reminder Scheduled SMS before meeting starts
No-Show Follow-up SMS when attendee marked absent

Links

@sendly-live sendly-live requested a review from a team as a code owner April 7, 2026 16:16
@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Apr 7, 2026

CLA assistant check
All committers have signed the CLA.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 7, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f37e14e5-3f29-4d67-8312-5237618a389a

📥 Commits

Reviewing files that changed from the base of the PR and between a66c308 and 621552a.

📒 Files selected for processing (1)
  • packages/app-store/sendly-sms/api/add.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/app-store/sendly-sms/api/add.ts

📝 Walkthrough

Walkthrough

This pull request adds a new Sendly SMS integration package to the app-store. It introduces package metadata, a package manifest, and a config.json entry describing the app and required API key. It adds a README and an example .env file, a Next.js API route to validate Sendly API keys, and a React setup component for the Cal.com settings UI. Files are organized under packages/app-store/sendly-sms and include exports for api and components.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically summarizes the main change: adding Sendly SMS as a new app to the Cal.com App Store, which aligns with all file additions and the PR's primary objective.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, detailing Sendly SMS features, setup workflow, supported events, and relevant links that correspond to the added files and functionality.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (3)
packages/app-store/sendly-sms/config.json (1)

13-13: Consider adding an app store image.

The imageSrc is empty. While not required, adding a preview image improves the app store listing appearance. If no image is available now, this can be addressed later.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/app-store/sendly-sms/config.json` at line 13, The config.json
currently has an empty "imageSrc" value which leaves the app store listing
without a preview image; update the "imageSrc" property in
packages/app-store/sendly-sms/config.json to point to a valid image URL or
relative asset path (e.g., a hosted PNG/JPEG or an image in the repo) so the app
store can display a preview, ensuring the path is accessible and the file
format/size meet store requirements.
packages/app-store/sendly-sms/components/SendlySmsSetup.tsx (2)

11-18: Hardcoded UI strings should use i18n.

Cal.com uses internationalization for UI strings. These hardcoded English strings should be moved to the translation files for consistency. Based on learnings, UI strings for apps should be added to packages/i18n/locales/en/common.json.

Example for the heading:

import { useLocale } from "@calcom/lib/hooks/useLocale";

export default function SendlySmsSetup() {
  const { t } = useLocale();
  // Then use t("sendly_sms_notifications") instead of hardcoded string
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/app-store/sendly-sms/components/SendlySmsSetup.tsx` around lines 11
- 18, The JSX in SendlySmsSetup contains hardcoded English strings; replace them
with i18n keys by importing and using the locale hook (useLocale) to get t and
call t("sendly_sms_notifications"), t("sendly_sms_description"), etc., for the
heading and paragraph, then add the corresponding keys and English values to the
locales file (packages/i18n/locales/en/common.json). Ensure you update all
visible literals in SendlySmsSetup to use t(...) and add matching keys to the
translation JSON so the component renders the strings via i18n.

10-86: Refactor to use Tailwind classes and Cal.com UI components instead of inline styles.

All other app-store components in the codebase use className with Tailwind CSS and import UI components from @calcom/ui/components/, not inline style objects. For consistency, this setup page should follow the same pattern. Additionally, the hardcoded English text should use the useLocale() hook for i18n support.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/app-store/sendly-sms/components/SendlySmsSetup.tsx` around lines 10
- 86, The SendlySmsSetup component uses inline style objects and hardcoded
English text; refactor it to use Tailwind className utilities and Cal.com UI
components from `@calcom/ui/components` (e.g., Card, Heading, Text, Button, Link,
List/ListItem) instead of inline styles, replacing each div/h*/p/ul/ol/a with
appropriate UI components and Tailwind classes, and remove inline style props;
also replace hardcoded strings with values from useLocale() (call useLocale() at
the top of SendlySmsSetup and use the returned localization helpers/keys for all
visible text and links). Ensure you update imports to pull the UI components and
useLocale, and keep the component name SendlySmsSetup unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/app-store/sendly-sms/api/add.ts`:
- Around line 24-34: The external fetch to "https://sendly.live/api/v1/account"
in the try block should use an AbortController with a timeout: create an
AbortController before calling fetch, pass controller.signal in the fetch
options alongside the Authorization header, start a timeout (e.g., setTimeout)
that calls controller.abort() after a chosen ms, and clear the timeout once
fetch completes; in the catch block detect an abort (controller.signal.aborted
or check for an AbortError) and return a 504 (or appropriate timeout) response,
otherwise keep returning 500 for other errors—update handling around the
existing response, apiKey, and res variables accordingly.
- Around line 14-21: The API handler function `handler` currently accepts any
HTTP method; add a method check at the start to only accept POST (or whichever
intended method) and return a 405 Method Not Allowed for others (include an
Allow header with the allowed method), then proceed to read `req.body` and
validate `apiKey` as before; update the early-return redirect branch to run only
after the method validation so body processing never happens for invalid
methods.

---

Nitpick comments:
In `@packages/app-store/sendly-sms/components/SendlySmsSetup.tsx`:
- Around line 11-18: The JSX in SendlySmsSetup contains hardcoded English
strings; replace them with i18n keys by importing and using the locale hook
(useLocale) to get t and call t("sendly_sms_notifications"),
t("sendly_sms_description"), etc., for the heading and paragraph, then add the
corresponding keys and English values to the locales file
(packages/i18n/locales/en/common.json). Ensure you update all visible literals
in SendlySmsSetup to use t(...) and add matching keys to the translation JSON so
the component renders the strings via i18n.
- Around line 10-86: The SendlySmsSetup component uses inline style objects and
hardcoded English text; refactor it to use Tailwind className utilities and
Cal.com UI components from `@calcom/ui/components` (e.g., Card, Heading, Text,
Button, Link, List/ListItem) instead of inline styles, replacing each
div/h*/p/ul/ol/a with appropriate UI components and Tailwind classes, and remove
inline style props; also replace hardcoded strings with values from useLocale()
(call useLocale() at the top of SendlySmsSetup and use the returned localization
helpers/keys for all visible text and links). Ensure you update imports to pull
the UI components and useLocale, and keep the component name SendlySmsSetup
unchanged.

In `@packages/app-store/sendly-sms/config.json`:
- Line 13: The config.json currently has an empty "imageSrc" value which leaves
the app store listing without a preview image; update the "imageSrc" property in
packages/app-store/sendly-sms/config.json to point to a valid image URL or
relative asset path (e.g., a hosted PNG/JPEG or an image in the repo) so the app
store can display a preview, ensuring the path is accessible and the file
format/size meet store requirements.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a5c10a12-168a-45ea-93c3-96b0e08b5581

📥 Commits

Reviewing files that changed from the base of the PR and between facc074 and a66c308.

⛔ Files ignored due to path filters (1)
  • packages/app-store/sendly-sms/static/icon.svg is excluded by !**/*.svg
📒 Files selected for processing (7)
  • packages/app-store/sendly-sms/.env.example
  • packages/app-store/sendly-sms/README.mdx
  • packages/app-store/sendly-sms/api/add.ts
  • packages/app-store/sendly-sms/components/SendlySmsSetup.tsx
  • packages/app-store/sendly-sms/config.json
  • packages/app-store/sendly-sms/index.ts
  • packages/app-store/sendly-sms/package.json

Copy link
Copy Markdown
Member

@romitg2 romitg2 left a comment

Choose a reason for hiding this comment

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

can you please add video demo

@romitg2 romitg2 marked this pull request as draft April 7, 2026 18:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants