Skip to main content

Analytics Events Reference

Complete reference for all analytics events tracked throughout the AquaGen web application. Events are sent to configured providers (Google Analytics, Firebase, MixPanel) for user behavior analysis and product insights.


Overview

AquaGen tracks user interactions across the application to understand usage patterns, identify issues, and improve the product experience.

Location: libs/shared/src/enums/analyticsEnum.js

Service: libs/shared/src/services/analytics/analyticsService.js

Usage:

import { AnalyticEvents } from '@aquagen-mf-webapp/shared/enums';
import { AnalyticsService } from '@aquagen-mf-webapp/shared/services';

AnalyticsService.sendEvent(AnalyticEvents.EVENT_NAME, { /* payload */ });

Analytics Providers

ProviderPurpose
Google AnalyticsWeb traffic and user flow analysis
Firebase AnalyticsMobile and web event tracking
MixPanelAdvanced user behavior analytics
const AnalyticsServiceProviders = {
GA: 'GA',
FIREBASE: 'FIREBASE',
MIX_PANEL: 'MIX_PANEL',
};

Events by Feature

Global Events

Events that can be triggered from any page or component.

EventTriggerPayload
SIGN_OUT_USERUser clicks sign out from profile menu{ loginType: string }
PAGE_VIEWAny page/route is loaded{} (auto-tracks page path)
REPORT_ISSUE_CLICKUser clicks "Report Issue" in profile menu{}

Example:

// Sign out tracking
AnalyticsService.sendEvent(AnalyticEvents.SIGN_OUT_USER, {
loginType: 'google_sso'
});

// Page view (third param enables automatic path tracking)
AnalyticsService.sendEvent(AnalyticEvents.PAGE_VIEW, {}, true);

Authentication - Default Login

Username and password based authentication flow.

EventTriggerPayload
DEFAULT_LOGIN_CLICKUser clicks "Login" button{ username: string }
DEFAULT_LOGIN_SUCCESSLogin API returns success{ loginType: string }
DEFAULT_LOGIN_ERRORLogin fails (invalid credentials){ username: string }

Example:

// On login button click
AnalyticsService.sendEvent(AnalyticEvents.DEFAULT_LOGIN_CLICK, {
username: 'john.doe@company.com'
});

// On successful login
AnalyticsService.sendEvent(AnalyticEvents.DEFAULT_LOGIN_SUCCESS, {
loginType: LocalDBInstance.getItem(LocalDBKeys.loginType)
});

// On login failure
AnalyticsService.sendEvent(AnalyticEvents.DEFAULT_LOGIN_ERROR, {
username: 'john.doe@company.com'
});

Authentication - OTP Login

Phone number + One-Time Password based authentication.

EventTriggerPayload
SEND_OTP_CLICKUser clicks "Send OTP" button{}
SEND_OTP_ERROROTP sending fails{ phNumber: string }
OTP_LOGIN_CLICKUser clicks "Verify" after entering OTP{ phNumber: string }
RESEND_OTPUser clicks "Resend OTP" link{}
OTP_LOGIN_ERROROTP verification fails{ phNumber: string }

Example:

// OTP verification attempt
AnalyticsService.sendEvent(AnalyticEvents.OTP_LOGIN_CLICK, {
phNumber: '+91-9876543210'
});

// OTP verification failed
AnalyticsService.sendEvent(AnalyticEvents.OTP_LOGIN_ERROR, {
phNumber: '+91-9876543210'
});

Authentication - SSO Login

Google and Microsoft Single Sign-On flows.

EventTriggerPayload
GOOGLE_SSO_BUTTON_CLICKUser clicks "Sign in with Google"{}
MICROSOFT_SSO_BUTTON_CLICKUser clicks "Sign in with Microsoft"{}
GOOGLE_SSO_LOGIN_SUCCESSGoogle OAuth completes successfully{ email, username, userId }
MICROSOFT_SSO_LOGIN_SUCCESSMicrosoft OAuth completes successfully{ email, username, userId }
SSO_LOGIN_ERRORSSO authentication fails{}

Example:

// Google SSO success
AnalyticsService.sendEvent(AnalyticEvents.GOOGLE_SSO_LOGIN_SUCCESS, {
email: 'user@gmail.com',
username: 'John Doe',
userId: 'usr_12345'
});

// Microsoft SSO success
AnalyticsService.sendEvent(AnalyticEvents.MICROSOFT_SSO_LOGIN_SUCCESS, {
email: 'user@company.com',
username: 'John Doe',
userId: 'usr_67890'
});

Water Flow Monitoring

/monitoring/source_category/* - Water flow tracking and analysis.

EventTriggerPayload
FLOW_DATE_CHANGEUser changes date/date-range{ params: { type, date1, date2? } }
FLOW_LINE_GRAPH_TOGGLEUser toggles line graph visibility{}
FLOW_SEE_UNITS_INFO_CLICKUser clicks "See Units Info"{ categoryId: string }
FLOW_INDIVIDUAL_UNIT_CLICKUser clicks a specific flow meter card{ unitName: string }
FLOW_UNIT_PAGE_UNIT_CHANGEUser switches unit in dropdown{ unitId, unitName }
FLOW_PIE_CHART_SELECTIONUser clicks pie chart segment{ unitName, categoryId, value }
FLOW_RATE_GRAPH_TOGGLEUser toggles flow volume/rate view{ currentViewType, newViewType }
FLOW_CATEGORY_DRAG_ENDUser finishes dragging category card{}
FLOW_REARRANGE_SAVE_CLICKUser saves rearranged categories{}
FLOW_REARRANGE_TOGGLE_CLICKUser clicks rearrange mode toggle{}
FLOW_FILTER_APPLYUser applies a filter{ filter: string }

Date Type Values: 'DAY' | 'WEEK' | 'MONTH' | 'CUSTOM'

Example:

// Date change tracking
AnalyticsService.sendEvent(AnalyticEvents.FLOW_DATE_CHANGE, {
params: {
type: 'WEEK',
date1: '01/04/2026',
date2: '07/04/2026'
}
});

// Pie chart selection
AnalyticsService.sendEvent(AnalyticEvents.FLOW_PIE_CHART_SELECTION, {
unitName: 'Inlet Flow Meter',
categoryId: 'intake_raw_water',
value: 15420
});

// View type toggle
AnalyticsService.sendEvent(AnalyticEvents.FLOW_RATE_GRAPH_TOGGLE, {
currentViewType: 'VOLUME',
newViewType: 'RATE'
});

Compare Units

/monitoring/source_category/compare_units - Side-by-side unit comparison.

EventTriggerPayload
COMPARE_UNITS_BUTTON_CLICKUser clicks "Compare Units" button{}
COMPARE_SELECTION_DETAILSUser finalizes unit selection{}
COMPARE_TYPEUser changes comparison mode{ compareType: string }

Example:

// Comparison type change
AnalyticsService.sendEvent(AnalyticEvents.COMPARE_TYPE, {
compareType: 'OVERLAY'
});

Reports

/reports - Report generation and download.

EventTriggerPayload
REPORTS_DOWNLOADUser downloads a report{} (report config)
PREVIEW_REPORTUser previews a report{}

Alerts

/alerts/* - Alert management and notifications.

EventTriggerPayload
ALERTS_ICON_CLICKUser clicks alerts bell icon in header{}
ALERTS_CLICKUser clicks a specific alert item{}
ALERTS_PAGE_VIEWAlerts page is loaded{}
ALERT_ASSIGNEDUser assigns an alert to team member{}
ALERT_RESOLVEDUser marks alert as resolved{}
ALERTS_DOWNLOADUser downloads alerts report{ startDate, endDate, ... }

Example:

// Alerts download
AnalyticsService.sendEvent(AnalyticEvents.ALERTS_DOWNLOAD, {
startDate: '01/04/2026',
endDate: '30/04/2026',
format: 'PDF'
});

Account Management

/manage_account/* - Account configuration and settings.

General

EventTriggerPayload
MANAGE_ACCOUNT_CLICKUser clicks "Manage Account" from profile menu{}

Account Info (/manage_account/account_info)

EventTriggerPayload
ACCOUNT_INFO_CLICKUser clicks "Account Info" card{}
ACCOUNT_INFO_EDIT_OPTION_CHANGEUser toggles edit mode{}
ACCOUNT_INFO_SAVE_CLICKUser clicks "Save"{}
ACCOUNT_INFO_CANCEL_CLICKUser clicks "Cancel"{}
ACCOUNT_INFO_ALERT_CHECKBOX_CHANGEUser toggles alert notification checkbox{}
ACCOUNT_INFO_VALUE_CHANGEUser modifies any field value{}

Account Settings (/manage_account/account_settings)

EventTriggerPayload
ACCOUNT_SETTINGS_CLICKUser clicks "Account Settings" card{}
ACCOUNT_SETTINGS_ICON_CHANGEUser changes account/company icon{}
ACCOUNT_SETTINGS_UPDATESettings successfully saved to server{}
ACCOUNT_SETTINGS_SAVE_CLICKUser clicks "Save" button{}
ACCOUNT_SETTINGS_CANCEL_CLICKUser clicks "Cancel" button{}

Manual Node Entry (/manage_account/manual_node_entry)

EventTriggerPayload
MANUAL_NODE_ENTRY_CARD_CLICKUser clicks "Manual Node Entry" card{}
MANUAL_NODE_VALUE_CHANGE_SAVE_CLICKUser saves manual meter readingsstring[] (updated node IDs)

Example:

// Manual node entry save
AnalyticsService.sendEvent(
AnalyticEvents.MANUAL_NODE_VALUE_CHANGE_SAVE_CLICK,
['node_001', 'node_002', 'node_003']
);

Water Mass Balance

/water_balance/graph - Water balance visualization.

EventTriggerPayload
WATER_BALANCE_DATE_CHANGEUser changes date selection{}

Dashboard / Home Page

/dashboard - Main dashboard with summary widgets.

EventTriggerPayload
DASHBOARD_DATE_CHANGEUser toggles Today/Yesterday{ dashboardTrendGraphType: 'Today' | 'Yesterday' }
DASHBOARD_CARD_CLICKUser clicks any summary card{ page: string }
DASHBOARD_DETAILS_CLICKUser clicks "View Details" on card{ page: string }
DASHBOARD_ALERT_CLICKUser clicks alert in alerts list{ categoryId, standardCategoryId }
DASHBOARD_ENERGY_ALERT_EXPANDUser expands/collapses energy alerts{ isOpen: boolean, alertCount: number }
DASHBOARD_ENERGY_ALERT_CLICKUser clicks a specific energy alert{ alertType, importanceLevel, title }

Page Values: 'STOCK' | 'QUALITY' | 'BOREWELL' | 'FLOW' | pie chart type ID

Example:

// Dashboard card click
AnalyticsService.sendEvent(AnalyticEvents.DASHBOARD_CARD_CLICK, {
page: DashboardEnum.GraphCardType.STOCK
});

// Dashboard date toggle
AnalyticsService.sendEvent(AnalyticEvents.DASHBOARD_DATE_CHANGE, {
dashboardTrendGraphType: 'Yesterday'
});

// Alert click
AnalyticsService.sendEvent(AnalyticEvents.DASHBOARD_ALERT_CLICK, {
categoryId: 'intake_raw_water',
standardCategoryId: 'SOURCE_CATEGORY'
});

// Energy alert expand
AnalyticsService.sendEvent(AnalyticEvents.DASHBOARD_ENERGY_ALERT_EXPAND, {
isOpen: true,
alertCount: 5
});

AquaGPT (Legacy AI Chat)

/aquagpt - Legacy AI assistant interface.

EventTriggerPayload
AQUAGPT_NEW_CHATUser clicks "New Chat" button{}
AQUAGPT_OLD_CHAT_CLICKUser clicks previous conversation in sidebar{}
AQUAGPT_SENDUser sends message to AquaGPT{ prompt: string }
AQUAGPT_LIKEUser likes/dislikes response{ isLiked: boolean, prompt: string }

Example:

// Send message
AnalyticsService.sendEvent(AnalyticEvents.AQUAGPT_SEND, {
prompt: 'What is my water consumption this month?'
});

// Feedback on response
AnalyticsService.sendEvent(AnalyticEvents.AQUAGPT_LIKE, {
isLiked: true,
prompt: 'What is my water consumption this month?'
});

AI Assistant (New)

/ai - New AI assistant interface with enhanced features.

EventTriggerPayload
AI_NEW_CHAT_CLICKUser clicks "New Chat"{}
AI_SEND_CLICKUser sends message{ userQuery: string }
AI_RESPONSE_LIKE_CLICKUser clicks thumbs up{ messageId, isLiked, content }
AI_RESPONSE_DISLIKE_CLICKUser clicks thumbs down{ messageId, isLiked, content }
AI_RESPONSE_COPY_CLICKUser clicks copy button{}
AI_STOP_CLICKUser stops response generation{}
AI_CONVERSATION_STARTER_CLICKUser clicks suggested prompt{ prompt: string }

Example:

// Send AI message
AnalyticsService.sendEvent(AnalyticEvents.AI_SEND_CLICK, {
userQuery: 'Show me water leakage trends for last week'
});

// Response feedback
AnalyticsService.sendEvent(AnalyticEvents.AI_RESPONSE_LIKE_CLICK, {
messageId: 'msg_12345',
isLiked: true,
content: 'Here is the water leakage trend...'
});

// Conversation starter
AnalyticsService.sendEvent(AnalyticEvents.AI_CONVERSATION_STARTER_CLICK, {
prompt: 'What are my top water consuming areas?'
});

Rain Water Intelligence (RWI)

/rwi - Rainwater harvesting analytics.

EventTriggerPayload
RWI_RAINFALL_TREND_TAB_VIEWUser views "Rainfall Trend" tab{}
RWI_EFFICIENCY_SAVINGS_TAB_VIEWUser views "Efficiency & Savings" tab{}
RWI_EFFICIENCY_DATE_CHANGEUser changes date on efficiency tab{}
RWI_RAINFALL_TREND_DATE_CHANGEUser changes date on rainfall tab{}

Example:

// Tab view tracking
AnalyticsService.sendEvent(
AnalyticEvents.RWI_RAINFALL_TREND_TAB_VIEW,
{},
true // Enable page tracking
);

UWI / Aqua Recycle (SCADA)

/uwi - Used Water Intelligence / Water treatment plant monitoring.

EventTriggerPayload
UWI_TAB_SWITCHUser switches between tabs{ tabIndex: number, tabName: string }
UWI_DASHBOARD_SESSION_TIMEUser leaves UWI page{ durationMs: number }
UWI_REMOTE_CONTROL_OPENEDUser opens remote control panel{}

Example:

// Tab switch
AnalyticsService.sendEvent(AnalyticEvents.UWI_TAB_SWITCH, {
tabIndex: 2,
tabName: 'Energy'
});

// Session duration (on unmount)
AnalyticsService.sendEvent(AnalyticEvents.UWI_DASHBOARD_SESSION_TIME, {
durationMs: 145000 // 2 minutes 25 seconds
});

Leadership / Executive Dashboard

/leadership - Executive summary dashboard.

EventTriggerPayload
LEADERSHIP_DATE_TYPE_CHANGEUser changes date type (Day/Week/Month){}
LEADERSHIP_DATE_CHANGEUser changes selected date{}
LEADERSHIP_REFRESH_CLICKUser clicks refresh button{}
LEADERSHIP_REDIRECTUser navigates to detailed view{ industryId: string }

Example:

// Redirect to industry details
AnalyticsService.sendEvent(AnalyticEvents.LEADERSHIP_REDIRECT, {
industryId: 'plant_bangalore'
});

RO Efficiency

/ro_efficiency - Reverse Osmosis plant efficiency monitoring.

EventTriggerPayload
RO_EFFICIENCY_DATE_CHANGEUser changes date selection{ type, date1, date2 }
RO_EFFICIENCY_PLANT_SELECTUser selects different RO plant{ plantIndex, plantName }
RO_EFFICIENCY_TAB_CHANGEUser switches between tabs{ tab: string }
RO_EFFICIENCY_INSIGHTS_TOGGLEUser expands/collapses insights{ action: 'open' | 'close' }
RO_EFFICIENCY_DOWNLOAD_REPORTUser downloads report{ plantName, type, date1, date2 }
RO_EFFICIENCY_LOG_ACTIVITYUser logs maintenance entry{ activityType, date }
RO_EFFICIENCY_ALERT_TAB_CHANGEUser switches alert tabs{ tab: string }

Example:

// Plant selection
AnalyticsService.sendEvent(AnalyticEvents.RO_EFFICIENCY_PLANT_SELECT, {
plantIndex: 2,
plantName: 'RO Plant - Block B'
});

// Report download
AnalyticsService.sendEvent(AnalyticEvents.RO_EFFICIENCY_DOWNLOAD_REPORT, {
plantName: 'RO Plant - Block B',
type: 'MONTH',
date1: '01/04/2026',
date2: '30/04/2026'
});

// Log activity
AnalyticsService.sendEvent(AnalyticEvents.RO_EFFICIENCY_LOG_ACTIVITY, {
activityType: 'MEMBRANE_CLEANING',
date: '15/04/2026'
});

Main app sidebar navigation tracking.

EventTriggerPayload
SIDEBAR_NAV_ITEM_CLICKUser clicks any nav item{ routeId, displayName, permissionId, isLocked, isSubMenu }
SIDEBAR_ACCORDION_TOGGLEUser expands/collapses accordion{ routeId, displayName, permissionId, isLocked, isExpanded }

Example:

// Navigation item click
AnalyticsService.sendEvent(AnalyticEvents.SIDEBAR_NAV_ITEM_CLICK, {
routeId: 'METRICS',
displayName: 'Monitoring',
permissionId: 'WATER_MONITORING',
isLocked: false,
isSubMenu: false
});

// Accordion toggle
AnalyticsService.sendEvent(AnalyticEvents.SIDEBAR_ACCORDION_TOGGLE, {
routeId: 'EFFICIENCY',
displayName: 'Efficiency',
permissionId: 'EFFICIENCY',
isLocked: false,
isExpanded: true
});

Leakage Detection

Water leakage detection and analysis features.

EventTriggerPayload
LEAKAGE_LEARN_MORE_CLICKUser clicks "Learn More" on leakage card{}
LEAKAGE_BAR_GRAPH_ICON_CLICKUser clicks bar graph marker{}
LEAKAGE_LINE_GRAPH_ICON_CLICKUser clicks line graph marker{}
LEAKAGE_VIEW_ALERT_CLICKUser clicks to view leakage alert{}

Contact Sales / Upgrade

Feature upgrade and sales contact tracking.

EventTriggerPayload
CONTACT_SALES_CLICK_FOR_UPGRADEUser clicks upgrade prompt for locked features{}

Deprecated Events

These events are no longer actively triggered but kept for backward compatibility.

EventStatusReplacement
FLOW_ACCOUNT_SETTING_REDITECTDeprecated-
FLOW_TAB_CHANGEDeprecated-
CONSUMPTION_TRENDDeprecatedFLOW_DATE_CHANGE
MONITORING_FLOW_RATE_TOGGLEDeprecatedFLOW_RATE_GRAPH_TOGGLE
MONITORING_SEARCH_OPTION_CLICKDeprecated-
MONITORING_SEARCH_ICON_CLICKDeprecated-

Complete Events Index

CategoryEvents Count
Global3
Authentication - Default3
Authentication - OTP5
Authentication - SSO5
Water Flow Monitoring11
Compare Units3
Reports2
Alerts6
Account Management12
Water Mass Balance1
Dashboard6
AquaGPT (Legacy)4
AI Assistant7
Rain Water Intelligence4
UWI / Aqua Recycle3
Leadership Dashboard4
RO Efficiency7
Sidebar Navigation2
Leakage Detection4
Contact Sales1
Total93

Best Practices

1. Always Include Relevant Context

// ❌ Bad - No context
AnalyticsService.sendEvent(AnalyticEvents.DASHBOARD_CARD_CLICK, {});

// ✅ Good - Includes which card was clicked
AnalyticsService.sendEvent(AnalyticEvents.DASHBOARD_CARD_CLICK, {
page: DashboardEnum.GraphCardType.STOCK
});

2. Track User Journey Completions

// Track start
AnalyticsService.sendEvent(AnalyticEvents.DEFAULT_LOGIN_CLICK, { username });

// Track success
AnalyticsService.sendEvent(AnalyticEvents.DEFAULT_LOGIN_SUCCESS, { loginType });

// Track failure
AnalyticsService.sendEvent(AnalyticEvents.DEFAULT_LOGIN_ERROR, { username });

3. Use Page View for Route Changes

useEffect(() => {
AnalyticsService.sendEvent(AnalyticEvents.PAGE_VIEW, {}, true);
}, []);

4. Track Session Duration for Key Pages

useEffect(() => {
const startTime = Date.now();

return () => {
AnalyticsService.sendEvent(AnalyticEvents.UWI_DASHBOARD_SESSION_TIME, {
durationMs: Date.now() - startTime
});
};
}, []);

Next Steps


Last Updated: April 2026