Bridging Pendo Product Telemetry into an AI Knowledge Graph with Cognee
Product teams sit on a goldmine of context inside Pendo: in-app onboarding guides, user feature clicks, customer accounts, and drop-off points.
Yet, when product managers or AI agents want to answer fundamental qualitative questions—like "Which enterprise accounts struggled with our latest SSO migration guide?"—they are forced to write multi-tab CSV exports or complex Segment queries.
To bridge this gap, we built and shipped the Pendo Connector for Cognee. Here’s a breakdown of how it works, the architectural choices we made, and how to get it running in your environment.
The Challenge: Telemetry vs Semantic Context
Raw product analytics is dominated by click events (button_clicked_id_382). By itself, that click means nothing to an LLM unless linked to:
- The Feature Definition: What screen or workflow did that button belong to?
- The Guide / Walkthrough: Was the user engaged in an active onboarding tour?
- The Account Context: What subscription tier or industry does this user belong to?
flowchart TD
subgraph Pendo API
G[Guides & Tours]
F[Feature Definitions]
E[Track Events]
A[Accounts & Visitors]
end
G --> Client[PendoClient]
F --> Client
E --> Client
A --> Client
Client --> DLT[DLT Pipeline]
DLT -->|DOCUMENT_SOURCE_ATTR| Cognee[Cognee Cognify Engine]
Cognee --> KG[(Graph Database + Vector Embeddings)]
Architectural Deep Dive
1. Multi-Resource Aggregation with dlt
Rather than treating Pendo as a dumb event pipe, our connector extracts four distinct knowledge layers:
- Guides: Onboarding tooltips, banners, and walkthrough step texts.
- Features: Element selectors, UI tags, and human descriptions.
- Track Events: Custom behavioral events sent by backend services.
- Visitor Context: Account groupings and last-seen metadata.
class PendoClient:
def __init__(self, integration_key: str, base_url: str = "https://app.pendo.io") -> None:
self.integration_key = integration_key
self.base_url = base_url.rstrip("/")
def get_guides(self) -> list[dict[str, Any]]: ...
def get_features(self) -> list[dict[str, Any]]: ...
def get_track_events(self) -> list[dict[str, Any]]: ...
2. Turning UI Hierarchies into LLM-Ready Markdown
For every guide, feature, and event, we construct rich semantic documents:
# Pendo In-App Guide: Workspace Onboarding Tour (ID: guide_489)
- **Status:** Published
- **Audience Segment:** All New Workspace Admins
- **Created At:** 2026-08-15T09:00:00Z
### Guide Steps & UI Content
- **Step 1:** Welcome to your team workspace! Let's configure your data sources.
- **Step 2:** Click here to connect your PostgreSQL or Neo4j databases.
- **Step 3:** Invite your teammates to collaborate.
When Cognee's cognify() pipeline digests this, it extracts relationships between Guides, Features, and Onboarding Steps, allowing autonomous agents to understand the exact UX journeys users experience.
How to Use It in 60 Seconds
Installation
pip install cognee-community-connector-pendo
Ingestion Script
import asyncio
import cognee
from cognee_community_connector_pendo import pendo_source
async def main():
source = pendo_source(
integration_key="YOUR_PENDO_INTEGRATION_KEY",
include_guides=True,
include_features=True,
include_events=True,
since="2026-09-01T00:00:00Z",
)
# Ingest into Cognee memory
await cognee.add(source, dataset_name="product_telemetry")
await cognee.cognify(dataset_name="product_telemetry")
# Ask deep product questions
results = await cognee.search(
"What guides are active for onboarding new workspace admins?",
dataset_name="product_telemetry"
)
print(results)
if __name__ == "__main__":
asyncio.run(main())
Offline Unit Testing
The package includes an offline pytest suite testing pagination, rate-limit backoffs, and Cognee pipeline compatibility:
uv run pytest packages/connector/pendo/tests/test_pendo.py -v
Summary & Links
- Pull Request: topoteretes/cognee-community#234
- Source Code: cognee-community repo
Let us know what other product tools you'd love to see connected to Cognee!
Top comments (0)