Data Privacy & Security
Document version 1.0 — Last updated June 16, 2026
1. Overview
SmartAssistant is a Zoho CRM sidebar extension that provides unified visibility across a contact’s CRM profile, Zoho Books financial records, Zoho Desk support tickets, and an optional AI-generated strategic summary. This document describes how user data is handled throughout the extension’s operation.
2. User Authentication
SmartAssistant uses OAuth 2.0 with PKCE (Proof Key for Code Exchange) — the industry standard for secure, delegated authorization.
2.1 How It Works
- An authorized Zoho user navigates to the SmartAssistant login page and clicks Connect Zoho.
- The user is redirected to Zoho’s official consent screen at
accounts.zoho.com, where they see exactly which permissions (scopes) the extension is requesting. - Upon consent, Zoho issues a short-lived authorization code, which the extension exchanges for an access token and a refresh token.
- The access token is used to make API requests on behalf of the user; the refresh token allows the extension to obtain new access tokens without requiring re-authentication.
2.2 Scope of Access
| Scope | Purpose |
|---|---|
ZohoCRM.modules.ALL | Read contact and account data from the CRM |
ZohoBooks.fullaccess.ALL | Read financial data (invoices, payments, overdue amounts) from Zoho Books |
Desk.tickets.ALL | Read support ticket history from Zoho Desk |
Only read operations are performed. The extension
never creates, updates, or deletes any data in the user’s Zoho
environment with one exception: a single optional utility script
(ensure-contact-activities.js) that adds a dummy
completed task to contacts with zero activity — this fixes a
Zoho CRM UI rendering bug and is run manually by the administrator,
never by the automated extension.
2.3 Token Storage
OAuth tokens are stored on the SmartAssistant server in an encrypted token store:
- Algorithm: AES-256-GCM (authenticated encryption)
-
Encryption key: 32-byte key derived from a
server-side environment variable (
TOKEN_ENCRYPTION_KEY) -
Storage format: JSON file with individually
encrypted entries keyed by
orgId|userId— each entry has its own random initialization vector (IV) and authentication tag -
Location: Docker volume
smartassistant-data:/app/data/tokens.json
Tokens are never transmitted to third parties, never logged, and never exposed to the browser.
3. Data Flow Architecture
The data flow is strictly request-response with no persistent storage of CRM data.
┌──────────────┐ HTTPS ┌──────────────────┐ HTTPS ┌─────────────┐
│ Zoho CRM │◄──────────────►│ SmartAssistant │◄──────────────►│ Zoho APIs │
│ (Widget) │ │ (Node.js/Express)│ │ (CRM, │
│ │ │ │ │ Books, │
│ │ │ │ │ Desk) │
└──────────────┘ └──────────────────┘ └─────────────┘
│
│ HTTPS
▼
┌──────────────────┐
│ DeepSeek AI │
│ (optional) │
└──────────────────┘
3.1 Step-by-Step Data Flow
- User opens a contact in Zoho CRM → SmartAssistant widget loads in the sidebar.
- Widget sends a request to the SmartAssistant server at
https://smartassistant.site/api/summary/summarizewith the contact ID, org ID, and user ID. - Server retrieves tokens from the encrypted token store (decrypted in memory only) and uses them to authenticate against Zoho APIs.
- Server fetches data simultaneously from Zoho CRM API, Zoho Books API (invoices, payments), and Zoho Desk API (tickets).
- Data is assembled into a unified context object and returned to the widget.
- Optional AI summary: If DeepSeek AI is configured, the unified context is sent to DeepSeek’s API to generate a strategic summary. The summary is cached in memory (see §3.3).
- Widget renders the data in the user’s browser — no data persists beyond the session.
3.2 What Is NOT Stored
- ✗ CRM contact data is never written to disk on the server
- ✗ Financial records are never stored after the response is sent
- ✗ Support tickets are never persisted on the server
- ✗ No user data is written to any database, file, or external data store
- ✗ No data is shared with third parties (advertising networks, analytics providers, etc.)
3.3 In-Memory Cache
SmartAssistant uses an in-memory TTL cache
(MemoryCache) to avoid redundant API calls and AI
summary regeneration:
- What is cached: AI-generated summary text only (not raw CRM/Books/Desk data)
- Cache duration: Default TTL of 15 minutes
- Scope: Process memory only — not written to disk
- Eviction: Entries expire automatically when TTL elapses; periodic cleanup every 5 minutes; entire cache wiped on server restart
- Purpose: Performance optimization
4. No Data Storage at Server
SmartAssistant operates on a zero-retention principle for business data:
| Data Type | Stored? | Details |
|---|---|---|
| CRM contact details | ✗ Not stored | Fetched live from Zoho, returned to widget, discarded |
| Financial records | ✗ Not stored | Fetched live from Zoho Books, returned to widget, discarded |
| Support tickets | ✗ Not stored | Fetched live from Zoho Desk, returned to widget, discarded |
| AI-generated summaries | Cached (15 min) | Cached in memory for 15 minutes, then evicted; never written to disk |
| OAuth tokens | Encrypted | Stored encrypted at rest (AES-256-GCM) — required for ongoing API access |
| Server access logs | Rotating logs | IP addresses, timestamps, HTTP paths (no payloads or tokens) |
4.1 Logging Policy
The server maintains rotating log files for operational and security monitoring:
- Logged: Request method, URL path, HTTP status code, duration, IP address, user-agent, unique request ID
- Not logged: Request/response bodies, OAuth tokens, contact data, financial amounts
- Rotation: ~5 MB per file, with archived copies (suffixes
.001,.002); older logs automatically pruned - Retention: Configurable; default keeps recent logs and archives on rotation
5. Encryption
5.1 Data in Transit (TLS)
All communication between components uses TLS 1.2 or 1.3:
| Connection | Protocol | Certificate |
|---|---|---|
| Browser ↔ SmartAssistant server | HTTPS (TLS 1.2+) | Let’s Encrypt |
| Server ↔ Zoho APIs | HTTPS (TLS 1.2+) | Zoho’s certificates |
| Server ↔ DeepSeek AI | HTTPS (TLS 1.2+) | DeepSeek’s certificates |
Production certificate is automatically renewed via Let’s Encrypt Certbot.
5.2 Data at Rest (Encrypted Token Store)
OAuth tokens stored on disk are encrypted using:
- Algorithm: AES-256-GCM (Galois/Counter Mode)
- Key derivation: SHA-256 from the
TOKEN_ENCRYPTION_KEYenvironment variable - Per-entry IV: Each encrypted token entry uses a unique random 16-byte initialization vector
- Authentication tag: 16-byte GCM tag ensures tamper detection
- Storage format: Base64-encoded ciphertext + IV + tag stored in
tokens.json
5.3 No Other Data at Rest
As described in §4, no CRM, financial, or support ticket data is stored on the server. The only persistent data is the encrypted token store.
6. Third-Party Services
6.1 DeepSeek AI (Optional)
SmartAssistant offers an optional AI-powered strategic summary feature:
- Provider: DeepSeek (via API at
api.deepseek.com) - Data sent: The unified context (contact name, recent financial status, recent support tickets) — no raw Personally Identifiable Information beyond what’s already in the CRM
- Data handling: DeepSeek processes the prompt and returns a summary. Per DeepSeek’s API terms, prompts and responses are not used for model training when accessed via API
- Opt-out: If DeepSeek API key is not configured, or if the AI summary feature is disabled, no data is sent to DeepSeek
6.2 Zoho
SmartAssistant communicates with Zoho CRM API, Zoho Books API, Zoho
Desk API (all at www.zohoapis.com), and Zoho Accounts
(accounts.zoho.com) for OAuth. All data remains within
Zoho’s US data center (unless the organization is configured for
another region).
6.3 No Other Third Parties
SmartAssistant does not use analytics SDKs, tracking pixels, advertising networks, or any other third-party services beyond those listed above.
7. Data Processing & GDPR Compliance
7.1 Lawful Basis
SmartAssistant processes Zoho CRM data on behalf of the organization’s administrators and users under the legitimate interest of providing business intelligence within the existing CRM workflow. The extension:
- Processes data only when explicitly triggered by the user viewing a contact
- Processes only the minimum data needed to display the unified dashboard
- Retains nothing beyond the current session (except encrypted OAuth tokens)
7.2 User Rights
Since SmartAssistant does not store any personal data (beyond necessary OAuth tokens), users can exercise their rights by:
| Right | How It’s Handled |
|---|---|
| Access | All data is displayed in the widget at the moment of access; no stored data to request |
| Rectification | Data is read from Zoho CRM directly — edit in Zoho CRM to see changes reflected |
| Erasure | Disconnect SmartAssistant in the settings page; this deletes the encrypted OAuth tokens |
| Data Portability | Data lives in Zoho CRM — use Zoho’s export features |
| Restrict processing | Simply don’t use the extension, or disconnect via the settings page |
7.3 To Remove All Data
Navigate to the SmartAssistant settings page and click Disconnect Zoho. This immediately:
- Revokes the OAuth tokens with Zoho (renders them invalid)
- Deletes the encrypted token entry from the server’s token store
- Waits for the in-memory cache to expire naturally (15 min) or restarts the server
There is no residual user data on the server after disconnection.
8. Security Measures
| Area | Measure |
|---|---|
| Authentication | OAuth 2.0 with PKCE — no password collection |
| Transport | TLS 1.2+ (HTTPS) for all communications |
| Token storage | AES-256-GCM encrypted, per-entry IV, authentication tags |
| Token access | Only the server process has access to the decryption key |
| Input validation | All API inputs validated; no raw user input reaches Zoho APIs |
| CORS | Whitelisted domain: https://www.smartassistant.site |
| HTTP security | Standard security headers applied |
| Docker isolation | Server runs in a Docker container with minimal privileges |
| Crash handling | Global exception handlers prevent information leaks in error messages |
| Logging | No sensitive data (tokens, payloads, personal data) written to logs |
9. Data Retention
| Data | Retention | Rationale |
|---|---|---|
| OAuth refresh tokens | Until user disconnects or revokes | Required for ongoing API access without re-authentication |
| AI summary cache (in-memory) | 15 minutes | Performance optimization; no disk persistence |
| Access logs | ~5 MB rotating files (archived) | Operational diagnostics and security monitoring |
10. Contact
For privacy-related inquiries or concerns:
- Extension: SmartAssistant for Zoho CRM
- Publisher: Integmia LLC
- Website: www.integmia.org
- Email: contact@integmia.org