Marketplace
Publish your integration on the FrontDeskOS Marketplace to reach thousands of front desk teams.
Listing an Integration
To list an integration on the Marketplace, you need to create a manifest.json file that describes your integration, then submit it for review.
- Create a
manifest.jsonfile describing your integration. - Build and test your integration against the sandbox environment.
- Submit your manifest for review via the Developer Portal.
- Once approved, your integration goes live on the Marketplace.
Approval Process
All integrations go through a review process before being listed:
- Submit -- Upload your manifest and integration code via the Developer Portal or the CLI:
npx frontdeskos marketplace submit - Automated checks -- The system validates your manifest schema, tests your webhook endpoints, and verifies OAuth flows if applicable.
- Manual review -- A FrontDeskOS team member reviews your integration for quality, security, and user experience. This typically takes 2-3 business days.
- Approval or feedback -- You receive an email with either an approval confirmation or specific feedback on required changes.
- Go live -- Once approved, your integration appears in the Marketplace and can be installed by any workspace.
Sandbox Testing
Use the sandbox environment at
https://sandbox.frontdeskos.com to test your integration end-to-end before submitting for review.Manifest Schema
The manifest.json file defines everything about your integration:
manifest.jsonjson
{
"name": "Your Integration",
"slug": "your-integration",
"version": "1.0.0",
"description": "A short description of what your integration does.",
"longDescription": "A detailed description with feature highlights, use cases, and setup instructions.",
"author": {
"name": "Your Company",
"email": "integrations@yourcompany.com",
"url": "https://yourcompany.com"
},
"icon": "https://cdn.yourcompany.com/icon-256.png",
"screenshots": [
"https://cdn.yourcompany.com/screenshot-1.png",
"https://cdn.yourcompany.com/screenshot-2.png"
],
"categories": ["crm", "communication"],
"pricing": {
"type": "free",
"trialDays": 0
},
"auth": {
"type": "oauth2",
"authorizationUrl": "https://yourcompany.com/oauth/authorize",
"tokenUrl": "https://yourcompany.com/oauth/token",
"scopes": ["read", "write"]
},
"webhooks": {
"url": "https://yourcompany.com/webhooks/frontdeskos",
"events": [
"call.ended",
"lead.created",
"appointment.booked"
],
"signingSecret": true
},
"configFields": [
{
"name": "syncDirection",
"type": "select",
"label": "Sync Direction",
"options": ["one-way", "two-way"],
"default": "two-way",
"required": true
},
{
"name": "defaultLeadSource",
"type": "string",
"label": "Default Lead Source",
"default": "frontdeskos",
"required": false
}
],
"permissions": [
"calls:read",
"leads:read",
"leads:write",
"appointments:read"
]
}Required Fields
| Parameter | Type | Description |
|---|---|---|
namerequired | string | Display name for the integration. |
slugrequired | string | URL-safe unique identifier (lowercase, hyphens only). |
versionrequired | string | Semantic version of the integration. |
descriptionrequired | string | Short description (max 160 characters). |
authorrequired | object | Author information with name, email, and url. |
iconrequired | string | URL to a 256x256 PNG icon. |
permissionsrequired | string[] | List of required FrontDeskOS permissions. |
Webhook Events
When a workspace installs your integration, FrontDeskOS sends webhook events to the URL specified in your manifest. All events include a signature header for verification.
Webhook payloadjson
{
"id": "evt_abc123",
"type": "call.ended",
"workspaceId": "ws_customer_workspace",
"timestamp": "2025-06-15T14:30:00Z",
"data": {
"callId": "call_xyz789",
"callerName": "John Smith",
"callerPhone": "+1-555-0123",
"duration": 142,
"status": "completed",
"summary": "Scheduled annual check-up"
}
}Verify webhook signaturetypescript
import crypto from "crypto";
function verifyWebhook(
payload: string,
signature: string,
secret: string
): boolean {
const expected = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// In your webhook handler
app.post("/webhooks/frontdeskos", (req, res) => {
const signature = req.headers["x-frontdesk-signature"] as string;
const isValid = verifyWebhook(
JSON.stringify(req.body),
signature,
process.env.WEBHOOK_SIGNING_SECRET!
);
if (!isValid) {
return res.status(401).json({ error: "Invalid signature" });
}
// Process the event
const { type, data } = req.body;
switch (type) {
case "call.ended":
handleCallEnded(data);
break;
case "lead.created":
handleLeadCreated(data);
break;
}
res.status(200).json({ received: true });
});Webhook Retries
If your endpoint returns a non-2xx status code, FrontDeskOS retries the delivery up to 5 times with exponential backoff. After all retries are exhausted, the event is marked as failed and visible in the Developer Portal.