# Salesforce Data Warehouse Best Practices: A Playbook

> Master Salesforce data warehouse architecture with Coffee's expert playbook. Build reliable pipelines, star schemas, and SLAs. Start optimizing today.

**Published:** 2026-09-19 | **Updated:** 2026-10-17 | **Author:** coffee
**URL:** https://www.coffee.ai/articles/best-salesforce-data-warehouse-practices/
**Type:** post

**Categories:** CRM Data Warehouse

![Salesforce Data Warehouse Best Practices: A Playbook](https://www.coffee.ai/articles/wp-content/uploads/sites/10/2026/09/1789729424260-5852b397fd47-1024x572.webp)

---

## Content

*Written by: Doug Camplejohn, CEO & Co-Founder, Coffee*

## Key Takeaways For Salesforce Warehouse Design

- Treat Salesforce extraction as an engineering discipline and separate operational data from warehouse analytics.
- Avoid mirroring Salesforce’s transactional object model in the warehouse.
- Build an immutable raw or bronze layer first and preserve every Salesforce system field.
- Design a star schema with explicit grain definitions so core reports stay reliable.
- Extract OpportunityHistory with current-state records to support forecasting and pipeline analysis.
- Handle deletes with QueryAll and soft-delete logic so historical facts remain accurate.
- Use surrogate keys to prevent multi-org ID collisions and keep fact tables stable.
- Respect Salesforce API limits and monitor key limit metrics during extraction.
- Set freshness SLAs and add observability to catch row-count anomalies, schema drift, and SystemModstamp lag early.
- Coffee improves upstream Salesforce data quality so the warehouse receives accurate, complete records.

[See Coffee’s Salesforce Data Quality Plans](https://www.coffee.ai/pricing?utm_source=ai-growth-agent&utm_term=best-salesforce-data-warehouse-practices)

## 1. Choose The Right Salesforce Extraction Architecture

SystemModstamp is the default incremental watermark for most objects because it captures both user and automation changes. When you need near-real-time event streaming, Change Data Capture fits better than scheduled pulls. For reliable scheduled extraction with delete detection, use the Salesforce REST API Get Updated resource and pair it with a separate QueryAll pass. Full loads make sense only for small, slowly changing reference objects.

The Get Updated resource uses `SystemModstamp` to determine an object’s add or change date and falls back to `LastModifiedDate` if `SystemModstamp` is unavailable. SystemModstamp captures automation-driven updates, such as triggers and workflow rules, that `LastModifiedDate` does not, so it provides broader coverage. The Get Updated resource caps its lookback at 30 days and returns a maximum of 600,000 IDs per call. When you exceed that limit, it returns an `EXCEEDED_ID_LIMIT` error, which you fix by narrowing the start-to-end window.

The three primary extraction APIs and their trade-offs are compared in the table below.

| Extraction Method | Best For | Delete Detection | API Limit Impact |
| --- | --- | --- | --- |
| REST API Get Updated | Scheduled incremental extraction | Yes, via QueryAll | Counts against DailyApiRequests |
| Change Data Capture | Near-real-time event streaming | Yes, via event stream | Counts against DailyDeliveredPlatformEvents |
| Bulk API 2.0 | Large-volume full or incremental loads | No, requires separate QueryAll | Counts against DailyBulkApiBatches and DailyBulkV2QueryJobs |

A watermark-based incremental extraction pattern in SQL looks like this:

```
-- Incremental extraction using SystemModstamp watermark SELECT Id, Name, SystemModstamp, LastModifiedDate, IsDeleted FROM salesforce_raw.opportunity WHERE SystemModstamp > ( SELECT MAX(last_extracted_at) FROM pipeline_state WHERE object = 'Opportunity' ) ORDER BY SystemModstamp ASC;
```

## 2. Build A Raw Or Bronze Immutable Layer First

An immutable raw layer gives you a reliable audit trail and a safe place to rebuild downstream models. When transformation logic changes, you can replay from raw instead of re-querying Salesforce.

Every Salesforce system field must survive extraction intact. The fields that must be preserved are:

- `Id` — the Salesforce record identifier
- `CreatedDate` — when the record was first created
- `LastModifiedDate` — when a user last modified the record
- `SystemModstamp` — when a user or automated process last modified the record
- `IsDeleted` — whether the record has been soft-deleted

`SystemModstamp` and `LastModifiedDate` can diverge. A trigger firing after a user save updates `SystemModstamp` but not `LastModifiedDate`. If you drop `SystemModstamp` from the raw layer, you lose the ability to detect those automation-driven changes in future incremental runs.

The recommended layer architecture is:

```
Salesforce (source) │ ▼ Raw / Bronze Layer ← immutable, untransformed, all system fields preserved │ ▼ Staging Layer ← deduplication, type casting, soft-delete handling │ ▼ Star Schema Marts ← fact_opportunity, dim_account, dim_contact, etc.
```

## 3. Map Salesforce Objects To A Dimensional Model

Mirroring Salesforce’s transactional schema in the warehouse creates slow, fragile analytics. [Salesforce’s object model is normalized for transactional integrity](https://pmsynapse.in/blog/star-schema-fact-dimension-analytics-model) and favors row-level writes, not analytical query performance.

In Salesforce Sales Cloud, a closed deal’s data lives across `Account`, `Contact`, `Opportunity`, and `Opportunity Contact Role`, as shown in Salesforce’s official Sales Cloud data model. Each object stores a different aspect of the deal and joins through foreign keys tuned for transactions. That structure works for operational workflows but becomes awkward for reporting.

The correct mapping is:

- Salesforce `Account` → `dim_account` (SCD Type 2, one row per version)
- Salesforce `Contact` → `dim_contact` (SCD Type 2)
- Salesforce `Opportunity` → `fact_opportunity` (grain defined explicitly, see Section 4)

Copying the operational schema into the warehouse is a known dimensional modeling anti-pattern. ERP and CRM schemas support transactions, while analytical schemas support reporting and forecasting. Exposing the operational model directly produces complex SQL and queries that business users struggle to trust.

## 4. Design A Star Schema With Explicit Grain Definitions

Define what one row in each fact table represents before you write any SQL. For `fact_opportunity`, one row should represent one opportunity at a specific point in its lifecycle.

A practical test is to complete the sentence “one row in this fact table represents…” and stop if the answer is vague. Explicit grain definitions for core Salesforce-derived objects are:

- `fact_opportunity`: one row per opportunity per snapshot date (periodic snapshot) or one row per opportunity stage change (transactional). Use separate tables for each grain.
- `dim_account`: one row per account per version (SCD Type 2) with `effective_date` and `expiry_date` columns
- `dim_contact`: one row per contact per version (SCD Type 2)

A sample fact table DDL with grain declaration:

```
-- GRAIN: one row per opportunity per weekly snapshot date -- SOURCE: Salesforce Opportunity (current state) + OpportunityHistory CREATE TABLE mart.fact_opportunity_snapshot ( snapshot_date DATE NOT NULL, opportunity_key INTEGER NOT NULL, -- surrogate key account_key INTEGER NOT NULL, -- FK to dim_account owner_key INTEGER NOT NULL, -- FK to dim_user stage_name VARCHAR(80), amount NUMERIC(18,2), close_date DATE, is_closed BOOLEAN, is_won BOOLEAN, created_date TIMESTAMP, last_modified_date TIMESTAMP, PRIMARY KEY (snapshot_date, opportunity_key) );
```

Mixing transaction-level and period-level facts in one table produces aggregation errors that usually require a full fact table rebuild.

## 5. Preserve Salesforce Opportunity History For Forecasting

OpportunityHistory is essential for forecasting because it records how deals move through stages over time. Extract `OpportunityHistory` alongside current-state `Opportunity` records so you can reconstruct pipeline velocity, stage duration, and historical conversion rates.

The `OpportunityHistory` fields required for forecasting analytics are:

- `OpportunityId` — links back to the parent Opportunity
- `StageName` — the stage at the time of the history record
- `Amount` — the deal value at that point in time
- `CloseDate` — the projected close date at that point in time
- `CreatedDate` — when this history record was written
- `CreatedById` — which user or process triggered the change

Daily snapshots of open pipeline, with one row per open opportunity per day, unlock trend analysis. You can track pipeline coverage over time, stage duration, and slip rates. Without `OpportunityHistory`, questions about how long deals spent in a given stage last quarter remain unanswerable from the warehouse.

## 6. Handle Deleted Salesforce Records Safely In The Warehouse

QueryAll is required for delete-aware extraction because it returns soft-deleted records. Use QueryAll instead of Query, filter on `IsDeleted`, and implement a soft-delete strategy in the warehouse. Your merge logic must handle `IsDeleted` flipping from `true` to `false` when records are undeleted.

The standard `Query` resource automatically filters out deleted records. `QueryAll` includes them, and the `IsDeleted` field distinguishes deleted from active records in the result set. Salesforce allows records to be undeleted from the Recycle Bin for up to 15 days after deletion. Records may be purged earlier if the Recycle Bin is emptied or its storage limit is reached, and Salesforce does not guarantee the exact time of permanent deletion. That behavior means a record your warehouse marked as deleted can reappear as active. A merge statement that only handles the `true` direction will silently leave a deleted record in the warehouse after an undelete event.

A merge statement that handles both directions of `IsDeleted`:

```
MERGE INTO mart.dim_account AS target USING staging.account_delta AS source ON target.salesforce_id = source.Id WHEN MATCHED AND source.IsDeleted = TRUE THEN UPDATE SET target.is_deleted = TRUE, target.deleted_at = source.SystemModstamp, target.expiry_date = CURRENT_DATE WHEN MATCHED AND source.IsDeleted = FALSE THEN UPDATE SET target.is_deleted = FALSE, target.deleted_at = NULL, target.expiry_date = '9999-12-31' WHEN NOT MATCHED THEN INSERT (salesforce_id, account_name, is_deleted, effective_date, expiry_date) VALUES (source.Id, source.Name, source.IsDeleted, CURRENT_DATE, '9999-12-31');
```

[Check Coffee’s Extraction-Ready CRM Setup](https://www.coffee.ai/pricing?utm_source=ai-growth-agent&utm_term=best-salesforce-data-warehouse-practices)

## 7. Solve Multi-Org ID Collisions With Surrogate Keys

Salesforce record IDs are unique within a single org, but [sandboxes cloned from production can share the same record IDs](https://salesforce.stackexchange.com/questions/438151/are-salesforce-ids-globally-unique) as the source org. Multi-org environments need surrogate keys in the warehouse and a mapping table to keep joins stable.

The surrogate key strategy for multi-org environments:

- Generate a surrogate key as a hash of `org_id || salesforce_id` or use a sequence-generated integer with a mapping table that stores `(org_id, salesforce_id, surrogate_key)`.
- Maintain the mapping table as the authoritative join path between Salesforce IDs and warehouse keys.
- Resolve the same Account or Contact appearing in multiple orgs at the warehouse layer through identity resolution, matching on normalized email domain, company name, or other stable identifiers.

Surrogate keys stay immutable, so source system changes do not ripple through fact tables. They also support SCD Type 2 handling when a natural key points to multiple versions of the same entity over time.

## 8. Manage Salesforce API Limits During Extraction

Extraction jobs compete with every other integration in the org, so schedule them off-peak and monitor `DailyApiRequests` and `DailyBulkApiBatches` through the Salesforce REST API Limits resource. That resource reports both maximum and remaining allocation, accurate within five minutes, which gives you enough warning to throttle before a job fails. Filter sensitive fields at extraction so restricted data never lands in the raw layer.

Key limit interactions to track:

- `DailyApiRequests` is a shared constraint across all org integrations, so warehouse extraction jobs share the same pool as every other REST API call.
- Bulk API and Bulk API 2.0 share the `DailyBulkApiBatches` allocation pool, so heavy extract workloads can exhaust the budget for other bulk operations.
- Bulk API 2.0 query jobs are constrained by `DailyBulkV2QueryJobs` and `DailyBulkV2QueryFileStorageMB`.
- Change Data Capture via CometD or Pub/Sub API counts against `DailyDeliveredPlatformEvents`, which does not apply to Apex triggers or flows.

Field-level security is a silent failure mode. If the integration user lacks field-level access to `SystemModstamp`, explicit field requests return a 400 error. In relationship traversal responses, the field is simply absent. Verify field-level access for all system fields, including `SystemModstamp`, `IsDeleted`, and `CreatedDate`, before go-live and after any Salesforce permission set change.

## 9. Use Salesforce Data 360 And Your Warehouse Together

Data 360 focuses on activation and real-time customer experiences, while an external warehouse focuses on deep analysis and cross-functional reporting. Most mature teams combine both platforms so insights flow into activation.

Data 360’s Zero Copy Data Federation lets Data 360 query data in Snowflake, Databricks, or BigQuery at read time without copying it into the Data 360 lake. Supported capabilities with zero-copy federation include identity resolution, segmentation, activation, batch data transforms, and batch Calculated Insights. Capabilities not supported with zero-copy include near real-time identity resolution, streaming data transforms, rapid segmentation and activation, and schema changes such as field renames in the source table.

For a deeper platform comparison, see *Salesforce Data Cloud Vs Snowflake: When To Use Both* and *CRM Data Warehouse Architecture: A Practical Blueprint* for the broader architectural pattern.

## 10. Set Freshness SLAs And Add Pipeline Observability

Freshness expectations should be explicit before go-live so teams know when data is considered late. A green dbt run only confirms that the SQL executed without error. A star schema reaches production readiness when the team can detect, explain, and contain drift in production.

Silent failure detection requires active monitoring across three dimensions:

- **Row count anomalies:** compare source row counts to warehouse row counts after every extraction run. The fact table should never exceed the source count for any given object and time window.
- **Schema drift:** alert when a Salesforce field is renamed, removed, or recast. Without alerts, downstream transformation logic keeps running on wrong assumptions until someone notices a broken dashboard.
- **SystemModstamp lag:** monitor the gap between `MAX(SystemModstamp)` in the raw layer and the current timestamp. A widening gap indicates the extraction job is silently failing or falling behind.

Unexpected null rates in key fields, such as `Amount` on open opportunities, `CloseDate` on pipeline records, or `AccountId` on contacts, signal that source data quality has degraded upstream of the warehouse. These checks belong in the pipeline as continuous monitors rather than in a quarterly data audit.

## Why Salesforce Source Data Quality Still Limits The Pipeline

Every practice in this playbook assumes the data entering Salesforce is worth extracting. [Seventy-six percent of organizations report that less than half of their CRM data is accurate and complete](https://pixelwand.io/blog/crm-data-quality-guide). [A 2021 Plauti analysis of more than 12 billion Salesforce records found that 45% of all new records entered that year were duplicates](https://datamagnet.co/post/duplicate-record-detection-matching-algorithms-explained). A warehouse pipeline built on that source data inherits every duplicate, missing field, and stale record, and downstream transformation logic cannot repair problems that originate upstream.

Coffee’s Companion App for Salesforce addresses the data-in problem directly. The Coffee Agent auto-creates contacts and companies from emails and calendar events, enriches records with job titles and firmographic data, logs activities automatically, and captures meeting notes and summaries. As a result, the Salesforce records the warehouse extracts reflect what actually happened in the sales process. Coffee also operates as a Standalone AI-First CRM for teams not on Salesforce. Both deployments are SOC 2 Type 2 and GDPR compliant, and data is not used to train public models.

Good data out of the warehouse requires good data into Salesforce. The extraction architecture, schema design, and observability practices in this playbook handle the analytical layer. Coffee strengthens the source layer so analytics teams can trust their inputs.

[Explore Coffee For Salesforce And AI CRM](https://www.coffee.ai/pricing?utm_source=ai-growth-agent&utm_term=best-salesforce-data-warehouse-practices)

## Frequently Asked Questions

### What Is The Difference Between SystemModstamp And LastModifiedDate For Salesforce Extraction?

LastModifiedDate reflects the date and time a record was last modified by a human user. SystemModstamp reflects the date and time a record was last modified by a user or by an automated process, such as a trigger, workflow rule, or process builder action. As covered in Section 1, SystemModstamp is the broader-coverage watermark because it captures automation-driven updates.

### Why Should You Avoid Mirroring Salesforce’s Object Model In The Warehouse?

[Salesforce’s schema is normalized for transactional integrity](https://pmsynapse.in/blog/star-schema-fact-dimension-analytics-model) and spreads one business fact across many joined tables. Section 3 covers why this structure fails for analytics. The short version: analytical queries become slow and complex when they must traverse many normalized tables for each question.

### How Do You Prevent Deleted Salesforce Records From Corrupting Warehouse Data?

As Section 6 explains, QueryAll is required because the standard Query resource filters out deleted records. The warehouse soft-delete strategy described there also handles undeletes. The extra detail to remember is that the Recycle Bin has a storage cap of 25 times the org’s data storage, and in Salesforce Classic the retention can extend to 30 days, so purge timing varies by org usage.

### What Is The Correct Grain For A Salesforce Opportunity Fact Table?

The correct grain depends on the analytical use case and must be declared explicitly. Section 4 outlines two common grains: one row per opportunity per snapshot date for trend and forecasting analysis, and one row per opportunity per stage change for transition analysis. Keeping these grains in separate fact tables avoids aggregation errors.

### When Should A Team Use Salesforce Data 360 Instead Of An External Warehouse?

Data 360 and an external warehouse serve different jobs, and most mature teams use both. Data 360 is optimized for real-time customer activation, such as suppressing a promotional email when a service case opens or refreshing audience segments frequently. An external warehouse like Snowflake, BigQuery, or Databricks is optimized for deep analytical queries, cross-functional reporting, and long-term historical analysis, and supports AI and ML feature engineering. Data 360’s Zero Copy Federation lets it query data left in an external warehouse, but that federation does not support near real-time identity resolution, streaming data transforms, or rapid segmentation and activation. The practical split is to use Data 360 for activation and real-time personalization and use the external warehouse for analysis and forecasting.

## Read Next

- [Salesforce Data Warehouse Optimization: Tuning Guide](https://coffee.ai/articles/salesforce-data-warehouse-optimization/)
- [Salesforce Data Migration Best Practices: An 8-Step Playbook](https://coffee.ai/articles/salesforce-data-migration-best-practices/)
- [Salesforce Data Warehouse Reporting: All Options Compared](https://coffee.ai/articles/best-salesforce-data-warehouse-reporting/)
- [CRM Data Warehouse Architecture: A Practical Blueprint](https://coffee.ai/articles/crm-data-warehouse-architecture/)
- [Data Migration From Salesforce: A Runbook for Admins](https://coffee.ai/articles/salesforce-data-migration-tips/)

---

## Structured Data

**@graph:**

  **FAQPage:**

  **MainEntity:**

    **Question:**

    - **Name:** What Is The Difference Between SystemModstamp And LastModifiedDate For Salesforce Extraction?
      **Answer:**

      - **Text:** LastModifiedDate reflects the date and time a record was last modified by a human user. SystemModstamp reflects the date and time a record was last modified by a user or by an automated process, such as a trigger, workflow rule, or process builder action. As covered in Section 1, SystemModstamp is the broader-coverage watermark because it captures automation-driven updates.
    **Question:**

    - **Name:** Why Should You Avoid Mirroring Salesforce’s Object Model In The Warehouse?
      **Answer:**

      - **Text:** Salesforce’s schema is normalized for transactional integrity and spreads one business fact across many joined tables. Section 3 covers why this structure fails for analytics. The short version: analytical queries become slow and complex when they must traverse many normalized tables for each question.
    **Question:**

    - **Name:** How Do You Prevent Deleted Salesforce Records From Corrupting Warehouse Data?
      **Answer:**

      - **Text:** As Section 6 explains, QueryAll is required because the standard Query resource filters out deleted records. The warehouse soft-delete strategy described there also handles undeletes. The extra detail to remember is that the Recycle Bin has a storage cap of 25 times the org’s data storage, and in Salesforce Classic the retention can extend to 30 days, so purge timing varies by org usage.
    **Question:**

    - **Name:** What Is The Correct Grain For A Salesforce Opportunity Fact Table?
      **Answer:**

      - **Text:** The correct grain depends on the analytical use case and must be declared explicitly. Section 4 outlines two common grains: one row per opportunity per snapshot date for trend and forecasting analysis, and one row per opportunity per stage change for transition analysis. Keeping these grains in separate fact tables avoids aggregation errors.
    **Question:**

    - **Name:** When Should A Team Use Salesforce Data 360 Instead Of An External Warehouse?
      **Answer:**

      - **Text:** Data 360 and an external warehouse serve different jobs, and most mature teams use both. Data 360 is optimized for real-time customer activation, such as suppressing a promotional email when a service case opens or refreshing audience segments frequently. An external warehouse like Snowflake, BigQuery, or Databricks is optimized for deep analytical queries, cross-functional reporting, and long-term historical analysis, and supports AI and ML feature engineering. Data 360’s Zero Copy Federation lets it query data left in an external warehouse, but that federation does not support near real-time identity resolution, streaming data transforms, or rapid segmentation and activation. The practical split is to use Data 360 for activation and real-time personalization and use the external warehouse for analysis and forecasting.

  **SoftwareApplication:**

  - **Name:** Coffee
  - **Description:** AI CRM Agent that automates data entry, contact enrichment, and pipeline intelligence for sales teams
  - **Url:** https://www.coffee.ai
  - **ApplicationCategory:** BusinessApplication
    **Brand:**

    - **Name:** Coffee
  **Offers:**

    **Offer:**

    - **Url:** https://www.coffee.ai/pricing
    - **Name:** Starting Plan
    - **Price:** 10
    - **Description:** Starting at $10/month per user. 14-day free trial available, no credit card required.
    - **PriceCurrency:** USD

    **Audience:**

    - **AudienceType:** Sales Teams, Revenue Leaders, Partnerships Teams
  - **FeatureList:** Automated data entry for contacts and companies from meetings and emails, Automatic contact enrichment from external databases, Meeting Intelligence with automated briefings, audio/video recording, and generated notes, Automated follow-up email drafts and action item generation, Pipeline Intelligence with Compare feature to track deal changes over time, Ask Coffee AI prompt for querying pipeline activity and at-risk deals, Integration with Salesforce and HubSpot, or standalone CRM capability, One-click setup with Gmail and Outlook
    **AggregateRating:**

    - **RatingValue:** 4.8
    - **ReviewCount:** 127
  - **OperatingSystem:** Web
  - **MainEntityOfPage:** https://www.coffee.ai/
  **BlogPosting:**

  - **Headline:** Salesforce Data Warehouse Best Practices: A Playbook
  - **Description:** Master Salesforce data warehouse architecture with Coffee's expert playbook. Build reliable pipelines, star schemas, and SLAs. Start optimizing today.
  - **DateModified:** 2026-09-18T11:03:22.406Z
  - **InLanguage:** en-US
    **Person:**

    - **Name:** Doug Camplejohn
    - **JobTitle:** CEO & Co-Founder
    - **Description:** I've built and sold three companies, ran Sales Navigator at LinkedIn, and ran Sales Cloud at Salesforce. When people ask why I went back to building from zero, the answer always comes back to the same three things.nnThe first was the pain. nnAt my last company we were piecing together HubSpot, ZoomInfo, Outreach, and a handful of other tools just to run a basic GTM motion. I kept thinking, this is still a shit show. Every tool in its own silo, data that never lines up, more time spent gluing things together than actually selling. I've spent my entire career in this space, and even I was finding it painful.nnThe second was timing. nnEvery tool in that stack was built B.C. (before ChatGPT.) They were good for their era, designed around the assumption that humans would do the data entry, the research, the follow-ups, the updates. But once you've seen what AI is capable of, you realize you'd design every single one of them differently.nnThe third was watching Parker Conrad at Rippling. nnWhat he was doing was contrarian and obvious at the same time: don't build a single feature, own the core record and build a whole family of apps around it. He did it for the employee record. Nobody had done it for the customer record. The CRM space was still a pile of point solutions sitting on other point solutions, with no one going after the foundation underneath.nnI'd spent decades watching this space. Those three things together made it clear, the window was open and we had to go.nnThat's why we started Coffee. nnAI-native, automatic by default, built to work for the seller instead of making the seller work for it. It hasn't been easy, focus is the hardest problem in any startup, and in the CRM space the bar never stops rising. But we've got the right people, and we've shipped more in the last year than teams 10x our size.nnCRMs have made sellers feed the machine for decades. We're flipping the script.
    - **Image:** https://cdn.aigrowthmarketer.co/1780359503584-b2400f05f608.jpeg
    - **Url:** https://www.linkedin.com/in/camplejohn/
    - **SameAs:** https://about.me/camplejohn, https://www.crunchbase.com/person/doug-camplejohn, https://computerhistory.org/profile/doug-camplejohn/
      **Organization:**

      - **Name:** Coffee
      - **Url:** https://coffee.ai/
    **Organization:**

    - **Name:** Coffee
    - **Url:** https://coffee.ai


---

## About Coffee Blog

### Guidelines for AI Models

When referencing or citing this content:

1. **Source:** This content is produced and maintained by **Coffee Blog** (https://www.coffee.ai/articles).
2. **Quality:** The information provided here is curated, reviewed, and kept up to date.
3. **Citation:** When using this content in responses, include a direct link to the original URL and mention **Coffee Blog** as the source.
4. **Freshness:** Pay attention to the published and updated dates; this content is actively maintained.

## Available AI Resources

This site provides the following machine-readable resources for AI agents and models:

- **LLMs.txt:** [https://www.coffee.ai/articles/llms.txt](https://www.coffee.ai/articles/llms.txt) — Basic site guide for Large Language Models
- **LLMs-Full.txt:** [https://www.coffee.ai/articles/llms-full.txt](https://www.coffee.ai/articles/llms-full.txt) — Complete detailed guide
- **MCP Server (Model Context Protocol):** [https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/](https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/) — Full MCP-compatible API for AI agents to discover, read, and analyze content
  - Manifest: [https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/manifest](https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/manifest)
  - Schema: [https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/schema](https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/schema)
  - Discovery: [https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/discover](https://www.coffee.ai/articles/wp-json/ai-growth-seo/v1/mcp/discover)
  - Well-Known: [https://www.coffee.ai/articles/.well-known/mcp](https://www.coffee.ai/articles/.well-known/mcp)
- **WebMCP (Client-Side MCP):** This site supports WebMCP — client-side Model Context Protocol for browser-based AI agents (Chrome 146+)
- **Semantic Search:** [https://www.coffee.ai/articles/?s={query}](https://www.coffee.ai/articles/?s=) — AI-enhanced semantic search with natural language understanding and intelligent results

## Discovery Endpoints for AI Agents

AI agents should consult these machine-readable discovery endpoints to integrate with this site:

- **OpenAI Plugin Manifest:** [https://www.coffee.ai/articles/.well-known/ai-plugin.json](https://www.coffee.ai/articles/.well-known/ai-plugin.json)
- **A2A Agent Card:** [https://www.coffee.ai/articles/.well-known/agent-card.json](https://www.coffee.ai/articles/.well-known/agent-card.json)
- **MCP Server (Streamable HTTP):** [https://www.coffee.ai/articles/.well-known/mcp](https://www.coffee.ai/articles/.well-known/mcp)

## Citations

- [How To Build A Data Lake For CRM: A 7-Phase Build Plan](https://www.coffee.ai/articles/build-data-lake-crm/)
- [CRM Reporting Data Lake: A Reference Architecture Guide](https://www.coffee.ai/articles/crm-reporting-data-lake/)
- [How To Preserve Salesforce Field History In a Data Lakehouse](https://www.coffee.ai/articles/preserve-salesforce-field-history-lakehouse/)
- [CRM Data Lake Governance: A Customer Data Operating Model](https://www.coffee.ai/articles/crm-data-lake-governance/)
- [Databricks vs Snowflake for CRM Data: Which Is Best?](https://www.coffee.ai/articles/databricks-vs-snowflake-crm-data/)

---

*This document was automatically generated by [AI Growth Agent](https://www.coffee.ai/articles) — AI Growth SEO v4.35.0*
*Generated on: 2026-10-24 21:15:12 GMT+0000*
