{"id":28816158,"url":"https://github.com/bman46/bookings-workers","last_synced_at":"2026-04-28T23:34:58.863Z","repository":{"id":299541247,"uuid":"1001815837","full_name":"bman46/bookings-workers","owner":"bman46","description":"Microsoft 365 Bookings Web Components Widget, run on CloudFlare Workers","archived":false,"fork":false,"pushed_at":"2025-06-17T03:56:51.000Z","size":618,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-17T04:25:39.033Z","etag":null,"topics":["azure","azure-ad","bookings","cloudflare","cloudflare-workers","entra","lit","microsoft","microsoft-365","microsoft-bookings","office","office365","web-components","workers"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bman46.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-14T04:58:03.000Z","updated_at":"2025-06-17T04:07:28.000Z","dependencies_parsed_at":"2025-06-17T04:35:59.058Z","dependency_job_id":null,"html_url":"https://github.com/bman46/bookings-workers","commit_stats":null,"previous_names":["bman46/bookings-workers"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bman46/bookings-workers","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bman46%2Fbookings-workers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bman46%2Fbookings-workers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bman46%2Fbookings-workers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bman46%2Fbookings-workers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bman46","download_url":"https://codeload.github.com/bman46/bookings-workers/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bman46%2Fbookings-workers/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268625009,"owners_count":24280188,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-03T02:00:12.545Z","response_time":2577,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["azure","azure-ad","bookings","cloudflare","cloudflare-workers","entra","lit","microsoft","microsoft-365","microsoft-bookings","office","office365","web-components","workers"],"created_at":"2025-06-18T17:02:30.320Z","updated_at":"2026-04-28T23:34:58.807Z","avatar_url":"https://github.com/bman46.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Microsoft Bookings Widget\n\n[![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/bman46/bookings-workers.git)\n\nThis project provides a custom frontend and backend integration for Microsoft 365 Bookings. It enables a modern, user-friendly booking experience while leveraging Microsoft Bookings as the backend. The backend is OpenAPI-compliant, making it easy to integrate with the frontend and other systems. The frontend is built as a widget using LitElement web components, and the backend exposes endpoints for business info, services, staff availability, and appointment creation.\n\n## Get started\n\n1. Sign up for [Cloudflare Workers](https://workers.dev). The free tier is more than enough for most use cases.\n2. Create an [Azure EntraID app](#Azure-EntraID-Configuration).\n3. Continue to either the [Development](#Development) or [Deployment](#Deployment) instructions.\n\n## Development\n\n1. Clone this project and install dependencies with `npm install`\n2. Set the needed env vars in a file named `.dev.vars`\n```\nTENANT_ID=[Directory (tenant) ID]\nCLIENT_ID=[Application (client) ID]\nCLIENT_SECRET=[Client secret value]\n```\n3. Update [index.html](dist/index.html) with information about your booking page.\n4. Run `wrangler dev` to start a local instance of the API.\n5. Open `http://localhost:8787/docs` in your browser to see the Swagger interface where you can try the endpoints.\n6. Changes made in the `src/` folder will automatically trigger the server to reload, you only need to refresh the Swagger interface.\n\n## Deployment\n\n1. Sign up for [Cloudflare Workers](https://workers.dev). The free tier is more than enough for most use cases.\n2. Deploy to CloudFlare: [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/bman46/bookings-workers.git)\n3. On the deploy screen, under `Advanced settings \u003e Build variables` add the following variables. Click the encrypt button for `CLIENT_SECRET`:\n```\nTENANT_ID=[Directory (tenant) ID]\nCLIENT_ID=[Application (client) ID]\nCLIENT_SECRET=[Client secret value]\nALLOWED_ORIGINS=[Domain/subdomain that can use this widget],[another (optional) domain/subdomain that can use this widget]\n```\n\n\u003e [!TIP]\n\u003e If you already deployed the app, you can add this using the [Cloudflare Dashboard](https://developers.cloudflare.com/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard).\n\n4. Embed the widget into your website. Example:\n```html\n\u003c!DOCTYPE html\u003e\n\u003chead\u003e\n  \u003cscript type=\"module\" src=\"(your worker domain)/index.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003cbooking-card api-url=\"(your worker domain)\" bookings-id=\"MyBookingsPage@Contoso.com\" service-displayName=\"My Service\" icon=\"🔧\"\u003e\u003c/booking-card\u003e\n\u003c/body\u003e\n```\n\n## Azure EntraID Configuration\n\n1. Sign in to the [Microsoft Entra admin center](https://entra.microsoft.com/) as at least an [Application Developer](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference#application-developer).\n\n2. If you have access to multiple tenants, use the Settings icon  in the top menu to switch to the tenant in which you want to register the application.\n\n3. Browse to `Entra ID \u003e App registrations` and select `New registration`.\n\n4. Enter a meaningful name for the app, for example `booking-widget`.\n\n5. Select `Accounts in this organizational directory only (John McShane Auto Body only - Single tenant)` for `Supported account types`\n\n6. Click `Register`\n\n7. On the app `Overview` screen, note the `Application (client) ID` and `Directory (tenant) ID`. These will be used later.\n\n8. Navigate to `Certificates \u0026 secrets \u003e Client secrets` and click `new client secret`. Name it accordingly, click `Add`. Note the value for use later. We will refer to this as the `Client secret value` in future steps\n\n9. Navigate to `API Permissions \u003e Add a permission \u003e Microsoft Graph \u003e Application Permissions`. Assign the following GraphAPI permissions:\n```\nBookings.Read.All\nBookingsAppointment.ReadWrite.All\n```\n\n10. Click `Add Permissions` to set the permissions. Then, click `Grant Admin Consent for [COMPANY]` button to grant the app access to these API endpoints.\n\n9. Return to either the [Development](#Development) or [Deployment](#Deployment) instructions.\n\n## Pictures\n### Time selection\n\u003cimg src=\"docs/images/times.png\" alt=\"Time selection screen\" width=\"300\" /\u003e\n\n### Customer Information\n\u003cimg src=\"docs/images/information.png\" alt=\"Customer information\" width=\"300\" /\u003e\n\n### Confirmation Screen\n\u003cimg src=\"docs/images/confirmation.png\" alt=\"Booking confirmation\" width=\"300\" /\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbman46%2Fbookings-workers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbman46%2Fbookings-workers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbman46%2Fbookings-workers/lists"}