{"id":19883,"date":"2025-10-09T17:05:57","date_gmt":"2025-10-09T17:05:57","guid":{"rendered":"https:\/\/www.ruoomsoftware.com\/?p=19883"},"modified":"2025-10-23T17:13:53","modified_gmt":"2025-10-23T17:13:53","slug":"llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm","status":"publish","type":"post","link":"https:\/\/www.ruoomsoftware.com\/ko\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/","title":{"rendered":"LLM Prompting Experiment: Integrating a  Google Calendar into Ruoom\u2019s CRM"},"content":{"rendered":"<p>AI-coding can get a little crazy.<\/p>\n\n\n\n<p>Vibe coding has taken on a life of its own, and as a company that builds a lot of stuff with human-written code, we have some thoughts.<\/p>\n\n\n\n<p>We think AI is an excellent tool and one that&#8217;s definitely part of the new zeitgeist. That said, we think there\u2019s a difference between using AI to extend human thinking and outsourcing it entirely.<\/p>\n\n\n\n<p>This new series will share our experiments taking our human-written code and building AI-generated code through LLM (Large Language Model) prompting on top of it.<\/p>\n\n\n\n<p><strong>The Goal<\/strong>: to explore how far AI can support real development conditions and to understand where human oversight remains essential for accuracy and reliability.<\/p>\n\n\n\n<p>In these posts, we&#8217;re breaking down the process step by step and sharing what we prompted, what worked, what didn&#8217;t, and how we kept product integrity and performance at the center of it all.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What We Built<\/strong><\/h2>\n\n\n\n<p>In this experiment we integrated a personal google calendar into Ruoom&#8217;s native calendar application.<\/p>\n\n\n\n<p>Since the core open source code of Ruoom is a CRM, this kind of integration tests how flexible the system can be when connecting to external data sources.<\/p>\n\n\n\n<p>Meetings, time blocks, and personal obligations affect availability, but a CRM usually has no visibility into that. By syncing a Google Calendar, the system can reference a more complete view of time before creating events or assigning tasks, which is especially useful if the feature is being built for a small business or freelancer.<\/p>\n\n\n\n<p>From a developer\u2019s perspective, aside from creating something your client would definitely find useful, building this integration is a practical exercise in interoperability. Many client projects will require connecting to existing ecosystems\u2014Google Workspace, Microsoft, Notion, Slack, etc.\u2014rather than reinventing them. Syncing calendars is a way to test how your CRM handles external APIs, authentication flows, and data normalization when the source of truth lives somewhere else.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>What You&#8217;ll Need<\/strong><\/strong><\/h2>\n\n\n\n<p>If you plan to follow what we did as you go through this blog, here are the tools you&#8217;ll need:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Our core open source code. It&#8217;s <strong>\ubb34\ub8cc<\/strong> and you can download it <a href=\"https:\/\/github.com\/Ruoom\/ruoom-core\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/li>\n\n\n\n<li>Python, Django, PostgreSQL, and the other code dependencies. We provide a tutorial for our basic install <a href=\"https:\/\/youtu.be\/BqPwiajnBf0?si=mKgvBBGpVrgjn0Y6\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/li>\n\n\n\n<li><a href=\"https:\/\/windsurf.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">The Windsurf editor<\/a>.<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to Install and Run Our Core Code<\/strong><\/h2>\n\n\n\n<p>As a pre-requisite to vibe-coding on top of our core code, you should get our core code up and running. We provide an introduction to Django using our core code as an example <a href=\"https:\/\/youtu.be\/BqPwiajnBf0?si=mKgvBBGpVrgjn0Y6\">in this YouTube video<\/a>. In the video, we outline cloning our repository, building a PostgreSQL database for the application, and starting the application for the first time.<\/p>\n\n\n\n<p>You\u2019re ready for the next step when you can see the home page in a browser window.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1024x590.png\" alt=\"\" class=\"wp-image-19885\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1024x590.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-300x173.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-768x443.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1536x885.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-18x10.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Open the AI-driven development tool<\/strong><\/strong><\/h2>\n\n\n\n<p>Once you\u2019ve downloaded Windsurf or a similar AI-driven development tool, open the parent folder of the code:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"612\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1-1024x612.png\" alt=\"\" class=\"wp-image-19886\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1-1024x612.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1-300x179.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1-768x459.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1-1536x918.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1-18x12.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-1.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>You\u2019ll want to configure it with the LLM you\u2019d like to use.&nbsp;<\/p>\n\n\n\n<p>For this blog, we used GPT-5 (low reasoning). Some models can be more or less expensive to use, per token. One reason we like Windsurf is because their subscription model includes a bundle of tokens each month to use against various models, and we\u2019ve never had to re-fill our token balance during a heavy session.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"293\" height=\"368\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-2.png\" alt=\"\" class=\"wp-image-19887\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-2.png 293w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-2-239x300.png 239w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-2-10x12.png 10w\" sizes=\"auto, (max-width: 293px) 100vw, 293px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Let\u2019s Begin By Defining the Feature Request<\/strong><\/h2>\n\n\n\n<p>Any time you are building a product, you must start with a well-defined scope and set of requirements.<br><br>Our objective is to evaluate LLM prompting (\u201cvibe coding\u201d) for its ability to build a feature on its own with minimal guidance. For this task, we will ask the LLM to integrate a personal Google Calendar into our application\u2019s native calendar page.<\/p>\n\n\n\n<p>The base Ruoom CRM includes a blank calendar designed to be extended through plugins or custom development.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"589\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-3-1024x589.png\" alt=\"\" class=\"wp-image-19888\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-3-1024x589.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-3-300x173.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-3-768x442.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-3-1536x883.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-3-18x10.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-3.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>For a Google Calendar integration, we will define the following scope:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The user must be able to connect their personal Google Calendar account<\/li>\n\n\n\n<li>The \u201cSchedule\u201d page in our application must display the user\u2019s Google Calendar events (no need to publish events back to Google Calendar)<br><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Understanding the nature of the problem<\/strong><\/h2>\n\n\n\n<p>The scope is simple, but it\u2019s important to understand the complexity of what we are asking the LLM to do. For instance, is it going to navigate authentication with Google? We believe it\u2019s important to always have an understanding of what the LLM is building while you vibe-code. For this reason, the very first prompt is a request to understand the scope of the challenge:<\/p>\n\n\n\n<p><strong>Prompt:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>I have a calendar page in my app, displayed within schedule.html. I want to populate this calendar with events that are in my personal Google calendar. What steps would I take to import &amp; sync my Google calendar into the calendar of my app?<\/em><\/p>\n<\/blockquote>\n\n\n\n<p><strong>Response<\/strong>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>To pull personal Google Calendar events (private), use OAuth on the backend and expose a JSON endpoint that your FullCalendar page can call.<\/p>\n\n\n\n<p>Below are two approaches. Option A is quick if your calendar is public; Option B is the robust solution for private\/personal calendars.<\/p>\n\n\n\n<p><strong>Option A (fast, public calendar only)<\/strong><\/p>\n\n\n\n<p>Use ICS feed: In Google Calendar, make the calendar public and copy the \u201cSecret address in iCal format\u201d. Add it as an event source in FullCalendar (FullCalendar can ingest ICS if you parse it on the server, or via a 3rd-party ICS converter endpoint you control).<\/p>\n\n\n\n<p>If you need private access, use Option B.<\/p>\n\n\n\n<p><strong>Option B (recommended: OAuth2, private read)<\/strong><\/p>\n\n\n\n<p><strong><em>1) Google Cloud setup<\/em><\/strong><\/p>\n\n\n\n<p>Create project in Google Cloud Console.<\/p>\n\n\n\n<p>Enable API: \u201cGoogle Calendar API\u201d.<\/p>\n\n\n\n<p>OAuth consent screen: External, add scope https:\/\/www.googleapis.com\/auth\/calendar.readonly.<\/p>\n\n\n\n<p>Create OAuth client: Type \u201cWeb application\u201d.<\/p>\n\n\n\n<p>Authorized redirect URI: e.g. https:\/\/your-domain.com\/google\/oauth\/callback (and your local dev URL).<\/p>\n\n\n\n<p>Capture Client ID and Client Secret.<br><br><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-custom-mellow-melon-color\">Note: We\u2019ll explain this in the next section.<\/mark><\/strong><\/p>\n\n\n\n<p><strong><em>2) Add dependencies<\/em><\/strong><\/p>\n\n\n\n<p>\u2026&nbsp;<\/p>\n\n\n\n<p>(<strong>Author\u2019s Note<\/strong>: we\u2019ll use \u201c&#8230;\u201d to indicate where the LLM provided instructions, but we haven\u2019t included them in this blog. <a href=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Prompt-Script-Google-Calendar-Integration.zip\">To download the full transcript you can do so here<\/a>.)<\/p>\n\n\n\n<p><strong><em>3) Store user credentials<\/em><\/strong><\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p><strong><em>4) OAuth endpoints for Google Cloud<\/em><\/strong><\/p>\n\n\n\n<p>URLs:<\/p>\n\n\n\n<p>GET \/google\/oauth\/start \u2014 starts the OAuth flow.<\/p>\n\n\n\n<p>GET \/google\/oauth\/callback \u2014 receives code, exchanges for tokens, stores credentials on request.user.profile.<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p><strong><em>5) Backend events endpoint for FullCalendar<\/em><\/strong><\/p>\n\n\n\n<p>Endpoint: GET \/administration\/schedule\/google-events<\/p>\n\n\n\n<p>Logic: \u2026<\/p>\n\n\n\n<p>Response: JSON list of events in FullCalendar\u2019s format.<\/p>\n\n\n\n<p><strong><em>6) Frontend changes in schedule.js<\/em><\/strong><\/p>\n\n\n\n<p>Keep your existing events_list for internal items.<\/p>\n\n\n\n<p>Add an additional event source that points to your new endpoint.<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>This preserves internal events and overlays Google events.<\/p>\n\n\n\n<p><strong><em>7) UI\/UX on schedule.html<\/em><\/strong><\/p>\n\n\n\n<p>Connect\/Disconnect button:<\/p>\n\n\n\n<p>If profile.google_sync_enabled is false, show \u201cConnect Google Calendar\u201d button linking to \/google\/oauth\/start.<\/p>\n\n\n\n<p>If connected, show status and a \u201cDisconnect\u201d action (clears stored credentials).<\/p>\n\n\n\n<p>Optional filter toggle to show\/hide Google events.<\/p>\n\n\n\n<p><strong><em>8) Edge cases and testing<\/em><\/strong><\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>[End Response]<\/p>\n<\/blockquote>\n\n\n\n<p>Ok, so we have a good understanding of what the LLM is intending to build.<\/p>\n\n\n\n<p>However, we have a few concerns about whether it\u2019ll truly be able to authenticate with a personal Google Calendar.<\/p>\n\n\n\n<p>What if Google requires my app to be running on an internet-facing HTTPS connection instead of my local development server? Let\u2019s investigate:<\/p>\n\n\n\n<p><strong>Prompt:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>Earlier, you had specified that I create my Google Clout OAuth app, and in doing so to add &#8220;Authorized redirect URI: e.g. https:\/\/your-domain.com\/google\/oauth\/callback (and your local dev URL).&#8221; I am going to be testing this locally with url localhost. Is this going to be an issue? Does this need to be running in the cloud for it to work?<\/em><\/p>\n<\/blockquote>\n\n\n\n<p><strong>Response:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>No, it doesn\u2019t need to run in the cloud. You can develop and test entirely on localhost.<\/p>\n\n\n\n<p>Google allows http for localhost. However, your Django settings prevent cookies from being set over plain HTTP, which can break login\/OAuth on localhost.<\/p>\n\n\n\n<p>You have two options:<\/p>\n\n\n\n<p>Run HTTPS locally using django-sslserver&nbsp;<\/p>\n\n\n\n<p>Or&nbsp;<\/p>\n\n\n\n<p>Temporarily set SESSION_COOKIE_SECURE = False and CSRF_COOKIE_SECURE = False for local development only.<\/p>\n\n\n\n<p>[End Response]<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\"><\/h3>\n\n\n\n<p><strong>We\u2019re going to go with the second option, and we\u2019ll tell it so in the response<\/strong><br><br>To begin, we will need to build the Google Cloud app while the LLM adapts the codebase. A fair(ish) way to divide the work, we\u2019d say. Sometimes the LLM needs quite a bit of time to code and that\u2019ll give us time to work. The next prompt:<\/p>\n\n\n\n<p><strong>Prompt:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>Great! Now I understand. We will do Option B with a private calendar, and I will create the Oauth app. Can you go ahead and make all of the project file edits required to build this feature?<\/em><\/p>\n<\/blockquote>\n\n\n\n<p><strong>Response:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>I will update multiple parts of your Django project to implement Google Calendar OAuth and event syncing:<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>Changes implemented:<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>What you still need to configure:<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>How to apply and test:<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>Notes and considerations:<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>[End Response]<\/p>\n<\/blockquote>\n\n\n\n<p>At this point, the LLM has made all the changes it thinks it needs to make. But before you test, you\u2019ll need to configure the Google Cloud OAuth app to enable access to our calendar.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Configuring Google Cloud<\/strong><\/h2>\n\n\n\n<p>As the LLM said earlier, we\u2019ll need to enable and configure the Google Calendar API in Google Cloud. First, create a new app within the Google Cloud console:<\/p>\n\n\n\n<p>First, create a new app within the Google Cloud console:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.47.08\u202fAM-1024x509.png\" alt=\"\" class=\"wp-image-19889\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.47.08\u202fAM-1024x509.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.47.08\u202fAM-300x149.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.47.08\u202fAM-768x381.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.47.08\u202fAM-18x9.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.47.08\u202fAM.png 1047w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<p>Next, enable the Google Calendar API:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"234\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-4-1024x234.png\" alt=\"\" class=\"wp-image-19890\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-4-1024x234.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-4-300x69.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-4-768x176.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-4-1536x351.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-4-18x4.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-4.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Then, configure OAuth to be External:<br><br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-custom-mellow-melon-color\"><strong>Note: For this exercise, you\u2019ll have to use the \u201cTest Mode\u201d in Google Cloud to avoid going through Google\u2019s external app review process. Simply provide the target Google Calendar account as the designated test account.<\/strong><\/mark><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"255\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-5-1024x255.png\" alt=\"\" class=\"wp-image-19891\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-5-1024x255.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-5-300x75.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-5-768x192.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-5-1536x383.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-5-18x4.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-5.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Next, you&#8217;ll need to add Scope \u201chttps:\/\/www.googleapis.com\/auth\/calendar.readonly\u201d to OAuth&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"277\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-6-1024x277.png\" alt=\"\" class=\"wp-image-19892\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-6-1024x277.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-6-300x81.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-6-768x208.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-6-1536x416.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-6-18x5.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-6.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Then create the OAuth client as \u201cWeb Application\u201d&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"244\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-7-1024x244.png\" alt=\"\" class=\"wp-image-19893\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-7-1024x244.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-7-300x71.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-7-768x183.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-7-1536x366.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-7-18x4.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-7.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>And then configure the JavaScript origin (http:\/\/localhost:8000) and redirect URI (http:\/\/localhost:8000\/administration\/google\/oauth\/callback) in the client:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"721\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-8-1024x721.png\" alt=\"\" class=\"wp-image-19894\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-8-1024x721.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-8-300x211.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-8-768x541.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-8-1536x1082.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-8-18x12.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-8.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>That\u2019s everything the LLM told us to do.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testing the Changes<\/strong><\/h2>\n\n\n\n<p>Now it\u2019s time to test the changes the LLM made to the app.<br><br>First, run a Django migration to update the database with the new properties added by the LLM:<\/p>\n\n\n\n<p><code><em>python <\/em><a href=\"http:\/\/manage.py\"><em>manage.py<\/em><\/a><em> migrate<\/em><br><\/code><br>Then restart the server and navigate back to the Schedule page and you should see this:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"774\" height=\"454\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.57.39\u202fAM.png\" alt=\"\" class=\"wp-image-19896\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.57.39\u202fAM.png 774w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.57.39\u202fAM-300x176.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.57.39\u202fAM-768x450.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-10.57.39\u202fAM-18x12.png 18w\" sizes=\"auto, (max-width: 774px) 100vw, 774px\" \/><\/figure>\n\n\n\n<p>You should notice a new button at the top which the LLM has added for us to connect the Google Calendar.&nbsp;<\/p>\n\n\n\n<p>Click the button and\u2026<\/p>\n\n\n\n<p>\u2026 no change. <\/p>\n\n\n\n<p>Did we fail? Let\u2019s ask the LLM what\u2019s happening:<\/p>\n\n\n\n<p><strong>Prompt<\/strong>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>This is great, and the button appears as desired. However, I don&#8217;t think we have correctly connected ourselves to my new Google Cloud app. Where do I go to configure this connection?<\/em><\/p>\n<\/blockquote>\n\n\n\n<p><strong>Response:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Here\u2019s exactly where and how to configure your Google Cloud connection.<\/p>\n\n\n\n<p><strong>Where to configure:<\/strong><\/p>\n\n\n\n<p><strong><em>[Google Cloud Console]<\/em><\/strong><\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p><strong><em>[Project settings file]&nbsp;<\/em><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In ruoom\/settings.py\n<ul class=\"wp-block-list\">\n<li>Find GOOGLE_OAUTH_CLIENT_CONFIG.<\/li>\n\n\n\n<li>Replace placeholders:<\/li>\n\n\n\n<li>&#8220;client_id&#8221;: &#8220;YOUR_CLIENT_ID&#8221;<\/li>\n\n\n\n<li>&#8220;client_secret&#8221;: &#8220;YOUR_CLIENT_SECRET&#8221;<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Optional: Use environment variables instead of hardcoding\n<ul class=\"wp-block-list\">\n<li>$env:GOOGLE_CLIENT_ID=&#8221;&#8230;&#8221;; $env:GOOGLE_CLIENT_SECRET=&#8221;&#8230;&#8221;;<\/li>\n\n\n\n<li>We already read these in ruoom\/settings.py<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong><em>After configuring<\/em><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Restart the Django server.<\/li>\n\n\n\n<li>Go to \/administration\/schedule\/.<\/li>\n\n\n\n<li>Click \u201cConnect Google Calendar.\u201d&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>[End Response]<\/p>\n<\/blockquote>\n\n\n\n<p>Okay, so it looks like we never actually configured the Google Cloud API keys in the Django App. Human Error. That\u2019s one win for the machine.<br><br><strong>One thing we\u2019ll go over in another blog is evaluating how we can use LLM prompting to better handle errors like this one. We would want the application to tell us that there were no API credentials configured.<\/strong><\/p>\n\n\n\n<p>Anyway, after configuring the API keys, we again click&nbsp; \u201cConnect Google Calendar\u201d. If the OAuth app is configured correctly, you are taken to the Google Authentication page:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"743\" height=\"405\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.01.28\u202fAM.png\" alt=\"\" class=\"wp-image-19897\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.01.28\u202fAM.png 743w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.01.28\u202fAM-300x164.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.01.28\u202fAM-18x10.png 18w\" sizes=\"auto, (max-width: 743px) 100vw, 743px\" \/><\/figure>\n\n\n\n<p><br>Click \u201cAllow\u201d.<\/p>\n\n\n\n<p>We should automatically be taken back to the Schedule page.<\/p>\n\n\n\n<p>What do we see?<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"589\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-10-1024x589.png\" alt=\"\" class=\"wp-image-19898\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-10-1024x589.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-10-300x173.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-10-768x442.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-10-1536x883.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-10-18x10.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-10.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Still nothing.<\/p>\n\n\n\n<p>One point against the machine and we\u2019re now tied. Let\u2019s figure this out by going back and forth with the LLM:<\/p>\n\n\n\n<p><strong>Prompt:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>It looks like google_sync_enabled is not being set to true, so the button never says &#8220;Google Calendar Connected&#8221;<\/em><\/p>\n<\/blockquote>\n\n\n\n<p><strong>Response<\/strong>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>&nbsp;<\/strong>I\u2019ve hardened the OAuth handlers so the \u201cConnected\u201d badge should now reflect correctly.<\/p>\n\n\n\n<p>What I changed<\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>[End Response]<\/p>\n<\/blockquote>\n\n\n\n<p>Frustratingly, it still doesn\u2019t work. <\/p>\n\n\n\n<p>The machine is losing now, with 2 mistakes to our 1.<\/p>\n\n\n\n<p><strong>Prompt:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>I get the error at gcal.py line 90: oauthlib.oauth2.rfc6749.errors.InsecureTransportError: (insecure_transport) OAuth 2 MUST utilize https.<\/em><\/p>\n<\/blockquote>\n\n\n\n<p><strong>Response:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>You\u2019re hitting oauthlib\u2019s HTTPS requirement for OAuth. Two ways to fix it locally:<\/p>\n\n\n\n<p><strong>Recommended options<\/strong><\/p>\n\n\n\n<p><strong><em>Option A (quickest): allow HTTP in dev<\/em><\/strong><\/p>\n\n\n\n<p>Set an env var before running the server:<\/p>\n\n\n\n<p>PowerShell (current session):<\/p>\n\n\n\n<p>$env:OAUTHLIB_INSECURE_TRANSPORT = &#8220;1&#8221;<\/p>\n\n\n\n<p><strong><em>Option B (more \u201cproper\u201d): run HTTPS locally<\/em><\/strong><\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p>[End Response]<\/p>\n<\/blockquote>\n\n\n\n<p>Okay, so it wasn\u2019t a code error but another configuration error. 2-2, tie game.<\/p>\n\n\n\n<p>No we\u2019ll run the PowerShell command it suggests to tell our server to allow insecure HTTP endpoints, before attempting another \u201cConnect Google Calendar\u201d:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"712\" height=\"391\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.11.16\u202fAM.png\" alt=\"\" class=\"wp-image-19899\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.11.16\u202fAM.png 712w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.11.16\u202fAM-300x165.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-09-at-11.11.16\u202fAM-18x10.png 18w\" sizes=\"auto, (max-width: 712px) 100vw, 712px\" \/><\/figure>\n\n\n\n<p>Holy $h!t!<\/p>\n\n\n\n<p>In all honesty, we didn\u2019t expect it to work on the first (or really fourth) try.<\/p>\n\n\n\n<p>Despite the configuration issues that were really our own fault, the LLM created a working feature by seamlessly integrating into our existing human-built application. That impressed us, but with one big caveat:<\/p>\n\n\n\n<p><strong>At this stage we have done no review of the code to make sure it conforms to our conventions and standards within the project, or is able to handle edge cases or failures.<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">An why would we care about doing this?<\/h2>\n\n\n\n<p>It seems simple to ask an LLM to build out all the features you want in your project. However, without a human guiding the design conventions and central architecture, it\u2019s easy for your project to become a mess of spaghetti code as each feature is added on top of the last one. Your application will start to fail as features clash and the LLM is unlikely to build a comprehensive test suite.<\/p>\n\n\n\n<p>We found this to be a common issue online, as summarized by Reddit user u\/Sad_Impact9312:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"928\" height=\"212\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-11.png\" alt=\"\" class=\"wp-image-19900\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-11.png 928w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-11-300x69.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-11-768x175.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-11-18x4.png 18w\" sizes=\"auto, (max-width: 928px) 100vw, 928px\" \/><\/figure>\n\n\n\n<p>So in the next blog, we\u2019ll review the AI-generated code we just built into this project. See you in the next one.<\/p>","protected":false},"excerpt":{"rendered":"<p>A step-by-step LLM prompting experiment using Ruoom\u2019s human-written open source CRM code to build a Google Calendar integration.<\/p>","protected":false},"author":5,"featured_media":20006,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-19883","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM | Ruoom<\/title>\n<meta name=\"description\" content=\"LLM prompting experiment: integrating Google Calendar into Ruoom\u2019s open source CRM and testing how human oversight keeps code reliable.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ruoomsoftware.com\/ko\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM | Ruoom\" \/>\n<meta property=\"og:description\" content=\"LLM prompting experiment: integrating Google Calendar into Ruoom\u2019s open source CRM and testing how human oversight keeps code reliable.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ruoomsoftware.com\/ko\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruoom\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ruoomsoftware\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-09T17:05:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-23T17:13:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"455\" \/>\n\t<meta property=\"og:image:height\" content=\"504\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kevin Morrissey\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\"},\"author\":{\"name\":\"Kevin Morrissey\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731\"},\"headline\":\"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM\",\"datePublished\":\"2025-10-09T17:05:57+00:00\",\"dateModified\":\"2025-10-23T17:13:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\"},\"wordCount\":2403,\"publisher\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png\",\"articleSection\":[\"Software\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\",\"url\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\",\"name\":\"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM | Ruoom\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png\",\"datePublished\":\"2025-10-09T17:05:57+00:00\",\"dateModified\":\"2025-10-23T17:13:53+00:00\",\"description\":\"LLM prompting experiment: integrating Google Calendar into Ruoom\u2019s open source CRM and testing how human oversight keeps code reliable.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage\",\"url\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png\",\"contentUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png\",\"width\":455,\"height\":504},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.ruoomsoftware.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#website\",\"url\":\"https:\/\/www.ruoomsoftware.com\/\",\"name\":\"Ruoom\",\"description\":\"Designed to fit how your small business works.\",\"publisher\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#organization\"},\"alternateName\":\"Ruoom\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.ruoomsoftware.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#organization\",\"name\":\"Ruoom\",\"alternateName\":\"Ruoom\",\"url\":\"https:\/\/www.ruoomsoftware.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg\",\"contentUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg\",\"width\":150,\"height\":122,\"caption\":\"Ruoom\"},\"image\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/ruoomsoftware\",\"https:\/\/www.instagram.com\/ruoomsoftware\/\",\"https:\/\/www.youtube.com\/channel\/UC5LVZyGRCNlQEqQEItCYb3Q\",\"https:\/\/www.linkedin.com\/company\/ruoom-inc\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731\",\"name\":\"Kevin Morrissey\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g\",\"caption\":\"Kevin Morrissey\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM | Ruoom","description":"LLM prompting experiment: integrating Google Calendar into Ruoom\u2019s open source CRM and testing how human oversight keeps code reliable.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ruoomsoftware.com\/ko\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/","og_locale":"ko_KR","og_type":"article","og_title":"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM | Ruoom","og_description":"LLM prompting experiment: integrating Google Calendar into Ruoom\u2019s open source CRM and testing how human oversight keeps code reliable.","og_url":"https:\/\/www.ruoomsoftware.com\/ko\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/","og_site_name":"Ruoom","article_publisher":"https:\/\/www.facebook.com\/ruoomsoftware","article_published_time":"2025-10-09T17:05:57+00:00","article_modified_time":"2025-10-23T17:13:53+00:00","og_image":[{"width":455,"height":504,"url":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png","type":"image\/png"}],"author":"Kevin Morrissey","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#article","isPartOf":{"@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/"},"author":{"name":"Kevin Morrissey","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731"},"headline":"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM","datePublished":"2025-10-09T17:05:57+00:00","dateModified":"2025-10-23T17:13:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/"},"wordCount":2403,"publisher":{"@id":"https:\/\/www.ruoomsoftware.com\/#organization"},"image":{"@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png","articleSection":["Software"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/","url":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/","name":"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM | Ruoom","isPartOf":{"@id":"https:\/\/www.ruoomsoftware.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage"},"image":{"@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png","datePublished":"2025-10-09T17:05:57+00:00","dateModified":"2025-10-23T17:13:53+00:00","description":"LLM prompting experiment: integrating Google Calendar into Ruoom\u2019s open source CRM and testing how human oversight keeps code reliable.","breadcrumb":{"@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#primaryimage","url":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png","contentUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.07.40\u202fPM.png","width":455,"height":504},{"@type":"BreadcrumbList","@id":"https:\/\/www.ruoomsoftware.com\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ruoomsoftware.com\/"},{"@type":"ListItem","position":2,"name":"LLM Prompting Experiment: Integrating a Google Calendar into Ruoom\u2019s CRM"}]},{"@type":"WebSite","@id":"https:\/\/www.ruoomsoftware.com\/#website","url":"https:\/\/www.ruoomsoftware.com\/","name":"Ruoom","description":"Designed to fit how your small business works.","publisher":{"@id":"https:\/\/www.ruoomsoftware.com\/#organization"},"alternateName":"Ruoom","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ruoomsoftware.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.ruoomsoftware.com\/#organization","name":"Ruoom","alternateName":"Ruoom","url":"https:\/\/www.ruoomsoftware.com\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg","contentUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg","width":150,"height":122,"caption":"Ruoom"},"image":{"@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ruoomsoftware","https:\/\/www.instagram.com\/ruoomsoftware\/","https:\/\/www.youtube.com\/channel\/UC5LVZyGRCNlQEqQEItCYb3Q","https:\/\/www.linkedin.com\/company\/ruoom-inc\/"]},{"@type":"Person","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731","name":"Kevin Morrissey","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g","caption":"Kevin Morrissey"}}]}},"_links":{"self":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts\/19883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/comments?post=19883"}],"version-history":[{"count":5,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts\/19883\/revisions"}],"predecessor-version":[{"id":20007,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts\/19883\/revisions\/20007"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/media\/20006"}],"wp:attachment":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/media?parent=19883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/categories?post=19883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/tags?post=19883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}