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.

  1. Create a manifest.json file describing your integration.
  2. Build and test your integration against the sandbox environment.
  3. Submit your manifest for review via the Developer Portal.
  4. Once approved, your integration goes live on the Marketplace.

Approval Process

All integrations go through a review process before being listed:

  1. Submit -- Upload your manifest and integration code via the Developer Portal or the CLI: npx frontdeskos marketplace submit
  2. Automated checks -- The system validates your manifest schema, tests your webhook endpoints, and verifies OAuth flows if applicable.
  3. Manual review -- A FrontDeskOS team member reviews your integration for quality, security, and user experience. This typically takes 2-3 business days.
  4. Approval or feedback -- You receive an email with either an approval confirmation or specific feedback on required changes.
  5. 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

ParameterTypeDescription
namerequiredstringDisplay name for the integration.
slugrequiredstringURL-safe unique identifier (lowercase, hyphens only).
versionrequiredstringSemantic version of the integration.
descriptionrequiredstringShort description (max 160 characters).
authorrequiredobjectAuthor information with name, email, and url.
iconrequiredstringURL to a 256x256 PNG icon.
permissionsrequiredstring[]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.

Search Documentation

Search for pages, tools, and guides