About Relevant Reflex | Online Survey Platform India Since 2021
About Relevant Reflex
A trusted online survey platform in India, connecting consumers with market research opportunities since 2021.
Our Mission
At Relevant Reflex, we bridge the gap between Indian consumers and global market research companies. Our mission is to provide a trustworthy platform where your opinions matter and are fairly compensated.
We believe that every voice deserves to be heard, and every opinion has value. That's why we've created a secure, user-friendly platform that makes it easy for people across India to participate in market research and earn money for their time and insights.
Why We Started
Founded in 2021, Relevant Reflex was born out of the need for a reliable, India-focused survey platform. We saw too many people getting frustrated with unreliable survey sites that didn't pay or weren't relevant to the Indian market.
Our Impact in Numbers
Since our launch, we've grown into a trusted survey platform serving members across India
50,000+
Active Members
Registered users earning money with surveys
₹25,00,000+
Total Paid Out
Cumulative rewards paid to our members
2,50,000+
Surveys Completed
Successful survey completions by our members
98%
Satisfaction Rate
Members who recommend us to friends*
*Based on internal member survey, Q4 2024, n=500
Our Core Values
These principles guide everything we do at Relevant Reflex
Trust & Security
We protect your data with bank-level security and never share your personal information without consent. Your privacy is our priority.
Fair Compensation
Every survey you complete is fairly compensated. We ensure timely payments and transparent reward structures.
Member-Centric
Our members are at the center of everything we do. We continuously improve our platform based on your feedback.
Innovation
We're constantly evolving our platform with new features and better user experiences to serve you better.
Community
We've built more than a platform - we've built a community of engaged Indian consumers making their voices heard.
Local Focus
We understand the Indian market and provide surveys that are relevant to local consumers and culture.
Independently Listed & Verified
Relevant Reflex is independently researched and listed on Paid Survey Hub India — a free third-party directory that verifies paid survey platforms for Indian users. Only platforms with a proven track record of accepting Indian members and making actual payments are listed. Our presence there is not paid or sponsored — it is based on verified legitimacy.
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking “Accept All”, you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 2: RR com/admin-auth.php
- Type: PHP
- Size: 48.39 KB
- Path: RR com
- Name: admin-auth.php
------------------------------------------------------------
pdo = $db->getConnection();
} catch (Exception $e) {
logError('Admin auth database connection failed: ' . $e->getMessage());
throw new Exception('Database connection failed');
}
}
/**
* Expose the PDO connection for shared use (e.g. attachment handler)
*/
public function getConnection() {
return $this->pdo;
}
public function login($username, $password, $rememberMe = false) {
try {
// Find admin user
$stmt = $this->pdo->prepare("
SELECT id, username, email, password, full_name, role, status,
COALESCE(allowed_tabs, 'all') as allowed_tabs,
COALESCE(allowed_ticket_types, 'all') as allowed_ticket_types
FROM admin_users
WHERE (username = ? OR email = ?) AND status = 'active'
");
$stmt->execute([$username, $username]);
$admin = $stmt->fetch();
if (!$admin || !verifyPassword($password, $admin['password'])) {
logError('Admin login failed', ['username' => $username]);
return false;
}
// Create session
session_start();
session_regenerate_id(true);
$_SESSION['admin_logged_in'] = true;
$_SESSION['admin_id'] = $admin['id'];
$_SESSION['admin_username'] = $admin['username'];
$_SESSION['admin_full_name'] = $admin['full_name'];
$_SESSION['admin_role'] = $admin['role'];
$_SESSION['admin_login_time'] = time();
// Permissions - super_admin always gets 'all'
$_SESSION['admin_allowed_tabs'] = ($admin['role'] === 'super_admin') ? 'all' : $admin['allowed_tabs'];
$_SESSION['admin_allowed_ticket_types'] = ($admin['role'] === 'super_admin') ? 'all' : $admin['allowed_ticket_types'];
// Update last login
$stmt = $this->pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?");
$stmt->execute([$admin['id']]);
// Handle remember me
if ($rememberMe) {
$token = generateSecureToken();
$expires = date('Y-m-d H:i:s', strtotime('+30 days'));
$stmt = $this->pdo->prepare("
INSERT INTO admin_sessions (admin_id, session_token, expires_at)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE session_token = ?, expires_at = ?
");
$stmt->execute([$admin['id'], $token, $expires, $token, $expires]);
setcookie('admin_remember_token', $token, strtotime('+30 days'), '/', '', true, true);
}
logError('Admin login successful', [
'admin_id' => $admin['id'],
'username' => $admin['username'],
'role' => $admin['role']
]);
return true;
} catch (Exception $e) {
logError('Admin login error', ['username' => $username, 'error' => $e->getMessage()]);
return false;
}
}
public function logout() {
session_start();
if (isset($_SESSION['admin_id'])) {
logError('Admin logout', ['admin_id' => $_SESSION['admin_id']]);
}
// Clear remember token
if (isset($_COOKIE['admin_remember_token'])) {
try {
$stmt = $this->pdo->prepare("DELETE FROM admin_sessions WHERE session_token = ?");
$stmt->execute([$_COOKIE['admin_remember_token']]);
} catch (Exception $e) {
logError('Error clearing admin remember token', ['error' => $e->getMessage()]);
}
setcookie('admin_remember_token', '', time() - 3600, '/', '', true, true);
}
// Clear session
$_SESSION = [];
session_destroy();
header('Location: support.php');
exit;
}
public function isLoggedIn() {
session_start();
if (isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true) {
return true;
}
// Check remember me token
if (isset($_COOKIE['admin_remember_token'])) {
return $this->checkRememberToken($_COOKIE['admin_remember_token']);
}
return false;
}
private function checkRememberToken($token) {
try {
$stmt = $this->pdo->prepare("
SELECT au.id, au.username, au.full_name, au.role
FROM admin_sessions ass
JOIN admin_users au ON ass.admin_id = au.id
WHERE ass.session_token = ? AND ass.expires_at > NOW() AND au.status = 'active'
");
$stmt->execute([$token]);
$session = $stmt->fetch();
if ($session) {
// Restore session
$_SESSION['admin_logged_in'] = true;
$_SESSION['admin_id'] = $session['id'];
$_SESSION['admin_username'] = $session['username'];
$_SESSION['admin_full_name'] = $session['full_name'];
$_SESSION['admin_role'] = $session['role'];
$_SESSION['admin_login_time'] = time();
// Update last login
$stmt = $this->pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?");
$stmt->execute([$session['id']]);
return true;
} else {
// Invalid or expired token - delete it
setcookie('admin_remember_token', '', time() - 3600, '/', '', true, true);
}
} catch (Exception $e) {
logError('Error checking admin remember token', ['error' => $e->getMessage()]);
}
return false;
}
public function requireAdmin() {
if (!$this->isLoggedIn()) {
header('Location: support.php');
exit;
}
}
public function getCurrentAdmin() {
if (!$this->isLoggedIn()) {
return null;
}
session_start();
return [
'id' => $_SESSION['admin_id'],
'username' => $_SESSION['admin_username'],
'full_name' => $_SESSION['admin_full_name'],
'role' => $_SESSION['admin_role'],
'allowed_tabs' => $_SESSION['admin_allowed_tabs'] ?? 'all',
'allowed_ticket_types' => $_SESSION['admin_allowed_ticket_types'] ?? 'all'
];
}
/**
* Check if current admin has access to a specific tab
*/
public function hasTabAccess($tabName) {
$allowed = $_SESSION['admin_allowed_tabs'] ?? 'all';
if ($allowed === 'all' || $_SESSION['admin_role'] === 'super_admin') return true;
$tabs = array_map('trim', explode(',', $allowed));
return in_array($tabName, $tabs);
}
/**
* Get allowed ticket sender types for current admin
* Returns array like ['member','partner','client'] or ['all']
*/
public function getAllowedTicketTypes() {
$allowed = $_SESSION['admin_allowed_ticket_types'] ?? 'all';
if ($allowed === 'all' || $_SESSION['admin_role'] === 'super_admin') return ['all'];
return array_map('trim', explode(',', $allowed));
}
public function createAdmin($username, $email, $password, $fullName, $role = 'admin', $mobile = null, $allowedTabs = 'all', $allowedTicketTypes = 'all') {
try {
// Check if username or email already exists
$stmt = $this->pdo->prepare("SELECT id FROM admin_users WHERE username = ? OR email = ?");
$stmt->execute([$username, $email]);
if ($stmt->fetch()) {
return ['success' => false, 'message' => 'A user with this email already exists.'];
}
// Create admin user
$hashedPassword = hashPassword($password);
$stmt = $this->pdo->prepare("
INSERT INTO admin_users (username, email, password, full_name, mobile, role, allowed_tabs, allowed_ticket_types, status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'active')
");
$result = $stmt->execute([$username, $email, $hashedPassword, $fullName, $mobile, $role, $allowedTabs, $allowedTicketTypes]);
if ($result) {
logError('Admin user created', ['username' => $username, 'email' => $email, 'role' => $role]);
return ['success' => true, 'message' => 'User created successfully.', 'id' => $this->pdo->lastInsertId()];
}
return ['success' => false, 'message' => 'Failed to create user.'];
} catch (Exception $e) {
logError('Error creating admin user', ['username' => $username, 'error' => $e->getMessage()]);
return ['success' => false, 'message' => 'Database error: ' . $e->getMessage()];
}
}
/**
* Update an existing admin user
*/
public function updateAdmin($id, $fullName, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $newPassword = null) {
try {
// Prevent editing super_admin role away from user ID 1
$stmt = $this->pdo->prepare("SELECT id, role FROM admin_users WHERE id = ?");
$stmt->execute([$id]);
$existing = $stmt->fetch();
if (!$existing) return ['success' => false, 'message' => 'User not found.'];
// Check email uniqueness (excluding current user)
$stmt = $this->pdo->prepare("SELECT id FROM admin_users WHERE email = ? AND id != ?");
$stmt->execute([$email, $id]);
if ($stmt->fetch()) return ['success' => false, 'message' => 'Email already in use by another user.'];
if ($newPassword) {
$hashed = hashPassword($newPassword);
$stmt = $this->pdo->prepare("
UPDATE admin_users SET full_name = ?, email = ?, username = ?, mobile = ?, role = ?,
allowed_tabs = ?, allowed_ticket_types = ?, password = ?, updated_at = NOW() WHERE id = ?
");
$stmt->execute([$fullName, $email, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $hashed, $id]);
} else {
$stmt = $this->pdo->prepare("
UPDATE admin_users SET full_name = ?, email = ?, username = ?, mobile = ?, role = ?,
allowed_tabs = ?, allowed_ticket_types = ?, updated_at = NOW() WHERE id = ?
");
$stmt->execute([$fullName, $email, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $id]);
}
logError('Admin user updated', ['admin_id' => $id, 'email' => $email]);
return ['success' => true, 'message' => 'User updated successfully.'];
} catch (Exception $e) {
logError('Error updating admin user', ['id' => $id, 'error' => $e->getMessage()]);
return ['success' => false, 'message' => 'Database error.'];
}
}
/**
* Toggle admin user active/inactive
*/
public function toggleAdminStatus($id) {
try {
$stmt = $this->pdo->prepare("UPDATE admin_users SET status = IF(status='active','inactive','active'), updated_at = NOW() WHERE id = ? AND id != 1");
$stmt->execute([$id]);
return $stmt->rowCount() > 0;
} catch (Exception $e) {
logError('Error toggling admin status', ['id' => $id, 'error' => $e->getMessage()]);
return false;
}
}
/**
* Get detailed admin user by ID
*/
public function getAdminById($id) {
try {
$stmt = $this->pdo->prepare("SELECT id, username, email, full_name, mobile, role, status, allowed_tabs, allowed_ticket_types, created_at, last_login FROM admin_users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch();
} catch (Exception $e) { return null; }
}
/**
* Get all admin users with full details (for Users tab)
*/
public function getAllAdminUsersDetailed() {
try {
$stmt = $this->pdo->query("SELECT id, username, email, full_name, mobile, role, status, allowed_tabs, allowed_ticket_types, created_at, last_login FROM admin_users ORDER BY id ASC");
return $stmt->fetchAll();
} catch (Exception $e) {
logError('Error fetching admin users detailed', ['error' => $e->getMessage()]);
return [];
}
}
// SUPPORT TICKET METHODS
public function getAllTickets($status = null, $priority = null, $senderType = null, $limit = 50, $offset = 0, $allowedTypes = null) {
try {
$where = "1=1";
$params = [];
if ($status) {
$where .= " AND st.status = ?";
$params[] = $status;
}
if ($priority) {
$where .= " AND st.priority = ?";
$params[] = $priority;
}
if ($senderType) {
if ($senderType === 'member') {
$where .= " AND (st.sender_type = 'member' OR st.sender_type IS NULL)";
} else {
$where .= " AND st.sender_type = ?";
$params[] = $senderType;
}
}
// Permission-based sender_type restriction
if ($allowedTypes && !in_array('all', $allowedTypes)) {
$typePlaceholders = [];
foreach ($allowedTypes as $t) {
if ($t === 'member') {
$typePlaceholders[] = "(st.sender_type = 'member' OR st.sender_type IS NULL)";
} else {
$typePlaceholders[] = "st.sender_type = ?";
$params[] = $t;
}
}
$where .= " AND (" . implode(' OR ', $typePlaceholders) . ")";
}
$stmt = $this->pdo->prepare("
SELECT st.*,
u.email as user_email,
au.full_name as assigned_admin_name,
COALESCE(st.sender_type, 'member') as sender_type,
(SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count
FROM support_tickets st
LEFT JOIN users u ON st.user_id = u.id
LEFT JOIN admin_users au ON st.assigned_to = au.id
WHERE $where
ORDER BY st.created_at DESC
LIMIT $limit OFFSET $offset
");
$stmt->execute($params);
$tickets = $stmt->fetchAll();
// For partner tickets, fetch partner info from shop database
$partnerIds = [];
foreach ($tickets as $t) {
if ($t['sender_type'] === 'partner' && $t['sender_id']) {
$partnerIds[$t['sender_id']] = true;
}
}
if (!empty($partnerIds)) {
$partnerInfo = $this->getPartnerInfoFromShop(array_keys($partnerIds));
foreach ($tickets as &$t) {
if ($t['sender_type'] === 'partner' && isset($partnerInfo[$t['sender_id']])) {
$p = $partnerInfo[$t['sender_id']];
$t['partner_name'] = $p['company_name'];
$t['partner_code'] = $p['affiliate_code'];
if (empty($t['user_email'])) {
$t['user_email'] = $p['email'];
}
}
}
unset($t);
}
// For client tickets, fetch client info from shop database
$clientIds = [];
foreach ($tickets as $t) {
if ($t['sender_type'] === 'client' && $t['sender_id']) {
$clientIds[$t['sender_id']] = true;
}
}
if (!empty($clientIds)) {
$clientInfo = $this->getClientInfoFromShop(array_keys($clientIds));
foreach ($tickets as &$t) {
if ($t['sender_type'] === 'client' && isset($clientInfo[$t['sender_id']])) {
$c = $clientInfo[$t['sender_id']];
$t['client_name'] = $c['company_name'];
$t['client_code'] = $c['client_code'];
$t['client_contact'] = $c['contact_person'];
if (empty($t['user_email'])) {
$t['user_email'] = $c['email'];
}
}
}
unset($t);
}
return $tickets;
} catch (Exception $e) {
logError('Error fetching tickets', ['error' => $e->getMessage()]);
return [];
}
}
public function getTicketStats($allowedTypes = null) {
try {
$where = "1=1";
$params = [];
// Permission-based filtering
if ($allowedTypes && !in_array('all', $allowedTypes)) {
$typePlaceholders = [];
foreach ($allowedTypes as $t) {
if ($t === 'member') {
$typePlaceholders[] = "(sender_type = 'member' OR sender_type IS NULL)";
} else {
$typePlaceholders[] = "sender_type = ?";
$params[] = $t;
}
}
$where .= " AND (" . implode(' OR ', $typePlaceholders) . ")";
}
$stmt = $this->pdo->prepare("
SELECT
COUNT(*) as total,
SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) as open,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
SUM(CASE WHEN status = 'resolved' THEN 1 ELSE 0 END) as resolved,
SUM(CASE WHEN status = 'closed' THEN 1 ELSE 0 END) as closed,
SUM(CASE WHEN sender_type = 'member' OR sender_type IS NULL THEN 1 ELSE 0 END) as member_tickets,
SUM(CASE WHEN sender_type = 'partner' THEN 1 ELSE 0 END) as partner_tickets,
SUM(CASE WHEN sender_type = 'client' THEN 1 ELSE 0 END) as client_tickets
FROM support_tickets
WHERE $where
");
$stmt->execute($params);
return $stmt->fetch();
} catch (Exception $e) {
logError('Error fetching ticket stats', ['error' => $e->getMessage()]);
return ['total' => 0, 'open' => 0, 'pending' => 0, 'resolved' => 0, 'closed' => 0, 'member_tickets' => 0, 'partner_tickets' => 0, 'client_tickets' => 0];
}
}
public function getTicketById($ticketId) {
try {
$stmt = $this->pdo->prepare("
SELECT st.*,
u.email as user_email, u.gender, u.date_of_birth, u.postcode,
au.full_name as assigned_admin_name,
COALESCE(st.sender_type, 'member') as sender_type
FROM support_tickets st
LEFT JOIN users u ON st.user_id = u.id
LEFT JOIN admin_users au ON st.assigned_to = au.id
WHERE st.id = ?
");
$stmt->execute([$ticketId]);
$ticket = $stmt->fetch();
// For partner tickets, fetch partner info from shop database
if ($ticket && $ticket['sender_type'] === 'partner' && $ticket['sender_id']) {
$partnerInfo = $this->getPartnerInfoFromShop([$ticket['sender_id']]);
if (isset($partnerInfo[$ticket['sender_id']])) {
$p = $partnerInfo[$ticket['sender_id']];
$ticket['partner_name'] = $p['company_name'];
$ticket['partner_code'] = $p['affiliate_code'];
$ticket['partner_incharge'] = $p['incharge_name'];
if (empty($ticket['user_email'])) {
$ticket['user_email'] = $p['email'];
}
}
}
// For client tickets, fetch client info from shop database
if ($ticket && $ticket['sender_type'] === 'client' && $ticket['sender_id']) {
$clientInfo = $this->getClientInfoFromShop([$ticket['sender_id']]);
if (isset($clientInfo[$ticket['sender_id']])) {
$c = $clientInfo[$ticket['sender_id']];
$ticket['client_name'] = $c['company_name'];
$ticket['client_code'] = $c['client_code'];
$ticket['client_contact'] = $c['contact_person'];
if (empty($ticket['user_email'])) {
$ticket['user_email'] = $c['email'];
}
}
}
return $ticket;
} catch (Exception $e) {
logError('Error fetching ticket', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]);
return null;
}
}
public function getTicketMessages($ticketId, $includeInternal = false) {
try {
$where = $includeInternal ? "1=1" : "is_internal = 0";
$stmt = $this->pdo->prepare("
SELECT sm.*,
CASE
WHEN sm.sender_type = 'user' THEN u.email
WHEN sm.sender_type = 'admin' THEN au.full_name
END as sender_name
FROM support_messages sm
LEFT JOIN users u ON sm.sender_type = 'user' AND sm.sender_id = u.id
LEFT JOIN admin_users au ON sm.sender_type = 'admin' AND sm.sender_id = au.id
WHERE sm.ticket_id = ? AND $where
ORDER BY sm.created_at ASC
");
$stmt->execute([$ticketId]);
$messages = $stmt->fetchAll();
// For partner ticket messages where sender_name is NULL (partner sender_id not in users table)
// fetch partner info from shop database
$needsPartnerName = false;
foreach ($messages as $msg) {
if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) {
$needsPartnerName = true;
break;
}
}
if ($needsPartnerName) {
// Get ticket to find partner/client sender_id
$stmtT = $this->pdo->prepare("SELECT sender_type, sender_id FROM support_tickets WHERE id = ?");
$stmtT->execute([$ticketId]);
$ticket = $stmtT->fetch();
if ($ticket && $ticket['sender_type'] === 'partner' && $ticket['sender_id']) {
$partnerInfo = $this->getPartnerInfoFromShop([$ticket['sender_id']]);
$partnerName = isset($partnerInfo[$ticket['sender_id']]) ? $partnerInfo[$ticket['sender_id']]['company_name'] : 'Partner';
foreach ($messages as &$msg) {
if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) {
$msg['sender_name'] = $partnerName;
}
}
unset($msg);
}
// Client name resolution
if ($ticket && $ticket['sender_type'] === 'client' && $ticket['sender_id']) {
$clientInfo = $this->getClientInfoFromShop([$ticket['sender_id']]);
$clientName = isset($clientInfo[$ticket['sender_id']]) ? $clientInfo[$ticket['sender_id']]['company_name'] : 'Client';
foreach ($messages as &$msg) {
if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) {
$msg['sender_name'] = $clientName;
}
}
unset($msg);
}
}
return $messages;
} catch (Exception $e) {
logError('Error fetching ticket messages', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]);
return [];
}
}
public function updateTicketStatus($ticketId, $status, $adminId) {
try {
$stmt = $this->pdo->prepare("
UPDATE support_tickets
SET status = ?, resolved_at = CASE WHEN ? = 'resolved' COLLATE utf8mb4_unicode_ci THEN NOW() ELSE resolved_at END
WHERE id = ?
");
$result = $stmt->execute([$status, $status, $ticketId]);
if ($result) {
logError('Ticket status updated', [
'ticket_id' => $ticketId,
'status' => $status,
'admin_id' => $adminId
]);
}
return $result;
} catch (Exception $e) {
logError('Error updating ticket status', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]);
return false;
}
}
/**
* Fetch partner info from the shop database (affiliates table is in u752449863_rrshop)
* @param array $partnerIds Array of affiliate IDs
* @return array Keyed by affiliate ID => [company_name, affiliate_code, email, incharge_name]
*/
private function getPartnerInfoFromShop($partnerIds) {
$result = [];
if (empty($partnerIds)) return $result;
try {
$shopPdo = new PDO(
"mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4",
"u752449863_rradmin",
DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
$placeholders = implode(',', array_fill(0, count($partnerIds), '?'));
$stmt = $shopPdo->prepare("SELECT id, company_name, affiliate_code, email, incharge_name FROM affiliates WHERE id IN ($placeholders)");
$stmt->execute(array_values($partnerIds));
foreach ($stmt->fetchAll() as $row) {
$result[$row['id']] = $row;
}
} catch (Exception $e) {
logError('Error fetching partner info from shop DB', ['error' => $e->getMessage()]);
}
return $result;
}
/**
* Fetch client info from the shop database (clients table is in u752449863_rrshop)
* @param array $clientIds Array of client IDs
* @return array Keyed by client ID => [company_name, client_code, email, contact_person]
*/
private function getClientInfoFromShop($clientIds) {
$result = [];
if (empty($clientIds)) return $result;
try {
$shopPdo = new PDO(
"mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4",
"u752449863_rradmin",
DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
$placeholders = implode(',', array_fill(0, count($clientIds), '?'));
$stmt = $shopPdo->prepare("SELECT id, company_name, client_code, email, contact_person FROM clients WHERE id IN ($placeholders)");
$stmt->execute(array_values($clientIds));
foreach ($stmt->fetchAll() as $row) {
$result[$row['id']] = $row;
}
} catch (Exception $e) {
logError('Error fetching client info from shop DB', ['error' => $e->getMessage()]);
}
return $result;
}
public function assignTicket($ticketId, $adminId) {
try {
$stmt = $this->pdo->prepare("UPDATE support_tickets SET assigned_to = ?, updated_at = NOW() WHERE id = ?");
return $stmt->execute([$adminId, $ticketId]);
} catch (Exception $e) {
logError('Error assigning ticket', ['ticket_id' => $ticketId, 'admin_id' => $adminId, 'error' => $e->getMessage()]);
return false;
}
}
public function addTicketReply($ticketId, $message, $adminId, $isInternal = false) {
try {
$stmt = $this->pdo->prepare("
INSERT INTO support_messages (ticket_id, sender_type, sender_id, message, is_internal)
VALUES (?, 'admin', ?, ?, ?)
");
$result = $stmt->execute([$ticketId, $adminId, $message, $isInternal]);
if ($result) {
// Capture the inserted message ID BEFORE any other queries
$messageId = $this->pdo->lastInsertId();
// Update ticket timestamp
$stmt = $this->pdo->prepare("UPDATE support_tickets SET updated_at = NOW() WHERE id = ?");
$stmt->execute([$ticketId]);
// Return the actual message ID (not boolean) so attachments link correctly
return $messageId;
}
return false;
} catch (Exception $e) {
logError('Error adding ticket reply', ['ticket_id' => $ticketId, 'admin_id' => $adminId, 'error' => $e->getMessage()]);
return false;
}
}
public function getAdminUsers() {
try {
$stmt = $this->pdo->prepare("SELECT id, username, full_name, role FROM admin_users WHERE status = 'active' ORDER BY full_name");
$stmt->execute();
return $stmt->fetchAll();
} catch (Exception $e) {
logError('Error fetching admin users', ['error' => $e->getMessage()]);
return [];
}
}
// REDEMPTION MANAGEMENT METHODS
public function getAllRedemptions($status = null, $dateFilter = null, $limit = 50, $offset = 0) {
try {
$where = "1=1";
$params = [];
if ($status && $status !== 'all') {
$where .= " AND rr.status = ?";
$params[] = $status;
}
if ($dateFilter) {
switch ($dateFilter) {
case 'today':
$where .= " AND DATE(rr.created_at) = CURDATE()";
break;
case 'yesterday':
$where .= " AND DATE(rr.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)";
break;
case 'this_week':
$where .= " AND rr.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)";
break;
case 'this_month':
$where .= " AND rr.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)";
break;
}
}
$stmt = $this->pdo->prepare("
SELECT rr.*,
u.email as user_email,
au.full_name as processed_by_name,
(SELECT COUNT(*) FROM redemption_requests WHERE user_id = rr.user_id) as user_total_redemptions
FROM redemption_requests rr
LEFT JOIN users u ON rr.user_id = u.id
LEFT JOIN admin_users au ON rr.processed_by = au.id
WHERE $where
ORDER BY rr.created_at DESC
LIMIT $limit OFFSET $offset
");
$stmt->execute($params);
return $stmt->fetchAll();
} catch (Exception $e) {
logError('Error fetching redemptions', ['error' => $e->getMessage()]);
return [];
}
}
public function getRedemptionStats() {
try {
$stmt = $this->pdo->query("
SELECT
COUNT(*) as total,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing,
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) as cancelled,
SUM(CASE WHEN status = 'pending' THEN amount_inr ELSE 0 END) as pending_amount,
SUM(CASE WHEN status IN ('processing', 'completed') THEN amount_inr ELSE 0 END) as processed_amount
FROM redemption_requests
");
return $stmt->fetch();
} catch (Exception $e) {
logError('Error fetching redemption stats', ['error' => $e->getMessage()]);
return [
'total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0,
'failed' => 0, 'cancelled' => 0, 'pending_amount' => 0, 'processed_amount' => 0
];
}
}
public function updateRedemptionStatus($redemptionId, $status, $adminNotes, $adminId, $paymentRef = null, $paymentMode = 'UPI', $disbursalDate = null) {
try {
$this->pdo->beginTransaction();
// Get redemption details
$stmt = $this->pdo->prepare("SELECT * FROM redemption_requests WHERE id = ?");
$stmt->execute([$redemptionId]);
$redemption = $stmt->fetch();
if (!$redemption) {
throw new Exception('Redemption request not found');
}
// Update redemption status with payment fields
$stmt = $this->pdo->prepare("
UPDATE redemption_requests
SET status = ?, admin_notes = ?, processed_by = ?, processed_at = NOW(),
payment_reference = ?, payment_mode = ?, disbursal_date = ?,
updated_at = NOW()
WHERE id = ?
");
$finalDisbursalDate = ($status === 'completed' && $disbursalDate) ? $disbursalDate : null;
$finalPaymentRef = ($status === 'completed') ? $paymentRef : null;
$stmt->execute([$status, $adminNotes, $adminId, $finalPaymentRef, $paymentMode, $finalDisbursalDate, $redemptionId]);
// Update point transaction status
$stmt = $this->pdo->prepare("
UPDATE point_transactions
SET status = ?
WHERE reference_id = ? AND transaction_type = 'redeemed'
");
$stmt->execute([$status, $redemption['request_id']]);
// If status is failed or cancelled, refund the points
if (in_array($status, ['failed', 'cancelled'])) {
$stmt = $this->pdo->prepare("
UPDATE user_points
SET points = points + ?, total_redeemed = total_redeemed - ?
WHERE user_id = ?
");
$stmt->execute([$redemption['points_redeemed'], $redemption['points_redeemed'], $redemption['user_id']]);
// Add refund transaction
$refundDescription = "Refund for {$status} redemption request - " . $redemption['request_id'];
$stmt = $this->pdo->prepare("
INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id)
VALUES (?, 'earned', ?, 'refund', ?, ?)
");
$stmt->execute([$redemption['user_id'], $redemption['points_redeemed'], $refundDescription, $redemption['request_id']]);
}
$this->pdo->commit();
logError('Redemption status updated', [
'redemption_id' => $redemptionId,
'request_id' => $redemption['request_id'],
'old_status' => $redemption['status'],
'new_status' => $status,
'admin_id' => $adminId,
'admin_notes' => $adminNotes
]);
return true;
} catch (Exception $e) {
$this->pdo->rollback();
logError('Error updating redemption status', [
'redemption_id' => $redemptionId,
'error' => $e->getMessage()
]);
return false;
}
}
public function getRedemptionById($redemptionId) {
try {
$stmt = $this->pdo->prepare("
SELECT rr.*,
u.email as user_email, u.gender, u.date_of_birth, u.postcode,
au.full_name as processed_by_name,
up.points as user_current_points,
up.total_earned, up.total_redeemed
FROM redemption_requests rr
LEFT JOIN users u ON rr.user_id = u.id
LEFT JOIN admin_users au ON rr.processed_by = au.id
LEFT JOIN user_points up ON rr.user_id = up.user_id
WHERE rr.id = ?
");
$stmt->execute([$redemptionId]);
return $stmt->fetch();
} catch (Exception $e) {
logError('Error fetching redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]);
return null;
}
}
public function getRecentRedemptions($limit = 5) {
try {
$stmt = $this->pdo->prepare("
SELECT rr.request_id, rr.amount_inr, rr.status, rr.created_at, u.email as user_email
FROM redemption_requests rr
LEFT JOIN users u ON rr.user_id = u.id
ORDER BY rr.created_at DESC
LIMIT ?
");
$stmt->execute([$limit]);
return $stmt->fetchAll();
} catch (Exception $e) {
logError('Error fetching recent redemptions', ['error' => $e->getMessage()]);
return [];
}
}
// ========================================
// PARTNER REDEMPTION METHODS
// ========================================
/**
* Get a separate PDO connection to the rrshop database
*/
private function getShopPdo() {
return new PDO(
"mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4",
"u752449863_rradmin",
DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false]
);
}
/**
* Get all partner redemptions with affiliate details
*/
public function getAllPartnerRedemptions($status = null, $dateFilter = null, $limit = 50, $offset = 0) {
try {
$shopPdo = $this->getShopPdo();
$where = "1=1";
$params = [];
if ($status && $status !== 'all') {
$where .= " AND pr.status = ?";
$params[] = $status;
}
if ($dateFilter) {
switch ($dateFilter) {
case 'today':
$where .= " AND DATE(pr.created_at) = CURDATE()";
break;
case 'yesterday':
$where .= " AND DATE(pr.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)";
break;
case 'this_week':
$where .= " AND pr.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)";
break;
case 'this_month':
$where .= " AND MONTH(pr.created_at) = MONTH(NOW()) AND YEAR(pr.created_at) = YEAR(NOW())";
break;
}
}
$limit = intval($limit);
$offset = intval($offset);
$stmt = $shopPdo->prepare("
SELECT pr.*,
a.company_name, a.affiliate_code, a.email as partner_email,
a.incharge_name, a.mobile
FROM partner_redemptions pr
LEFT JOIN affiliates a ON pr.affiliate_id = a.id
WHERE $where
ORDER BY pr.created_at DESC
LIMIT $limit OFFSET $offset
");
$stmt->execute($params);
return $stmt->fetchAll();
} catch (Exception $e) {
logError('Error fetching partner redemptions', ['error' => $e->getMessage()]);
return [];
}
}
/**
* Get a single partner redemption with full affiliate details
*/
public function getPartnerRedemptionById($redemptionId) {
try {
$shopPdo = $this->getShopPdo();
$stmt = $shopPdo->prepare("
SELECT pr.*,
a.company_name, a.affiliate_code, a.email as partner_email,
a.incharge_name, a.mobile,
a.commission_balance, a.total_commission_earned, a.total_commission_redeemed,
a.total_signups, a.total_verified_signups
FROM partner_redemptions pr
LEFT JOIN affiliates a ON pr.affiliate_id = a.id
WHERE pr.id = ?
");
$stmt->execute([$redemptionId]);
return $stmt->fetch();
} catch (Exception $e) {
logError('Error fetching partner redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]);
return null;
}
}
/**
* Get partner redemption statistics
*/
public function getPartnerRedemptionStats() {
try {
$shopPdo = $this->getShopPdo();
$stmt = $shopPdo->query("
SELECT
COUNT(*) as total,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing,
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) as rejected,
SUM(CASE WHEN status IN ('pending','processing') THEN amount ELSE 0 END) as pending_amount,
SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) as completed_amount
FROM partner_redemptions
");
$result = $stmt->fetch();
return $result ?: ['total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'rejected' => 0, 'pending_amount' => 0, 'completed_amount' => 0];
} catch (Exception $e) {
logError('Error fetching partner redemption stats', ['error' => $e->getMessage()]);
return ['total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'rejected' => 0, 'pending_amount' => 0, 'completed_amount' => 0];
}
}
/**
* Update partner redemption status with disbursal details
* On 'completed': deducts from commission_balance, adds to total_commission_redeemed
* On 'rejected': refunds if balance was already deducted
*/
public function updatePartnerRedemptionStatus($redemptionId, $newStatus, $adminNotes, $paymentRef, $adminId, $paymentMode = 'UPI', $paymentAmount = null, $disbursalDate = null) {
try {
$shopPdo = $this->getShopPdo();
// Get current redemption
$stmt = $shopPdo->prepare("SELECT * FROM partner_redemptions WHERE id = ?");
$stmt->execute([$redemptionId]);
$redemption = $stmt->fetch();
if (!$redemption) {
logError('Partner redemption not found', ['id' => $redemptionId]);
return false;
}
$oldStatus = $redemption['status'];
$amount = floatval($redemption['amount']);
$affiliateId = $redemption['affiliate_id'];
// Check if admin exists in rrshop.admin_users (FK constraint)
$processedBy = null;
try {
$stmt = $shopPdo->prepare("SELECT id FROM admin_users WHERE id = ?");
$stmt->execute([$adminId]);
if ($stmt->fetch()) {
$processedBy = $adminId;
}
} catch (Exception $e) { /* admin_users may not exist */ }
$shopPdo->beginTransaction();
// Build rejection reason
$rejectionReason = ($newStatus === 'rejected') ? $adminNotes : $redemption['rejection_reason'];
// Ensure null for empty optional fields
if (empty($disbursalDate)) $disbursalDate = ($newStatus === 'completed') ? date('Y-m-d') : null;
if ($paymentAmount === null || $paymentAmount <= 0) $paymentAmount = ($newStatus === 'completed') ? $amount : null;
// Update the redemption record
$stmt = $shopPdo->prepare("
UPDATE partner_redemptions SET
status = ?,
payment_reference = ?,
payment_mode = ?,
payment_amount = ?,
disbursal_date = ?,
notes = ?,
rejection_reason = ?,
processed_by = ?,
processed_at = NOW(),
updated_at = NOW()
WHERE id = ?
");
$stmt->execute([
$newStatus,
$paymentRef ?: null,
$paymentMode ?: 'UPI',
$paymentAmount,
$disbursalDate,
$adminNotes ?: null,
$rejectionReason,
$processedBy,
$redemptionId
]);
// Handle balance changes
if ($newStatus === 'completed' && $oldStatus !== 'completed') {
$stmt = $shopPdo->prepare("
UPDATE affiliates SET
total_commission_redeemed = COALESCE(total_commission_redeemed, 0) + ?
WHERE id = ?
");
$stmt->execute([$amount, $affiliateId]);
} elseif ($newStatus === 'rejected' && $oldStatus === 'completed') {
$stmt = $shopPdo->prepare("
UPDATE affiliates SET
total_commission_redeemed = GREATEST(0, COALESCE(total_commission_redeemed, 0) - ?)
WHERE id = ?
");
$stmt->execute([$amount, $affiliateId]);
}
// Recalculate commission_balance
$stmt = $shopPdo->prepare("SELECT COALESCE(SUM(amount), 0) FROM partner_redemptions WHERE affiliate_id = ? AND status IN ('pending','processing')");
$stmt->execute([$affiliateId]);
$pendingSum = floatval($stmt->fetchColumn());
$stmt = $shopPdo->prepare("
UPDATE affiliates SET
commission_balance = total_commission_earned - COALESCE(total_commission_redeemed, 0) - ?
WHERE id = ?
");
$stmt->execute([$pendingSum, $affiliateId]);
$shopPdo->commit();
logError('Partner redemption updated', [
'redemption_id' => $redemptionId,
'old_status' => $oldStatus,
'new_status' => $newStatus,
'amount' => $amount,
'payment_amount' => $paymentAmount,
'admin_id' => $adminId
]);
return true;
} catch (Exception $e) {
if (isset($shopPdo) && $shopPdo->inTransaction()) {
$shopPdo->rollBack();
}
logError('Error updating partner redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]);
return 'DB Error: ' . $e->getMessage();
}
}
}
// Utility functions
function adminJsonResponse($success, $message, $data = null) {
header('Content-Type: application/json');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
echo json_encode([
'success' => $success,
'message' => $message,
'data' => $data
]);
exit;
}
?>
-------------------- END OF FILE --------------------
### FILE 3: RR com/admin-support.php
- Type: PHP
- Size: 117.75 KB
- Path: RR com
- Name: admin-support.php
------------------------------------------------------------
logout();
}
// Handle login form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$auth->isLoggedIn()) {
$username = isset($_POST['username']) ? sanitize($_POST['username']) : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
$rememberMe = isset($_POST['remember_me']);
if ($auth->login($username, $password, $rememberMe)) {
header('Location: support.php');
exit;
} else {
$loginError = 'Invalid username or password.';
}
}
// Handle AJAX requests for logged-in admins
if ($auth->isLoggedIn() && $_SERVER['REQUEST_METHOD'] === 'POST') {
$action = isset($_POST['action']) ? $_POST['action'] : '';
$admin = $auth->getCurrentAdmin();
switch ($action) {
// SUPPORT TICKET ACTIONS
case 'update_status':
$ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0;
$status = isset($_POST['status']) ? sanitize($_POST['status']) : '';
if ($ticketId && in_array($status, ['open', 'pending', 'resolved', 'closed'])) {
$success = $auth->updateTicketStatus($ticketId, $status, $admin['id']);
adminJsonResponse($success, $success ? 'Status updated successfully' : 'Failed to update status');
} else {
adminJsonResponse(false, 'Invalid parameters');
}
break;
case 'assign_ticket':
$ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0;
$adminId = isset($_POST['admin_id']) ? intval($_POST['admin_id']) : 0;
if ($ticketId && $adminId) {
$success = $auth->assignTicket($ticketId, $adminId);
adminJsonResponse($success, $success ? 'Ticket assigned successfully' : 'Failed to assign ticket');
} else {
adminJsonResponse(false, 'Invalid parameters');
}
break;
case 'add_reply':
$ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0;
$message = isset($_POST['message']) ? trim($_POST['message']) : '';
$isInternal = isset($_POST['is_internal']) ? (bool)$_POST['is_internal'] : false;
if ($ticketId && $message) {
$messageId = $auth->addTicketReply($ticketId, $message, $admin['id'], $isInternal);
if ($messageId) {
// Handle file attachments using the exact message ID returned
if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) {
$pdo = $auth->getConnection();
handleSupportAttachments($pdo, intval($messageId), $_FILES['attachments']);
}
adminJsonResponse(true, 'Reply added successfully');
} else {
adminJsonResponse(false, 'Failed to add reply');
}
} else {
adminJsonResponse(false, 'Message cannot be empty');
}
break;
// MEMBER REDEMPTION ACTIONS
case 'update_redemption_status':
$redemptionId = isset($_POST['redemption_id']) ? intval($_POST['redemption_id']) : 0;
$newStatus = isset($_POST['status']) ? sanitize($_POST['status']) : '';
$adminNotes = isset($_POST['admin_notes']) ? sanitize($_POST['admin_notes']) : '';
$paymentRef = isset($_POST['payment_reference']) ? sanitize($_POST['payment_reference']) : null;
$paymentMode = isset($_POST['payment_mode']) ? sanitize($_POST['payment_mode']) : 'UPI';
$disbursalDate = isset($_POST['disbursal_date']) && $_POST['disbursal_date'] !== '' ? sanitize($_POST['disbursal_date']) : null;
if (!in_array($newStatus, ['pending', 'processing', 'completed', 'failed', 'cancelled'])) {
adminJsonResponse(false, 'Invalid status');
}
if ($newStatus === 'completed' && empty($paymentRef)) {
adminJsonResponse(false, 'Transaction reference is required for completed payments');
}
if ($redemptionId && $newStatus) {
$success = $auth->updateRedemptionStatus($redemptionId, $newStatus, $adminNotes, $admin['id'], $paymentRef, $paymentMode, $disbursalDate);
adminJsonResponse($success, $success ? 'Redemption status updated successfully' : 'Failed to update status');
} else {
adminJsonResponse(false, 'Invalid parameters');
}
break;
// PARTNER REDEMPTION ACTIONS
case 'update_partner_redemption_status':
$redemptionId = isset($_POST['redemption_id']) ? intval($_POST['redemption_id']) : 0;
$newStatus = isset($_POST['status']) ? sanitize($_POST['status']) : '';
$adminNotes = isset($_POST['admin_notes']) ? sanitize($_POST['admin_notes']) : '';
$paymentRef = isset($_POST['payment_reference']) ? sanitize($_POST['payment_reference']) : '';
$paymentMode = isset($_POST['payment_mode']) ? sanitize($_POST['payment_mode']) : 'UPI';
$paymentAmount = isset($_POST['payment_amount']) && $_POST['payment_amount'] !== '' ? floatval($_POST['payment_amount']) : null;
$disbursalDate = isset($_POST['disbursal_date']) && $_POST['disbursal_date'] !== '' ? sanitize($_POST['disbursal_date']) : null;
if (!in_array($newStatus, ['pending', 'processing', 'completed', 'rejected'])) {
adminJsonResponse(false, 'Invalid status');
}
if ($newStatus === 'completed' && empty($paymentRef)) {
adminJsonResponse(false, 'Transaction number is required for completed payments');
}
if ($redemptionId && $newStatus) {
$result = $auth->updatePartnerRedemptionStatus($redemptionId, $newStatus, $adminNotes, $paymentRef, $admin['id'], $paymentMode, $paymentAmount, $disbursalDate);
if ($result === true) {
adminJsonResponse(true, 'Partner redemption updated successfully');
} else {
adminJsonResponse(false, is_string($result) ? $result : 'Failed to update status');
}
} else {
adminJsonResponse(false, 'Invalid parameters');
}
break;
case 'create_admin':
$username = isset($_POST['new_username']) ? sanitize($_POST['new_username']) : '';
$email = isset($_POST['new_email']) ? sanitize($_POST['new_email']) : '';
$password = isset($_POST['new_password']) ? $_POST['new_password'] : '';
$fullName = isset($_POST['new_full_name']) ? sanitize($_POST['new_full_name']) : '';
$role = isset($_POST['new_role']) ? sanitize($_POST['new_role']) : 'admin';
if ($username && $email && $password && $fullName) {
$success = $auth->createAdmin($username, $email, $password, $fullName, $role);
adminJsonResponse($success, $success ? 'Admin user created successfully' : 'Failed to create admin user (username or email may already exist)');
} else {
adminJsonResponse(false, 'All fields are required');
}
break;
// USER MANAGEMENT ACTIONS (super_admin only)
case 'create_user':
if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; }
$uName = isset($_POST['full_name']) ? trim($_POST['full_name']) : '';
$uEmail = isset($_POST['email']) ? trim(strtolower($_POST['email'])) : '';
$uMobile = isset($_POST['mobile']) ? trim($_POST['mobile']) : '';
$uPassword = isset($_POST['password']) ? $_POST['password'] : '';
$uRole = isset($_POST['role']) ? sanitize($_POST['role']) : 'admin';
$uTabs = isset($_POST['allowed_tabs']) ? implode(',', $_POST['allowed_tabs']) : 'all';
$uTicketTypes = isset($_POST['allowed_ticket_types']) ? implode(',', $_POST['allowed_ticket_types']) : 'all';
if (empty($uName) || empty($uEmail) || empty($uPassword)) {
adminJsonResponse(false, 'Name, email and password are required.');
break;
}
if (strlen($uPassword) < 6) {
adminJsonResponse(false, 'Password must be at least 6 characters.');
break;
}
$result = $auth->createAdmin($uEmail, $uEmail, $uPassword, $uName, $uRole, $uMobile, $uTabs, $uTicketTypes);
adminJsonResponse($result['success'], $result['message']);
break;
case 'update_user':
if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; }
$uId = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0;
$uName = isset($_POST['full_name']) ? trim($_POST['full_name']) : '';
$uEmail = isset($_POST['email']) ? trim(strtolower($_POST['email'])) : '';
$uMobile = isset($_POST['mobile']) ? trim($_POST['mobile']) : '';
$uRole = isset($_POST['role']) ? sanitize($_POST['role']) : 'admin';
$uTabs = isset($_POST['allowed_tabs']) ? implode(',', $_POST['allowed_tabs']) : 'all';
$uTicketTypes = isset($_POST['allowed_ticket_types']) ? implode(',', $_POST['allowed_ticket_types']) : 'all';
$uPassword = isset($_POST['password']) && !empty($_POST['password']) ? $_POST['password'] : null;
if (!$uId || empty($uName) || empty($uEmail)) {
adminJsonResponse(false, 'Name and email are required.');
break;
}
if ($uPassword && strlen($uPassword) < 6) {
adminJsonResponse(false, 'Password must be at least 6 characters.');
break;
}
$result = $auth->updateAdmin($uId, $uName, $uEmail, $uMobile, $uRole, $uTabs, $uTicketTypes, $uPassword);
adminJsonResponse($result['success'], $result['message']);
break;
case 'toggle_user_status':
if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; }
$uId = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0;
if ($uId) {
$success = $auth->toggleAdminStatus($uId);
adminJsonResponse($success, $success ? 'Status toggled successfully' : 'Cannot change this user\'s status');
} else {
adminJsonResponse(false, 'Invalid user ID');
}
break;
default:
adminJsonResponse(false, 'Invalid action');
}
}
// If admin is logged in, get data
if ($auth->isLoggedIn()) {
$admin = $auth->getCurrentAdmin();
$isSuperAdmin = ($admin['role'] === 'super_admin');
$allowedTicketTypes = $auth->getAllowedTicketTypes();
// Get current tab
$currentTab = isset($_GET['tab']) ? sanitize($_GET['tab']) : 'tickets';
// Enforce tab permissions (users tab = super_admin only)
if ($currentTab === 'users' && !$isSuperAdmin) $currentTab = 'tickets';
if (!$isSuperAdmin && !$auth->hasTabAccess($currentTab)) {
// Fallback to first allowed tab
$allTabs = ['tickets','redemptions','partner_redemptions'];
$currentTab = 'tickets';
foreach ($allTabs as $t) {
if ($auth->hasTabAccess($t)) { $currentTab = $t; break; }
}
}
// Get filters from URL
$statusFilter = isset($_GET['status']) ? sanitize($_GET['status']) : null;
$priorityFilter = isset($_GET['priority']) ? sanitize($_GET['priority']) : null;
$senderTypeFilter = isset($_GET['sender_type']) ? sanitize($_GET['sender_type']) : null;
$dateFilter = isset($_GET['date_filter']) ? sanitize($_GET['date_filter']) : null;
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$limit = 25;
$offset = ($page - 1) * $limit;
// Get specific ticket if viewing one
$viewTicketId = isset($_GET['ticket']) ? intval($_GET['ticket']) : null;
$viewTicket = null;
$ticketMessages = [];
$messageAttachments = [];
if ($viewTicketId) {
$viewTicket = $auth->getTicketById($viewTicketId);
if ($viewTicket) {
$ticketMessages = $auth->getTicketMessages($viewTicketId, true);
// Load attachments for all messages
if ($supportHelperLoaded && !empty($ticketMessages)) {
try {
$db = new Database();
$pdo = $db->getConnection();
$msgIds = array_column($ticketMessages, 'id');
if (!empty($msgIds)) {
$messageAttachments = getAttachmentsForMessages($pdo, $msgIds);
}
} catch (Exception $e) {
$messageAttachments = [];
}
}
}
}
// Get specific redemption if viewing one
$viewRedemptionId = isset($_GET['redemption']) ? intval($_GET['redemption']) : null;
$viewRedemption = null;
if ($viewRedemptionId) {
if ($currentTab === 'partner_redemptions') {
$viewRedemption = $auth->getPartnerRedemptionById($viewRedemptionId);
} else {
$viewRedemption = $auth->getRedemptionById($viewRedemptionId);
}
}
// Get data based on current tab
if ($currentTab === 'redemptions') {
$redemptions = $auth->getAllRedemptions($statusFilter, $dateFilter, $limit, $offset);
$redemptionStats = $auth->getRedemptionStats();
} elseif ($currentTab === 'partner_redemptions') {
$partnerRedemptions = $auth->getAllPartnerRedemptions($statusFilter, $dateFilter, $limit, $offset);
$partnerRedemptionStats = $auth->getPartnerRedemptionStats();
} elseif ($currentTab === 'users' && $isSuperAdmin) {
$allAdminUsers = $auth->getAllAdminUsersDetailed();
$editUserId = isset($_GET['edit_user']) ? intval($_GET['edit_user']) : null;
$editUser = $editUserId ? $auth->getAdminById($editUserId) : null;
} else {
$tickets = $auth->getAllTickets($statusFilter, $priorityFilter, $senderTypeFilter, $limit, $offset, $allowedTicketTypes);
$ticketStats = $auth->getTicketStats($allowedTicketTypes);
}
$adminUsers = $auth->getAdminUsers();
}
?>
Support - Relevant Reflex
-------------------- END OF FILE --------------------
### FILE 4: RR com/articles.php
- Type: PHP
- Size: 28.79 KB
- Path: RR com
- Name: articles.php
------------------------------------------------------------
Survey Tips, Guides & Articles for India | Relevant Reflex
Articles & Guides
Honest advice, tips and guides to help you earn more from paid surveys in India.
★ Featured
How to Earn Money with Online Surveys in India: The Complete Guide (2026)
Everything you need to know — what online surveys are, how much you can realistically earn, step-by-step how to start, and pro tips from a platform with 50,000+ verified Indian members.
Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?
An honest breakdown based on real data from 50,000+ members — beginner to experienced earnings tables, per-survey payouts, and the 5 factors that determine your income.
Online Surveys India for Students: Earn Pocket Money in College (2026)
Why college students are a valued survey demographic, how to fit surveys into your schedule, what you can realistically earn, and UPI payout tips for students.
Online Surveys India for Housewives: Work From Home and Earn in 2026
Why homemakers receive high-value surveys, a practical daily schedule, realistic earnings of ₹1,000–₹3,500/month, and how UPI payout works for financial independence.
How to Earn Money with Online Surveys in India: The Complete Guide (2026)
Everything you need to know — what surveys are, how much you earn, step-by-step how to start, and pro tips from a platform with 50,000+ verified members.
Key indicators of legitimate platforms, red flags of scams, and how to verify a survey site before joining. Essential reading for anyone starting with online surveys.
Practical strategies to increase your monthly income — profile optimisation, timing, platform selection, and the profiler survey habit that most members overlook.
From registration to your first UPI payout — choosing the right platforms, setting up your profile, understanding survey types, and payment methods in India.
Overview of platforms that work best for Indian users — payment methods, survey availability, UPI support, and which ones suit different types of members.
How to balance survey participation with your daily routine — when to check, how to prioritise higher-paying surveys, and habits that make consistent earners.
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking "Accept All", you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 5: RR com/check-session.php
- Type: PHP
- Size: 976 B
- Path: RR com
- Name: check-session.php
------------------------------------------------------------
checkSessionTimeout(120);
$isValid = isLoggedIn();
$user = null;
if ($isValid) {
$user = getCurrentUser();
// If user doesn't exist or is not active, invalidate session
if (!$user || $user['status'] !== 'active') {
logout();
$isValid = false;
}
}
echo json_encode([
'valid' => $isValid,
'user_id' => $isValid ? $user['id'] : null,
'email' => $isValid ? $user['email'] : null,
'timestamp' => time()
]);
} catch (Exception $e) {
logError('Session check error', ['error' => $e->getMessage()]);
echo json_encode([
'valid' => false,
'error' => 'Session check failed',
'timestamp' => time()
]);
}
?>
-------------------- END OF FILE --------------------
### FILE 6: RR com/close-project-rewards.php
- Type: PHP
- Size: 20.69 KB
- Path: RR com
- Name: close-project-rewards.php
------------------------------------------------------------
mailed incentive: member gets higher amount (survey took longer)
* - If actual LOI incentive < mailed incentive: member keeps original promise (can't reduce)
* - Final reward = max(mailed_incentive, actual_loi_incentive)
*
* POINTS CONVERSION:
* - 1 point = ₹0.50 (i.e. ₹1 = 2 points)
* - All incentive calculations are in rupees first, then converted to points for crediting
*
* Place in: /public_html/close-project-rewards.php
* Called by: clients/close-project.php when project status changes to "Closed"
*/
// Conversion rate: 1 point = ₹0.50, so ₹1 = 2 points
define('POINTS_PER_RUPEE', 2);
/**
* Calculate incentive from LOI (same formula used in send-invitations.php)
* Base ₹10 + ₹1 per minute beyond 5 minutes
* Returns value in RUPEES
*/
function calculateIncentiveFromLOI($loiMinutes) {
$base = 10;
$extra = max(0, floor($loiMinutes) - 5);
return $base + $extra;
}
/**
* Convert rupees to points
*/
function rupeesToPoints($rupees) {
return round($rupees * POINTS_PER_RUPEE);
}
function processProjectCloseRewards($projectNumericId, $shopPdo = null, $panelPdo = null) {
$summary = [
'members_rewarded' => 0,
'total_member_points' => 0,
'total_member_rupees' => 0,
'affiliates_rewarded' => 0,
'total_affiliate_commission' => 0,
'incentive_note' => '',
'errors' => []
];
try {
// Get DB connections
if ($shopPdo === null) {
if (function_exists('getClientDBConnection')) {
$shopPdo = getClientDBConnection();
} elseif (function_exists('getDBConnection')) {
$shopPdo = getDBConnection();
} else {
throw new Exception('No shop database connection available');
}
}
if ($panelPdo === null) {
if (function_exists('getPanelDBConnection')) {
$panelPdo = getPanelDBConnection();
} else {
$summary['errors'][] = 'No panel DB connection - member points not credited';
$panelPdo = null;
}
}
// Get project details
$stmt = $shopPdo->prepare("SELECT * FROM projects WHERE id = ?");
$stmt->execute([$projectNumericId]);
$project = $stmt->fetch();
if (!$project) {
$summary['errors'][] = 'Project not found';
return $summary;
}
$projectCode = $project['project_id']; // e.g. RRIT130226001
$eloi = (int)($project['eloi'] ?? 0);
// =====================================================
// CALCULATE ACTUAL AVG LOI FOR THE PROJECT
// =====================================================
$actualAvgLoiMinutes = 0;
try {
$stmt = $shopPdo->prepare("
SELECT AVG(actual_loi_seconds) as avg_loi_seconds,
SUM(CASE WHEN actual_loi_seconds IS NOT NULL THEN 1 ELSE 0 END) as with_loi
FROM survey_urls
WHERE project_id = ? AND status = 'complete' AND quality_flag = 'valid'
");
$stmt->execute([$projectCode]);
$loiStats = $stmt->fetch();
if ($loiStats && $loiStats['with_loi'] > 0 && $loiStats['avg_loi_seconds'] > 0) {
$actualAvgLoiMinutes = round($loiStats['avg_loi_seconds'] / 60, 1);
} else {
// Fallback to ELOI if no actual LOI data
$actualAvgLoiMinutes = $eloi;
}
} catch (Exception $e) {
$actualAvgLoiMinutes = $eloi;
}
// Calculate actual-LOI-based incentive (in RUPEES)
$actualLoiIncentive = calculateIncentiveFromLOI($actualAvgLoiMinutes);
// Determine reward per complete from project level (in RUPEES)
$rewardPerComplete = floatval($project['reward_per_complete'] ?? 0);
// Get all selections for this project
$stmt = $shopPdo->prepare("SELECT * FROM project_selections WHERE project_id = ?");
$stmt->execute([$projectNumericId]);
$selections = $stmt->fetchAll();
if (empty($selections)) {
$summary['errors'][] = 'No selections found';
return $summary;
}
foreach ($selections as $selection) {
$selectionId = $selection['id'];
// =====================================================
// DETERMINE MAILED (ORIGINAL) INCENTIVE (in RUPEES)
// =====================================================
$mailedIncentive = $rewardPerComplete > 0 ? $rewardPerComplete : floatval($selection['reward_per_complete'] ?? 0);
if ($mailedIncentive <= 0) {
$mailedIncentive = floatval($selection['incentive_amount'] ?? 0);
}
// =====================================================
// APPLY INCENTIVE MODEL: max(mailed, actual_loi_based)
// Both values are in RUPEES
// =====================================================
$finalRewardRupees = max($mailedIncentive, $actualLoiIncentive);
// Convert RUPEES to POINTS (₹1 = 2 points)
$finalRewardPoints = rupeesToPoints($finalRewardRupees);
// Determine the reason/note
$rewardNote = '';
if ($actualLoiIncentive > $mailedIncentive && $mailedIncentive > 0) {
$rewardNote = ' (Adjusted up: survey avg LOI ' . $actualAvgLoiMinutes . ' min exceeded estimate, incentive increased from ₹' . number_format($mailedIncentive, 0) . ' to ₹' . number_format($finalRewardRupees, 0) . ')';
$summary['incentive_note'] = 'Actual avg LOI (' . $actualAvgLoiMinutes . ' min) exceeded estimate (' . $eloi . ' min). Member incentive adjusted upward.';
} elseif ($actualLoiIncentive < $mailedIncentive && $mailedIncentive > 0) {
$rewardNote = ' (Original promised incentive maintained despite lower avg LOI)';
if (empty($summary['incentive_note'])) {
$summary['incentive_note'] = 'Actual avg LOI (' . $actualAvgLoiMinutes . ' min) was lower than estimate (' . $eloi . ' min). Original promised incentive of ₹' . number_format($mailedIncentive, 0) . ' maintained for members.';
}
}
if ($finalRewardRupees <= 0) {
$summary['errors'][] = "Selection #{$selectionId}: no reward set - skipping member rewards";
}
// Find all selection_members with sample_status = 'complete'
$stmt = $shopPdo->prepare("
SELECT sm.* FROM selection_members sm
WHERE sm.selection_id = ? AND sm.sample_status = 'complete'
");
$stmt->execute([$selectionId]);
$completeMembers = $stmt->fetchAll();
foreach ($completeMembers as $member) {
$userId = $member['user_id'];
try {
// ========================================
// 1. CREDIT MEMBER SURVEY REWARD
// ========================================
if ($finalRewardRupees > 0 && $panelPdo !== null) {
// Check if already credited
$alreadyCredited = false;
try {
$stmt = $shopPdo->prepare("SELECT id FROM survey_rewards_log WHERE user_id = ? AND project_id = ?");
$stmt->execute([$userId, $projectCode]);
$alreadyCredited = (bool)$stmt->fetch();
} catch (Exception $e) { /* table might not exist */ }
if (!$alreadyCredited) {
// Log in shop DB (store POINTS)
try {
$stmt = $shopPdo->prepare("
INSERT INTO survey_rewards_log (user_id, project_id, selection_id, points_awarded, status)
VALUES (?, ?, ?, ?, 'pending')
");
$stmt->execute([$userId, $projectCode, $selectionId, $finalRewardPoints]);
} catch (Exception $e) {
error_log("survey_rewards_log insert: " . $e->getMessage());
}
// Credit POINTS in panel DB
$stmt = $panelPdo->prepare("
UPDATE user_points SET points = points + ?, total_earned = total_earned + ? WHERE user_id = ?
");
$stmt->execute([$finalRewardPoints, $finalRewardPoints, $userId]);
if ($stmt->rowCount() === 0) {
$stmt = $panelPdo->prepare("
INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ?
");
$stmt->execute([$userId, $finalRewardPoints, $finalRewardPoints, $finalRewardPoints, $finalRewardPoints]);
}
// Add transaction record (POINTS) with LOI adjustment note
$txnDesc = 'Survey reward: ' . $projectCode . ' - ' . $project['project_name']
. ' (₹' . number_format($finalRewardRupees, 2) . ' = ' . $finalRewardPoints . ' pts)'
. $rewardNote;
$stmt = $panelPdo->prepare("
INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id)
VALUES (?, 'earned', ?, 'survey_reward', ?, ?)
");
$stmt->execute([$userId, $finalRewardPoints, $txnDesc, $projectCode]);
// Update survey_responses in panel DB
// incentive_amount = RUPEES (what was promised), points_awarded = POINTS
try {
$stmt = $panelPdo->prepare("
INSERT INTO survey_responses (user_id, project_id, selection_id, status, incentive_amount, points_awarded, reward_status, completed_at)
VALUES (?, ?, ?, 'complete', ?, ?, 'pending', NOW())
ON DUPLICATE KEY UPDATE points_awarded = ?, reward_status = 'pending'
");
$stmt->execute([$userId, $projectCode, $selectionId, $finalRewardRupees, $finalRewardPoints, $finalRewardPoints]);
} catch (Exception $e) { /* non-critical */ }
// Update selection_members points_awarded (POINTS)
try {
$stmt = $shopPdo->prepare("UPDATE selection_members SET points_awarded = ? WHERE selection_id = ? AND user_id = ?");
$stmt->execute([$finalRewardPoints, $selectionId, $userId]);
} catch (Exception $e) { /* non-critical */ }
$summary['members_rewarded']++;
$summary['total_member_points'] += $finalRewardPoints;
$summary['total_member_rupees'] += $finalRewardRupees;
}
}
// ==========================================
// 2. CREDIT AFFILIATE REVENUE SHARE
// ==========================================
$stmt = $shopPdo->prepare("
SELECT a.id as affiliate_id, a.signup_reward
FROM affiliate_signups asu
JOIN affiliates a ON asu.affiliate_id = a.id
WHERE asu.panel_user_id = ? AND asu.email_verified = 1
LIMIT 1
");
$stmt->execute([$userId]);
$affiliateLink = $stmt->fetch();
if ($affiliateLink) {
$affiliateId = $affiliateLink['affiliate_id'];
$revenueShare = 0;
// Try survey_reward column first
try {
$stmt = $shopPdo->prepare("SELECT survey_reward FROM affiliates WHERE id = ?");
$stmt->execute([$affiliateId]);
$row = $stmt->fetch();
$revenueShare = floatval($row['survey_reward'] ?? 0);
} catch (Exception $e) { /* column might not exist */ }
// Fallback: revenue_share_per_survey
if ($revenueShare <= 0) {
try {
$stmt = $shopPdo->prepare("SELECT revenue_share_per_survey FROM affiliates WHERE id = ?");
$stmt->execute([$affiliateId]);
$row = $stmt->fetch();
$revenueShare = floatval($row['revenue_share_per_survey'] ?? 0);
} catch (Exception $e) { /* column might not exist */ }
}
// Fallback: percentage of member reward (use RUPEE value)
if ($revenueShare <= 0 && $finalRewardRupees > 0) {
$commPct = floatval($project['affiliate_commission_pct'] ?? 10);
$revenueShare = round($finalRewardRupees * ($commPct / 100), 2);
}
if ($revenueShare > 0) {
$alreadyCredited = false;
try {
$stmt = $shopPdo->prepare("
SELECT id FROM partner_commission_log
WHERE affiliate_id = ? AND type = 'survey_revenue_share' AND reference_id = ? AND panel_user_id = ?
");
$stmt->execute([$affiliateId, $projectCode, $userId]);
$alreadyCredited = (bool)$stmt->fetch();
} catch (Exception $e) { /* table might not exist */ }
if (!$alreadyCredited) {
try {
$stmt = $shopPdo->prepare("
INSERT INTO partner_commission_log (affiliate_id, type, amount, reference_id, panel_user_id, description)
VALUES (?, 'survey_revenue_share', ?, ?, ?, ?)
");
$stmt->execute([$affiliateId, $revenueShare, $projectCode, $userId,
'Survey revenue share: ' . $projectCode . ' - ' . $project['project_name']]);
} catch (Exception $e) {
error_log("partner_commission_log insert: " . $e->getMessage());
}
$stmt = $shopPdo->prepare("
UPDATE affiliates SET total_commission_earned = total_commission_earned + ?,
commission_balance = commission_balance + ? WHERE id = ?
");
$stmt->execute([$revenueShare, $revenueShare, $affiliateId]);
$summary['affiliates_rewarded']++;
$summary['total_affiliate_commission'] += $revenueShare;
}
}
}
// ==========================================
// 3. CREDIT MEMBER REFERRAL SURVEY COMMISSION
// ==========================================
// Check if this user was referred by another member
if ($panelPdo !== null) {
try {
$refStmt = $panelPdo->prepare("
SELECT id, referrer_user_id FROM member_referral_clicks
WHERE referee_user_id = ? AND email_verified = 1
LIMIT 1
");
$refStmt->execute([$userId]);
$refRow = $refStmt->fetch();
if ($refRow && $refRow['referrer_user_id'] != $userId) {
$mReferrerId = $refRow['referrer_user_id'];
$surveyCommPts = 10; // Rs.5 = 10 points
$surveyCommRs = 5.00;
// Prevent double crediting for same user+project
$dupCheck = $panelPdo->prepare("
SELECT COUNT(*) as cnt FROM point_transactions
WHERE user_id = ? AND source = 'member_referral_survey'
AND reference_id = ? AND description LIKE ?
");
$dupCheck->execute([$mReferrerId, $projectCode, '%uid:'.$userId.'%']);
$dupRow = $dupCheck->fetch();
if ($dupRow['cnt'] == 0) {
// Award points to referrer
$panelPdo->prepare("
INSERT INTO user_points (user_id, points, total_earned)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ?
")->execute([$mReferrerId, $surveyCommPts, $surveyCommPts, $surveyCommPts, $surveyCommPts]);
$panelPdo->prepare("
INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id, created_at)
VALUES (?, 'earned', ?, 'member_referral_survey', ?, ?, NOW())
")->execute([
$mReferrerId,
$surveyCommPts,
'Survey referral reward: your referral completed ' . $projectCode . ' (₹5 = 10 pts, uid:' . $userId . ')',
$projectCode
]);
// Update survey_commission_earned on the click record
$panelPdo->prepare("
UPDATE member_referral_clicks
SET survey_commission_earned = survey_commission_earned + ?
WHERE id = ?
")->execute([$surveyCommRs, $refRow['id']]);
}
}
} catch (Exception $e) {
$summary['errors'][] = "Member referral survey commission (user {$userId}): " . $e->getMessage();
}
}
} catch (Exception $e) {
$summary['errors'][] = "User {$userId}: " . $e->getMessage();
}
}
}
} catch (Exception $e) {
$summary['errors'][] = $e->getMessage();
}
return $summary;
}
?>
-------------------- END OF FILE --------------------
### FILE 7: RR com/config.php
- Type: PHP
- Size: 3.88 KB
- Path: RR com
- Name: config.php
------------------------------------------------------------
connection = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
DB_USER,
DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
);
} catch (PDOException $e) {
error_log("Database connection failed: " . $e->getMessage());
die("Connection failed. Please try again later.");
}
}
public function getConnection() {
return $this->connection;
}
}
// Utility functions
function sanitize($data) {
return htmlspecialchars(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8');
}
function generateSecureToken($length = 64) {
return bin2hex(random_bytes($length / 2));
}
function hashPassword($password) {
return password_hash($password, PASSWORD_DEFAULT);
}
function verifyPassword($password, $hash) {
return password_verify($password, $hash);
}
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) &&
preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email);
}
function validatePassword($password) {
// At least 8 characters
return strlen($password) >= 8;
}
function validateDateOfBirth($dob) {
$date = DateTime::createFromFormat('Y-m-d', $dob);
if (!$date) return false;
// Check if user is at least 18 years old
$today = new DateTime();
$age = $today->diff($date)->y;
return $age >= 18;
}
function validatePostcode($postcode) {
// Indian postal code validation (6 digits)
return preg_match('/^[0-9]{6}$/', $postcode);
}
// JSON response helper
function jsonResponse($success, $message, $data = null) {
header('Content-Type: application/json');
echo json_encode([
'success' => $success,
'message' => $message,
'data' => $data
]);
exit;
}
// Error logging function
function logError($message, $context = []) {
$logMessage = date('Y-m-d H:i:s') . ' - ' . $message;
if (!empty($context)) {
$logMessage .= ' - Context: ' . json_encode($context);
}
error_log($logMessage . PHP_EOL, 3, 'errors.log');
}
?>
-------------------- END OF FILE --------------------
### FILE 8: RR com/contact.php
- Type: PHP
- Size: 25.44 KB
- Path: RR com
- Name: contact.php
------------------------------------------------------------
$name,
'email' => $email,
'subject' => $subject,
'message' => substr($message, 0, 100) . '...'
]);
$success_message = 'Thank you for your message! We\'ll get back to you within 24 hours.';
// Clear form data
$_POST = [];
}
}
?>
Contact Relevant Reflex | Survey Platform Support India
Contact Us
We're here to help! Get in touch with our support team for any questions or assistance you need.
Email Support
Get help with your account, payments, or technical issues.
Account approval is typically instant after email verification. You can start taking surveys immediately after verifying your email address.
When do I get paid for completed surveys?
Payments are processed according to each survey provider's schedule. Most rewards are credited within 2-5 business days after survey completion.
Why was I disqualified from a survey?
Survey disqualifications happen when your profile doesn't match the target demographic. This is normal and helps ensure survey quality. Keep trying - there are surveys for all profiles!
How can I increase my survey opportunities?
Complete your profile thoroughly, answer profiling questions honestly, and check your dashboard regularly for new opportunities.
Is Relevant Reflex really free to join?
Yes! Joining Relevant Reflex is completely free. We never charge fees to our members. Legitimate survey companies pay YOU for your opinions, not the other way around.
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking “Accept All”, you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 9: RR com/dashboard.php
- Type: PHP
- Size: 70.42 KB
- Path: RR com
- Name: dashboard.php
------------------------------------------------------------
redirectToLogin('Session expired. Please log in again.'); }
try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('DB failed: ' . $e->getMessage()); die('System error.'); }
// Award onboarding points
if (!$user['onboarding_points_awarded']) {
try {
$pdo->beginTransaction();
$pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, 10.00, 10.00) ON DUPLICATE KEY UPDATE points = points + 10.00, total_earned = total_earned + 10.00")->execute([$user['id']]);
$pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', 10.00, 'onboarding', 'Welcome bonus for joining Relevant Reflex')")->execute([$user['id']]);
$pdo->prepare("UPDATE users SET onboarding_points_awarded = 1 WHERE id = ?")->execute([$user['id']]);
$pdo->commit(); $user = getCurrentUser();
} catch (Exception $e) { $pdo->rollback(); }
}
$userPoints = ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0];
try { $stmt = $pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$user['id']]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {}
$profilerSections = ['personal_background'=>'Personal Background','household_family'=>'Household & Family','shopping_lifestyle'=>'Shopping & Lifestyle','technology_digital'=>'Technology & Digital','travel_transportation'=>'Travel & Transportation','health_fitness'=>'Health & Fitness','entertainment_media'=>'Entertainment & Media','food_dining'=>'Food & Dining','financial_services'=>'Financial Services','communication_payments'=>'Communication & Payments','household_classification'=>'Household Classification (ISEC)'];
$profilerCompletion = [];
try { $stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) $profilerCompletion[$row['section']] = $row; } catch (Exception $e) {}
$completedSections = 0;
foreach ($profilerSections as $k => $n) { if (isset($profilerCompletion[$k]) && $profilerCompletion[$k]['is_completed']) $completedSections++; }
$mobileVerified = false; $mobileNumber = '';
try { $stmt = $pdo->prepare("SELECT mobile_number, is_verified FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $md = $stmt->fetch(); if ($md) { $mobileVerified = $md['is_verified']; $mobileNumber = $md['mobile_number']; } } catch (Exception $e) {}
$upiId = '';
try { $stmt = $pdo->prepare("SELECT response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id = 'upi_id'"); $stmt->execute([$user['id']]); $ud = $stmt->fetch(); if ($ud) $upiId = json_decode($ud['response'], true); } catch (Exception $e) {}
$panNumber = ''; $panName = ''; $panStatus = '';
try {
$stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id IN ('pan_number','pan_name','pan_status')");
$stmt->execute([$user['id']]);
while ($row = $stmt->fetch()) {
$val = json_decode($row['response'], true);
if ($row['question_id'] === 'pan_number') $panNumber = $val ?: '';
elseif ($row['question_id'] === 'pan_name') $panName = $val ?: '';
elseif ($row['question_id'] === 'pan_status') $panStatus = $val ?: '';
}
if (!empty($panNumber) && empty($panStatus)) $panStatus = 'pending';
} catch (Exception $e) {}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_upi') {
$newUpiId = isset($_POST['upi_id']) ? sanitize($_POST['upi_id']) : '';
if (!empty($newUpiId) && preg_match('/^[\w\.\-]+@[\w\.\-]+$/', $newUpiId)) {
try { $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'upi_id', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j = json_encode($newUpiId); $stmt->execute([$user['id'], $j, $j]); $upiId = $newUpiId; $success_message = "UPI ID updated successfully!"; } catch (Exception $e) { $error_message = "Error updating UPI ID."; }
} else { $error_message = "Please enter a valid UPI ID (e.g., yourname@paytm)."; }
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_pan') {
$newPanNumber = strtoupper(trim($_POST['pan_number'] ?? ''));
$newPanName = trim($_POST['pan_name'] ?? '');
if (!empty($newPanNumber) && preg_match('/^[A-Z]{5}[0-9]{4}[A-Z]$/', $newPanNumber) && !empty($newPanName) && strlen($newPanName) >= 3) {
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_number', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()");
$j = json_encode($newPanNumber); $stmt->execute([$user['id'], $j, $j]);
$stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_name', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()");
$j2 = json_encode($newPanName); $stmt->execute([$user['id'], $j2, $j2]);
// Reset status to pending on any edit (admin must re-approve)
$stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_status', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()");
$j3 = json_encode('pending'); $stmt->execute([$user['id'], $j3, $j3]);
$pdo->commit();
$panNumber = $newPanNumber; $panName = $newPanName; $panStatus = 'pending';
$success_message = "PAN details saved successfully! Verification is pending.";
} catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); $error_message = "Error saving PAN details."; }
} else {
$error_message = "Invalid PAN. Must be 10 characters (e.g., ABCDE1234F) and name must be at least 3 characters.";
}
}
$userTickets = [];
try { $stmt = $pdo->prepare("SELECT st.*, (SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count, (SELECT sm.created_at FROM support_messages sm WHERE sm.ticket_id = st.id ORDER BY sm.created_at DESC LIMIT 1) as last_reply FROM support_tickets st WHERE st.user_id = ? ORDER BY st.created_at DESC LIMIT 10"); $stmt->execute([$user['id']]); $userTickets = $stmt->fetchAll(); } catch (Exception $e) {}
$userRedemptions = [];
try { $stmt = $pdo->prepare("SELECT * FROM redemption_requests WHERE user_id = ? ORDER BY created_at DESC LIMIT 5"); $stmt->execute([$user['id']]); $userRedemptions = $stmt->fetchAll(); } catch (Exception $e) {}
// Survey history from shop DB
$surveys = []; $surveyStats = ['total'=>0,'completes'=>0,'pending'=>0,'flagged'=>0];
try {
$shopPdo = new PDO("mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4","u752449863_rradmin","S@n@h2016",[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]);
$cols = array_column($shopPdo->query("SHOW COLUMNS FROM survey_urls")->fetchAll(), 'Field');
$hasQF = in_array('quality_flag', $cols); $hasLoi = in_array('actual_loi_seconds', $cols);
$hasCompAt = in_array('completed_at', $cols); $hasQN = in_array('quality_notes', $cols);
$pcols = array_column($shopPdo->query("SHOW COLUMNS FROM projects")->fetchAll(), 'Field');
$hasCS = in_array('closure_status', $pcols); $hasSP = in_array('speedster_threshold_pct', $pcols);
$qf = $hasQF ? "su.quality_flag" : "'valid' as quality_flag";
$qn = $hasQN ? "su.quality_notes" : "NULL as quality_notes";
$loi = $hasLoi ? "su.actual_loi_seconds" : "NULL as actual_loi_seconds";
$cat = $hasCompAt ? "su.completed_at" : "NULL as completed_at";
$cs = $hasCS ? "p.closure_status" : "'none' as closure_status";
$sp = $hasSP ? "p.speedster_threshold_pct" : "33.33 as speedster_threshold_pct";
$stmt = $shopPdo->prepare("
SELECT su.status as url_status, su.clicked_at, su.created_at as sent_at, su.rr_proxy_url,
$qf, $qn, $loi, $cat,
p.project_id, p.project_name, p.eloi, p.industry, p.status as project_status, $cs, $sp
FROM survey_urls su
INNER JOIN projects p ON su.project_id = p.project_id
WHERE su.sent_to_user_id = ? AND su.status NOT IN ('available')
ORDER BY su.created_at DESC LIMIT 30
");
$stmt->execute([$user['id']]); $surveys = $stmt->fetchAll();
foreach ($surveys as $s) { $surveyStats['total']++; if ($s['url_status']==='complete') { $surveyStats['completes']++; $q=$s['quality_flag']??'valid'; if (in_array($q,['speedster','ip_duplicate','client_flagged'])) $surveyStats['flagged']++; elseif ($s['project_status']!=='Closed') $surveyStats['pending']++; } }
} catch (Exception $e) { error_log("Survey stats: ".$e->getMessage()); }
// Compute actionable surveys (can be taken right now)
$actionableSurveys = [];
foreach ($surveys as $s) {
if (in_array($s['url_status'], ['sent','clicked']) && $s['project_status'] === 'Live' && !empty($s['rr_proxy_url']))
$actionableSurveys[] = $s;
}
$actionableCount = count($actionableSurveys);
$firstActionable = $actionableCount > 0 ? $actionableSurveys[0] : null;
// Get survey-related point transactions from panel DB
$surveyPointsByProject = [];
try {
$stmt = $pdo->prepare("SELECT reference_id, points, description, created_at FROM point_transactions WHERE user_id = ? AND source IN ('survey','survey_reward') AND transaction_type = 'earned' ORDER BY created_at DESC");
$stmt->execute([$user['id']]);
while ($row = $stmt->fetch()) {
if ($row['reference_id']) $surveyPointsByProject[$row['reference_id']] = $row;
}
} catch (Exception $e) {}
// Get full rewards history for Rewards tab
$rewardsHistory = [];
try {
$stmt = $pdo->prepare("SELECT transaction_type, points, source, description, reference_id, status, created_at FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT 50");
$stmt->execute([$user['id']]);
$rewardsHistory = $stmt->fetchAll();
} catch (Exception $e) {}
$joinDateFormatted = (new DateTime($user['created_at']))->format('M Y');
$profilePct = round(($completedSections / count($profilerSections)) * 100);
$firstName = htmlspecialchars($user['first_name'] ?? explode('@',$user['email'])[0]);
$initials = strtoupper(substr($user['first_name']??$user['email'],0,1).substr($user['last_name']??'',0,1));
if (strlen($initials)<2) $initials = strtoupper(substr($user['email'],0,2));
function getSurveyLabel($s) {
$st=$s['url_status']; $qf=$s['quality_flag']??'valid'; $ps=$s['project_status'];
if ($st==='sent') return ['Invited','label-neutral','You have been invited to this survey. Click "Take Survey" below to participate.'];
if ($st==='clicked') return ['In Progress','label-warn','You started this survey but haven\'t completed it yet. Click "Continue Survey" below to resume.'];
if (in_array($st,['earlyscreenout','latescreenout'])) return ['Screened Out','label-neutral','You did not qualify based on screening criteria.'];
if ($st==='quotafull') return ['Quota Full','label-neutral','The survey quota was filled before your response was recorded.'];
if ($st==='timeout') return ['Timed Out','label-neutral','Session expired before completion.'];
if ($st==='partial') return ['Partial','label-info','Your response was partially recorded.'];
if ($st==='complete') {
if (in_array($qf,['speedster','ip_duplicate','client_flagged'])) return ['Under Review','label-danger','Flagged for quality review. Points held pending admin decision.'];
if ($ps==='Closed') return ['Approved','label-ok','Survey approved. Check Rewards tab for credited points.'];
return ['Pending Approval','label-warn','Completed successfully. Points will credit when the project closes.'];
}
return [ucfirst($st),'label-neutral',''];
}
function fmtLoi($s){if(!$s)return'-';$m=floor($s/60);$ss=$s%60;return($m?$m.'m ':'').$ss.'s';}
function fmtDt($d){if(!$d)return'-';return date('M d, Y g:i A',strtotime($d));}
?>
Member Area - Relevant Reflex
4 essential rules to protect your account and earn maximum rewards
1
Take your time. Read every question carefully. There are no right or wrong answers — we want your genuine opinion. Think about each question and answer what you truly feel. Surveys that are rushed through too quickly get automatically flagged and your response may be rejected without reward.
2
One attempt per person, per device. Each survey can only be taken once from your IP address or device. Duplicate attempts are automatically detected and flagged. Do not try to retake a survey using a different browser, incognito mode, or VPN — it will be caught and may result in account action.
3
Do not straightline your responses. Straightlining means selecting the same answer option for every question in a row (e.g., choosing "Agree" for all statements). This is a well-known indicator of low-quality responses and is flagged by our system. Only select the same answer repeatedly if that genuinely reflects your opinion.
4
Give thoughtful answers to open-ended questions. When a survey asks you to type your opinion or explain something in your own words, write a genuine, meaningful response. Vague, gibberish, or nonsensical text (e.g., random letters, copy-pasted filler, or irrelevant answers) will be flagged. Responses containing such text will be marked invalid and the completion will not count — no points will be awarded.
Why this matters: Research clients review every response for quality. Flagged responses (speeding, duplicates, straightlining, or gibberish open-ended answers) are rejected and no points are awarded. Repeated violations may lead to fewer survey invitations or account restrictions.
Complete your profile for more surveys. done. Continue →
How it works: Click any survey to see full details. Completed surveys are reviewed when the project closes. Points are credited once approved. "Under Review" means quality concerns (e.g., LOI below minimum threshold). ● = normal LOI, ● = slow, ● = below threshold.
-------------------- END OF FILE --------------------
### FILE 11: RR com/disclaimer.php
- Type: PHP
- Size: 17.26 KB
- Path: RR com
- Name: disclaimer.php
------------------------------------------------------------
Earnings Disclaimer - Relevant Reflex | Important Information About Survey Rewards
Earnings Disclaimer
Important information about income potential from participating in online surveys.
Last Updated: March 2026
Important Notice: Please read this Earnings Disclaimer carefully before joining or using Relevant Reflex. Participation in our survey platform does not guarantee any specific level of income or earnings.
1. No Guaranteed Earnings
Relevant Reflex is an online survey platform that connects registered members with paid market research opportunities. We do not guarantee that you will earn any specific amount of money by participating in surveys on our platform.
Earnings from surveys are supplemental in nature and are not intended to replace a primary source of income. The amount you earn depends on many factors that are beyond our control.
2. Factors That Affect Earnings
Your actual earnings will vary based on a number of factors, including but not limited to:
The number and types of surveys available at any given time
Your demographic profile and how well it matches available survey requirements
The frequency and consistency of your participation
Your survey qualification rate (not all respondents qualify for every survey)
The time you invest in completing surveys
Survey availability in your geographic region
The specific research needs of our survey clients at any time
3. Member Testimonials and Income Examples
Any testimonials, earnings examples, or income figures shared on this website — including those from our members — represent individual results and are not typical. These are provided for illustrative purposes only.
Typical Results Disclaimer: The earnings mentioned in member stories and example income ranges on this site reflect individual experiences and do not represent average or typical results. Most members earn modest supplemental income. Your results will vary based on your demographics, time commitment, and survey availability.
We do not make any representation that the earnings experiences described by any member are typical, and individual results will vary significantly.
4. Survey Availability Is Not Guaranteed
The availability of surveys on our platform depends on the requirements of our research clients. We cannot guarantee:
A minimum number of surveys per day, week, or month
Consistent survey availability throughout the year
That you will qualify for every survey you attempt
That surveys will remain open until you complete them
5. Payment and Reward Terms
Rewards are subject to the payment terms and conditions set out in our Terms and Conditions. Rewards are paid via UPI transfer upon reaching the minimum payout threshold of ₹500. Payment timing is subject to verification and processing periods.
6. Not Financial or Professional Advice
Nothing on the Relevant Reflex website, including this page, constitutes financial advice, investment advice, or professional guidance of any kind. Survey participation is a supplemental earning activity only.
7. Contact Us
If you have any questions about this Earnings Disclaimer, please contact us at:
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking "Accept All", you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 12: RR com/doubts.php
- Type: PHP
- Size: 29.35 KB
- Path: RR com
- Name: doubts.php
------------------------------------------------------------
How Online Surveys Work in India | Relevant Reflex
How It Works
Your complete guide to earning money with online surveys. Learn the best practices for maximizing your rewards!
Getting Started is Easy
Follow these simple steps to start earning money with surveys today!
1
Sign Up Free
Create your account with basic information. It takes less than 2 minutes and is completely free.
When you signup, DO NOT provide fake details. Provide your correct details including your gender, age, occupation, company, region etc. Since online paid surveys are sent to almost all age and gender categories and profile types, when you fake your profile, you might not get what you usually get for your actual profile.
Complete Profiler Surveys
Provide as many details as possible about you in the profiler section. This includes your gaming profile, income range, automobile assets, real estate assets, electronics you own and so on. When you attend more profiler surveys, you get more and more surveys related to all these. When you have only a generic profile and not completed the profiler surveys, you will get only those surveys which are based on age and gender.
Choose Languages You Know
Choose the languages that you know. Some people try surveys in other languages. Since you can't translate and understand all languages, you might end up taking more time on the survey than usual duration. When you take such a long duration on any survey, the system might mark you as a fraudulent user.
Be Patient
When you get screened out of many surveys, it means that the survey is not meant for your profile. This also means that there will be surveys targeting you in the future. So, KEEP PARTICIPATING in as many surveys as possible.
Log In Daily
Login every day to see if you have any surveys. Check your mail daily to know if you have any survey invitations. When you don't check the mail or login daily, other users will complete those surveys sooner and you might not get a chance to complete the survey.
Important Guidelines
Avoid Survey Fraud
Never use automated tools, VPNs, or provide inconsistent answers. This can result in account suspension and loss of rewards.
One Account Per Person
Maintain only one account per person. Multiple accounts from the same household or IP address may result in disqualification.
Complete Surveys Promptly
Don't leave surveys incomplete for long periods. Complete them in a reasonable timeframe to maintain your quality score.
Understanding Survey Types
Opinion Surveys
Share your thoughts on products, services, brands, and current topics. These are the most common type of surveys.
5-20 minutes
Product Testing
Test products at home and provide detailed feedback. Higher rewards but limited availability.
1-2 weeks
Focus Groups
Join group discussions on specific topics. These offer the highest rewards but are invitation-only.
1-2 hours
Profile Surveys
Complete these to help us match you with more relevant surveys. Essential for maximizing opportunities.
2-5 minutes
Member Experiences
Real experiences from real people using Relevant Reflex
"Consistent earnings over time"
"I follow all the tips mentioned here and participate regularly. The key is patience and honesty in responses. It's a genuine platform."
- Rajesh K., Software Engineer, Mumbai ✓ Verified Member
"Perfect for students"
"As a college student, this platform helps me earn useful pocket money. I complete surveys between classes and it has been a great experience so far."
- Anjali R., Student, Pune ✓ Verified Member
"Reliable supplemental income"
"Been using Relevant Reflex for over a year. It gives me a reliable supplemental income on the side. Highly recommended for anyone with spare time!"
- Meena T., Homemaker, Bangalore ✓ Verified Member
Disclaimer: These are individual member experiences. Earnings are not guaranteed and will vary based on survey availability, demographic profile, and individual participation. See our Earnings Disclaimer.
Need Help Getting Started?
Our support team is here to help you succeed with online surveys!
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking “Accept All”, you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 13: RR com/email.php
- Type: PHP
- Size: 18.12 KB
- Path: RR com
- Name: email.php
------------------------------------------------------------
getVerificationEmailTemplate($verificationUrl);
$textBody = $this->getVerificationEmailText($verificationUrl);
return $this->sendEmail($email, $subject, $htmlBody, $textBody);
}
public function sendPasswordResetEmail($email, $token) {
$resetUrl = SITE_URL . "/reset-password.php?token=" . $token;
$subject = "Password reset request for your Relevant Reflex account";
$htmlBody = $this->getPasswordResetEmailTemplate($resetUrl);
$textBody = $this->getPasswordResetEmailText($resetUrl);
return $this->sendEmail($email, $subject, $htmlBody, $textBody);
}
private function sendEmail($to, $subject, $htmlBody, $textBody = '') {
$payload = [
'personalizations' => [[
'to' => [['email' => $to]],
'subject' => $subject
]],
'from' => ['email' => $this->fromEmail, 'name' => $this->fromName],
'reply_to' => ['email' => 'support@relevantreflex.com', 'name' => 'Relevant Reflex Support'],
'content' => [
['type' => 'text/plain', 'value' => $textBody ?: strip_tags($htmlBody)],
['type' => 'text/html', 'value' => $htmlBody]
],
'headers' => [
'List-Unsubscribe' => '',
'List-Unsubscribe-Post' => 'List-Unsubscribe=One-Click',
'X-Mailer' => 'Relevant Reflex Mailer'
],
'categories' => ['transactional', 'member-verification'],
'tracking_settings' => [
'click_tracking' => ['enable' => false],
'open_tracking' => ['enable' => true]
]
];
$ch = curl_init('https://api.sendgrid.com/v3/mail/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this->apiKey,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => true
]);
$response = curl_exec($ch);
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($statusCode === 202) {
return true;
} else {
error_log("SendGrid email failed to $to: HTTP $statusCode — $response");
return false;
}
}
// -----------------------------------------------------------------------
// PLAIN TEXT VERSIONS
// -----------------------------------------------------------------------
private function getVerificationEmailText($verificationUrl) {
return "Relevant Reflex — Email Verification
======================================
Thank you for registering with Relevant Reflex.
To activate your account, please verify your email address by visiting the link below:
" . $verificationUrl . "
This verification link expires in 7 days.
If you did not create an account with Relevant Reflex, please ignore this email.
Need help? Contact us at support@relevantreflex.com
— The Relevant Reflex Team
relevantreflex.com";
}
private function getPasswordResetEmailText($resetUrl) {
return "Relevant Reflex — Password Reset
==================================
We received a request to reset the password for your Relevant Reflex account.
To set a new password, visit the link below:
" . $resetUrl . "
This link expires in 1 hour. If you did not request a password reset, please ignore this email — your password will not be changed.
Need help? Contact us at support@relevantreflex.com
— The Relevant Reflex Team
relevantreflex.com";
}
// -----------------------------------------------------------------------
// HTML TEMPLATES
// -----------------------------------------------------------------------
private function getVerificationEmailTemplate($verificationUrl) {
return '
Verify Your Email - Relevant Reflex
Relevant Reflex
India\'s Trusted Survey Platform
Verify Your Email Address
Thank you for registering with Relevant Reflex. Please click the button below to verify your email address and activate your account.
';
}
}
-------------------- END OF FILE --------------------
### FILE 14: RR com/errors.log
- Type: LOG
- Size: 0 B
- Path: RR com
- Name: errors.log
------------------------------------------------------------
-------------------- END OF FILE --------------------
### FILE 15: RR com/fix-rupee.php
- Type: PHP
- Size: 5.34 KB
- Path: RR com
- Name: fix-rupee.php
------------------------------------------------------------
Rupee Fix";
echo "
Rupee Symbol Fix Script
";
if ($dryRun) {
echo "
DRY RUN MODE - No changes will be made. Add &apply=yes to URL to apply fixes.
";
} else {
echo "
APPLYING FIXES
";
}
// The broken sequence: ₹ is what ₹ looks like when UTF-8 bytes are read as Latin1
// UTF-8 for ₹ (U+20B9) is: 0xE2 0x82 0xB9
// When read as Latin1: â (0xE2) ‚ (0x82) ¹ (0xB9) = ₹
$brokenRupee = "\xC3\xA2\xC2\x82\xC2\xB9"; // Double-encoded UTF-8
$brokenRupee2 = "₹"; // As it appears in source
$replacement = "₹"; // HTML entity for ₹ - works everywhere
// Files to check (relative to this script's directory)
$baseDir = __DIR__;
$files = [
'about.php',
'admin-support.php',
'articles.php',
'dashboard.php',
'doubts.php',
'index.php',
'points-manager.php',
'profiler.php',
'redemption.php',
'signup.php',
'terms.php',
'partners/data-sync.php',
'partners/members.php',
'partners/partner-config.php',
'partners/partner-dashboard.php',
'partners/redemptions.php',
];
$totalFixed = 0;
echo "
";
echo "
File
Occurrences
Status
";
foreach ($files as $relPath) {
$fullPath = $baseDir . '/' . $relPath;
if (!file_exists($fullPath)) {
echo "
$relPath
-
File not found (skip)
";
continue;
}
$content = file_get_contents($fullPath);
// Count occurrences of both patterns
$count1 = substr_count($content, $brokenRupee);
$count2 = substr_count($content, $brokenRupee2);
$totalCount = max($count1, $count2); // They may overlap, take the higher count
// Also check for raw ₹ that might work but could break during file transfer
$rawRupee = "\xE2\x82\xB9"; // Actual UTF-8 bytes for ₹
$rawCount = substr_count($content, $rawRupee);
if ($totalCount === 0 && $rawCount === 0) {
echo "
$relPath
0
Clean
";
continue;
}
if ($totalCount > 0) {
if (!$dryRun) {
// Replace both patterns
$newContent = str_replace($brokenRupee, $replacement, $content);
$newContent = str_replace($brokenRupee2, $replacement, $newContent);
// Also replace raw ₹ with entity for safety
$newContent = str_replace($rawRupee, $replacement, $newContent);
// Don't double-replace: if ₹ already exists, don't touch it
// (the replacements above won't create doubles since we're replacing different patterns)
file_put_contents($fullPath, $newContent);
echo "
Join thousands of Indians who take paid surveys online and earn rewards for sharing their opinions. Our online surveys India platform connects you with genuine market research opportunities. Survey availability and earnings vary by member profile.
Earnings Disclaimer: Results vary. Earnings from surveys are supplemental and not guaranteed. Individual results depend on survey availability, your demographic profile, and participation frequency. See our Earnings Disclaimer for full details.
Why Choose Relevant Reflex?
We're a trusted platform for paid surveys and online surveys in India, dedicated to providing genuine market research earning opportunities.
Trusted & Secure
Your data is protected with industry-standard security measures. We never sell your personal information.
Verified Payments
Rewards transferred via UPI after survey completion and validation.
Flexible Schedule
Take surveys whenever you want, from anywhere. Perfect for students, professionals, and homemakers.
India-Focused
Surveys specifically designed for Indian consumers. Your opinions matter for local and international brands.
Mobile Friendly
Take surveys on your smartphone, tablet, or computer. Our platform works seamlessly across all devices.
24/7 Support
Our dedicated support team is here to help you with any questions or issues you may have.
What Our Members Say
Join thousands of satisfied members who are earning money with Relevant Reflex.
"I've been using Relevant Reflex for 6 months and it helps me cover small expenses. The surveys are interesting and payments are always on time!"
- Priya S., Mumbai
✓ Verified Member January 2025
"Great platform for students like me. I can take surveys between classes and earn pocket money easily."
- Rahul K., Delhi
✓ Verified Member February 2025
"Professional platform with genuine surveys. I appreciate how they respect my time and opinions."
- Sneha M., Bangalore
✓ Verified Member March 2025
Testimonials from real members. Individual results vary. See our Earnings Disclaimer.
Ready to Start Earning?
Join Relevant Reflex today and participate in genuine paid surveys!
Registration takes less than 2 minutes • 100% Free • No spam guaranteed Earnings vary by member. See Earnings Disclaimer.
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking "Accept All", you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 20: RR com/isec-helper.php
- Type: PHP
- Size: 8.81 KB
- Path: RR com
- Name: isec-helper.php
------------------------------------------------------------
[
'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9],
'no_formal' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>11,'degree_regular'=>10,'degree_professional'=>10],
'upto_5' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9],
'class_6_9' => ['no_adult'=>12,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9],
'class_10_14' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7],
'degree_regular' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6],
'degree_professional'=> ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>6],
],
'farmer' => [
'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9],
'no_formal' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>11,'degree_regular'=>10,'degree_professional'=>10],
'upto_5' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9],
'class_6_9' => ['no_adult'=>12,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9],
'class_10_14' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7],
'degree_regular' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6],
'degree_professional'=> ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>5],
],
'worker' => [
'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>8,'degree_professional'=>8],
'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>8],
'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>7],
'class_6_9' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7],
'class_10_14' => ['no_adult'=>10,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>6,'degree_professional'=>6],
'degree_regular' => ['no_adult'=>8,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>4],
'degree_professional'=> ['no_adult'=>8,'no_formal'=>9,'upto_5'=>7,'class_6_9'=>7,'class_10_14'=>5,'degree_regular'=>3,'degree_professional'=>3],
],
'trader' => [
'no_adult' => ['no_adult'=>11,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>6,'degree_professional'=>5],
'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>8],
'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>8,'degree_professional'=>7],
'class_6_9' => ['no_adult'=>10,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>5],
'class_10_14' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>4],
'degree_regular' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>6,'degree_regular'=>3,'degree_professional'=>2],
'degree_professional'=> ['no_adult'=>6,'no_formal'=>8,'upto_5'=>6,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>2],
],
'clerical' => [
'no_adult' => ['no_adult'=>10,'no_formal'=>12,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6],
'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>8],
'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>7],
'class_6_9' => ['no_adult'=>10,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6],
'class_10_14' => ['no_adult'=>8,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>4],
'degree_regular' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>6,'degree_regular'=>4,'degree_professional'=>3],
'degree_professional'=> ['no_adult'=>6,'no_formal'=>8,'upto_5'=>7,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>2],
],
'managerial' => [
'no_adult' => ['no_adult'=>10,'no_formal'=>12,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>5],
'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>8,'degree_professional'=>6],
'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>6,'degree_professional'=>6],
'class_6_9' => ['no_adult'=>9,'no_formal'=>9,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>6],
'class_10_14' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>5,'degree_regular'=>3,'degree_professional'=>3],
'degree_regular' => ['no_adult'=>6,'no_formal'=>8,'upto_5'=>7,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>1],
'degree_professional'=> ['no_adult'=>5,'no_formal'=>7,'upto_5'=>6,'class_6_9'=>5,'class_10_14'=>3,'degree_regular'=>1,'degree_professional'=>1],
],
];
}
/**
* Compute ISEC tier from the 3 profiler responses
*
* @param string $occupation - Occupation code of CWE
* @param string $maleEducation - Education code of highest educated male adult
* @param string $femaleEducation - Education code of highest educated female adult
* @return int|null - ISEC tier (1-12) or null if cannot compute
*/
function computeISECTier($occupation, $maleEducation, $femaleEducation) {
$grid = getISECGrid();
if (isset($grid[$occupation][$maleEducation][$femaleEducation])) {
return $grid[$occupation][$maleEducation][$femaleEducation];
}
return null;
}
/**
* Get SEC class label from ISEC tier
*
* @param int $tier - ISEC tier (1-12)
* @return string - SEC class (A/B/C/D/E) with description
*/
function getISECClass($tier) {
if ($tier >= 1 && $tier <= 6) return 'A';
if ($tier >= 7 && $tier <= 8) return 'B';
if ($tier >= 9 && $tier <= 10) return 'C';
if ($tier == 11) return 'D';
if ($tier == 12) return 'E';
return null;
}
/**
* Get full SEC class label with description
*/
function getISECClassLabel($tier) {
$labels = [
'A' => 'SEC A — High',
'B' => 'SEC B — Upper Middle',
'C' => 'SEC C — Middle',
'D' => 'SEC D — Lower Middle',
'E' => 'SEC E — Low',
];
$class = getISECClass($tier);
return $class ? $labels[$class] : null;
}
-------------------- END OF FILE --------------------
### FILE 21: RR com/login.php
- Type: PHP
- Size: 27.43 KB
- Path: RR com
- Name: login.php
------------------------------------------------------------
redirectToDashboard();
}
$errors = [];
$form_data = [];
$resend_success = '';
$show_resend = false;
$resend_email = '';
// Handle resend verification request
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'resend_verification') {
$resend_email = isset($_POST['email']) ? sanitize($_POST['email']) : '';
$form_data['email'] = $resend_email;
if (empty($resend_email) || !validateEmail($resend_email)) {
$errors[] = 'Please provide a valid email address.';
} else {
try {
$db = new Database();
$pdo = $db->getConnection();
$clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
// Rate limit: max 3 resend attempts per IP per hour
try {
$stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM registration_attempts WHERE ip_address = ? AND attempt_type = 'resend_verification' AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)");
$stmt->execute([$clientIP]);
$attempts = $stmt->fetch();
if ($attempts && $attempts['cnt'] >= 3) {
$errors[] = 'Too many resend attempts. Please try again later or contact support.';
}
} catch (Exception $e) {}
if (empty($errors)) {
// Find the user
$stmt = $pdo->prepare("SELECT id, email, email_verified, status FROM users WHERE email = ?");
$stmt->execute([$resend_email]);
$user = $stmt->fetch();
if (!$user) {
// Don't reveal if email exists - show generic success
$resend_success = 'If an account with that email exists and is unverified, a new verification link has been sent. Please check your inbox and spam folder.';
} elseif ($user['email_verified']) {
$resend_success = 'This email is already verified. You can log in directly.';
} else {
// Delete old verification tokens
$pdo->prepare("DELETE FROM email_verifications WHERE user_id = ?")->execute([$user['id']]);
// Generate new token
$verificationToken = generateSecureToken();
$expiresAt = date('Y-m-d H:i:s', strtotime('+' . TOKEN_EXPIRY_HOURS . ' hours'));
$stmt = $pdo->prepare("INSERT INTO email_verifications (user_id, token, expires_at, created_at) VALUES (?, ?, ?, NOW())");
$stmt->execute([$user['id'], $verificationToken, $expiresAt]);
// Send verification email
require_once 'email.php';
$emailHandler = new EmailHandler();
$emailSent = $emailHandler->sendVerificationEmail($resend_email, $verificationToken);
if ($emailSent) {
logError('Verification email resent', ['user_id' => $user['id'], 'email' => $resend_email]);
$resend_success = 'A new verification link has been sent to your email. Please check your inbox and spam folder. The link expires in ' . TOKEN_EXPIRY_HOURS . ' hours.';
} else {
logError('Failed to resend verification email', ['user_id' => $user['id'], 'email' => $resend_email]);
$errors[] = 'Failed to send verification email. Please try again or contact support@relevantreflex.com.';
}
}
// Log the attempt
try {
$pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent) VALUES (?, ?, 'resend_verification', ?, ?)")
->execute([$clientIP, $resend_email, empty($errors) ? 1 : 0, $_SERVER['HTTP_USER_AGENT'] ?? '']);
} catch (Exception $e) {}
}
} catch (Exception $e) {
logError('Error in resend verification: ' . $e->getMessage());
$errors[] = 'System error. Please try again later.';
}
}
}
// Handle login form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_POST['action'])) {
// Initialize database
try {
$db = new Database();
$pdo = $db->getConnection();
} catch (Exception $e) {
logError('Database connection failed in login.php: ' . $e->getMessage());
$errors[] = 'System error. Please try again later.';
}
if (empty($errors)) {
// Get and sanitize form data
$email = isset($_POST['email']) ? sanitize($_POST['email']) : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
$rememberMe = isset($_POST['remember_me']) ? true : false;
// Store email for form repopulation
$form_data['email'] = $email;
// Validation
if (empty($email) || empty($password)) {
$errors[] = 'Please provide both email and password.';
} elseif (!validateEmail($email)) {
$errors[] = 'Please provide a valid email address.';
} else {
try {
// Find user by email
$stmt = $pdo->prepare("
SELECT id, email, password, email_verified, status, last_login
FROM users
WHERE email = ?
");
$stmt->execute([$email]);
$user = $stmt->fetch();
if (!$user) {
// Log failed login attempt
logError('Login attempt with non-existent email', ['email' => $email]);
$errors[] = 'Invalid email or password.';
} elseif (!verifyPassword($password, $user['password'])) {
logError('Login attempt with incorrect password', ['email' => $email]);
$errors[] = 'Invalid email or password.';
} elseif (!$user['email_verified']) {
$errors[] = 'Your email is not yet verified.';
$show_resend = true;
$resend_email = $email;
} elseif ($user['status'] !== 'active') {
$message = 'Your account is currently ' . $user['status'] . '.';
if ($user['status'] === 'suspended') {
$message .= ' Please contact support for assistance.';
}
$errors[] = $message;
} else {
// Login successful - create session
session_start();
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_email'] = $user['email'];
$_SESSION['logged_in'] = true;
$_SESSION['login_time'] = time();
// Update last login time
$stmt = $pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = ?");
$stmt->execute([$user['id']]);
// Set remember me cookie if requested (30 days)
if ($rememberMe) {
$sessionToken = generateSecureToken();
$expiresAt = date('Y-m-d H:i:s', strtotime('+30 days'));
// Store session token in database
$stmt = $pdo->prepare("
INSERT INTO user_sessions (user_id, session_token, expires_at)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE
session_token = VALUES(session_token),
expires_at = VALUES(expires_at)
");
$stmt->execute([$user['id'], $sessionToken, $expiresAt]);
// Set cookie
setcookie('remember_token', $sessionToken, time() + (30 * 24 * 60 * 60), '/', '', true, true);
}
// Clean up expired sessions
$pdo->prepare("DELETE FROM user_sessions WHERE expires_at < NOW()")->execute();
// Log successful login
logError('User login successful', [
'user_id' => $user['id'],
'email' => $user['email'],
'remember_me' => $rememberMe
]);
// Redirect to dashboard
header('Location: dashboard.php');
exit;
}
} catch (PDOException $e) {
logError('Database error during login', [
'error' => $e->getMessage(),
'email' => $email
]);
$errors[] = 'Login failed due to a system error. Please try again later.';
} catch (Exception $e) {
logError('General error during login', [
'error' => $e->getMessage(),
'email' => $email
]);
$errors[] = 'An unexpected error occurred. Please try again later.';
}
}
}
}
?>
Login - Relevant Reflex Paid Online Surveys India
Login to your Account!
You can take Online paid Surveys, Redeem your reward points and update profile - all in one place.
Welcome to Relevant Reflex ("we," "our," or "us"). We are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our online survey platform and related services.
Key Principle: We believe in transparency and will never sell your personal data to third parties for marketing purposes.
By using our services, you agree to the collection and use of information in accordance with this Privacy Policy. If you disagree with any part of this policy, please do not use our services.
2. Information We Collect
2.1 Personal Information
We collect the following types of personal information:
Registration Information: Name, email address, date of birth, gender, postal code
Profile Information: Occupation, income range, interests, preferences, household information
Survey Responses: Your answers to survey questions and research studies
Communication Data: Messages you send to our support team
2.2 Technical Information
IP address and location data
Browser type and version
Device information (type, operating system)
Usage data (pages visited, time spent, click patterns)
Cookies and similar tracking technologies
2.3 Financial Information
For payment processing, we may collect:
UPI ID or UPI-linked mobile number (for reward transfers)
Bank account details (for direct transfers)
Payment method preferences
3. How We Use Your Information
3.1 Primary Uses
Survey Matching: To match you with relevant survey opportunities based on your demographics and interests
Account Management: To create and maintain your account, process registrations, and provide customer support
Payment Processing: To calculate, process, and distribute rewards for completed surveys
Communication: To send you survey invitations, account updates, and important service announcements
3.2 Secondary Uses
To improve our platform and user experience
To prevent fraud and maintain platform security
To comply with legal obligations and regulatory requirements
To conduct internal research and analytics
Legal Basis: We process your data based on consent, legitimate interests, contract performance, and legal obligations as per applicable Indian data protection laws.
4. Information Sharing and Disclosure
4.1 Survey Partners
We may share anonymized or aggregated survey data with our research partners and clients. Individual responses are never linked to personal identifiers without explicit consent.
4.2 Service Providers
We work with trusted third-party service providers who assist us with:
Payment processing
Email delivery services
Data hosting and security
Customer support platforms
4.3 Legal Requirements
We may disclose your information if required by law, court order, or to:
Comply with legal processes
Protect our rights and property
Prevent fraud or security threats
Protect the safety of our users
4.4 Business Transfers
In the event of a merger, acquisition, or sale of assets, your information may be transferred as part of the business transaction.
5. Data Security
5.1 Security Measures
We implement industry-standard security measures to protect your information:
SSL encryption for all data transmissions
Secure database storage with access controls
Regular security audits and updates
Employee training on data protection
Multi-factor authentication for admin access
5.2 Data Breach Response
In the unlikely event of a data breach, we will:
Notify affected users within 72 hours
Report to relevant authorities as required
Take immediate steps to secure the breach
Provide guidance on protective measures
6. Your Rights and Choices
Under applicable data protection laws, you have the following rights:
6.1 Access and Portability
Request a copy of your personal data
Download your data in a portable format
View your survey history and earnings
6.2 Correction and Updates
Update your profile information
Correct inaccurate data
Modify communication preferences
6.3 Deletion and Restriction
Request deletion of your account and data
Restrict processing of certain information
Object to specific uses of your data
Exercise Your Rights: To exercise any of these rights, contact us at privacy@relevantreflex.com or through your account settings.
7. Cookies and Tracking Technologies
7.1 Types of Cookies We Use
Essential Cookies: Required for basic platform functionality
Performance Cookies: Help us analyze platform usage and improve performance
Functional Cookies: Remember your preferences and settings
Targeting Cookies: Used to deliver relevant survey opportunities
7.2 Advertising and Analytics Cookies
We use third-party advertising and analytics services, including Google Ads and Google Analytics. These services may set cookies on your device to:
Measure the effectiveness of our advertising campaigns
Show you relevant advertisements on other websites
Analyze how visitors use our website
Google's use of advertising cookies enables it to serve ads based on your prior visits to our site. You may opt out of personalized advertising by visiting Google Ad Settings.
On your first visit to our website, you will see a cookie consent banner. You may accept all cookies or decline non-essential cookies. Essential cookies required for the platform to function will always remain active. You can change your preferences at any time by clearing your browser cookies.
7.4 Cookie Management
You can control cookies through your browser settings. However, disabling certain cookies may limit platform functionality.
8. Data Retention
We retain your information for the following periods:
Active Accounts: Data retained while account is active
Inactive Accounts: Data retained for 2 years after last activity
Survey Data: Anonymized responses may be retained for research purposes
Financial Records: Retained for 7 years as per legal requirements
Marketing Communications: Until you unsubscribe
9. Children's Privacy
Our services are not intended for individuals under 18 years of age. We do not knowingly collect personal information from children. If we discover that we have collected information from a child, we will delete it immediately.
Parents or guardians who believe their child has provided information to us should contact us immediately.
10. International Data Transfers
While we primarily operate within India, some of our service providers may be located internationally. When we transfer data outside India, we ensure:
Adequate protection through contractual safeguards
Compliance with applicable data transfer regulations
Use of standard contractual clauses where required
11. Changes to This Privacy Policy
We may update this Privacy Policy periodically to reflect changes in our practices or applicable laws. We will:
Notify users of material changes via email
Post updates on our website
Provide a clear summary of changes
Allow reasonable time for review before changes take effect
Continued use of our services after policy updates constitutes acceptance of the changes.
12. Contact Us
If you have questions about this Privacy Policy or our data practices, please contact us:
Response Time: We aim to respond to all privacy-related inquiries within 30 days.
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking “Accept All”, you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 28: RR com/profiler-api.php
- Type: PHP
- Size: 5.66 KB
- Path: RR com
- Name: profiler-api.php
------------------------------------------------------------
'Not authenticated']);
exit;
}
$user = getCurrentUser();
if (!$user) {
echo json_encode(['error' => 'User not found']);
exit;
}
// Initialize database
try {
$db = new Database();
$pdo = $db->getConnection();
} catch (Exception $e) {
echo json_encode(['error' => 'Database connection failed']);
exit;
}
$action = isset($_GET['action']) ? $_GET['action'] : '';
switch ($action) {
case 'status':
getProfilerStatus($pdo, $user['id']);
break;
case 'points':
getUserPointsStatus($user['id']);
break;
case 'completion':
getCompletionSummary($pdo, $user['id']);
break;
default:
echo json_encode(['error' => 'Invalid action']);
}
function getProfilerStatus($pdo, $userId) {
$profilerSections = [
'personal_background' => 'Personal Background',
'household_family' => 'Household & Family',
'shopping_lifestyle' => 'Shopping & Lifestyle',
'technology_digital' => 'Technology & Digital',
'travel_transportation' => 'Travel & Transportation',
'health_fitness' => 'Health & Fitness',
'entertainment_media' => 'Entertainment & Media',
'food_dining' => 'Food & Dining',
'financial_services' => 'Financial Services',
'communication_payments' => 'Communication & Payments',
'household_classification' => 'Household Classification (ISEC)'
];
$completion = [];
$totalCompleted = 0;
try {
$stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?");
$stmt->execute([$userId]);
while ($row = $stmt->fetch()) {
$completion[$row['section']] = [
'name' => $profilerSections[$row['section']],
'percentage' => floatval($row['completion_percentage']),
'completed' => boolval($row['is_completed']),
'points_awarded' => boolval($row['points_awarded'])
];
if ($row['is_completed']) {
$totalCompleted++;
}
}
// Add sections not started
foreach ($profilerSections as $key => $name) {
if (!isset($completion[$key])) {
$completion[$key] = [
'name' => $name,
'percentage' => 0,
'completed' => false,
'points_awarded' => false
];
}
}
// Check mobile verification status
$stmt = $pdo->prepare("SELECT is_verified FROM mobile_verifications WHERE user_id = ?");
$stmt->execute([$userId]);
$mobileVerified = $stmt->fetch();
echo json_encode([
'success' => true,
'sections' => $completion,
'total_sections' => count($profilerSections),
'completed_sections' => $totalCompleted,
'overall_percentage' => round(($totalCompleted / count($profilerSections)) * 100, 2),
'mobile_verified' => $mobileVerified ? boolval($mobileVerified['is_verified']) : false
]);
} catch (Exception $e) {
echo json_encode(['error' => 'Database error: ' . $e->getMessage()]);
}
}
function getUserPointsStatus($userId) {
$pm = new PointsManager();
$points = $pm->getUserPoints($userId);
$nextTier = $pm->getNextRedemptionTier($points['points']);
echo json_encode([
'success' => true,
'points' => $points,
'next_tier' => $nextTier,
'can_redeem' => $points['points'] >= 500,
'rupee_value' => $points['points'] * 0.5
]);
}
function getCompletionSummary($pdo, $userId) {
try {
// Get overall completion stats
$stmt = $pdo->prepare("
SELECT
COUNT(*) as total_sections,
SUM(CASE WHEN is_completed = 1 THEN 1 ELSE 0 END) as completed_sections,
SUM(CASE WHEN points_awarded = 1 THEN 1 ELSE 0 END) as points_awarded_sections
FROM profiler_completion
WHERE user_id = ?
");
$stmt->execute([$userId]);
$stats = $stmt->fetch();
if (!$stats) {
$stats = ['total_sections' => 0, 'completed_sections' => 0, 'points_awarded_sections' => 0];
}
// Get recent transactions
$stmt = $pdo->prepare("
SELECT transaction_type, points, source, description, created_at
FROM point_transactions
WHERE user_id = ?
ORDER BY created_at DESC
LIMIT 5
");
$stmt->execute([$userId]);
$recentTransactions = $stmt->fetchAll();
// Get user points
$pm = new PointsManager();
$points = $pm->getUserPoints($userId);
echo json_encode([
'success' => true,
'completion_stats' => $stats,
'points_summary' => $points,
'recent_transactions' => $recentTransactions,
'potential_earnings' => [
'total_possible' => 90, // 10 sections × 5 points + 20 (ISEC) + 10 bonus + 10 mobile
'remaining' => max(0, 70 - $points['total_earned'])
]
]);
} catch (Exception $e) {
echo json_encode(['error' => 'Database error: ' . $e->getMessage()]);
}
}
?>
-------------------- END OF FILE --------------------
### FILE 29: RR com/profiler.php
- Type: PHP
- Size: 73.74 KB
- Path: RR com
- Name: profiler.php
------------------------------------------------------------
redirectToLogin('Session expired. Please log in again.');
}
// Initialize database
try {
$db = new Database();
$pdo = $db->getConnection();
} catch (Exception $e) {
logError('Database connection failed in profiler.php: ' . $e->getMessage());
die('System error. Please try again later.');
}
// Define all profiler sections with their questions
$profilerSections = [
'personal_background' => [
'name' => 'Personal Background',
'description' => 'Tell us about your education, work, and personal details',
'questions' => [
'education_level' => [
'question' => 'What is your highest level of education?',
'type' => 'single',
'options' => [
'below_10th' => 'Below 10th Standard',
'10th_pass' => '10th Standard',
'12th_pass' => '12th Standard/Intermediate',
'diploma' => 'Diploma/ITI',
'graduation' => 'Graduation (Bachelor\'s)',
'post_graduation' => 'Post Graduation (Master\'s)',
'professional' => 'Professional Degree (CA/CS/Engineering/Medical)',
'doctorate' => 'Doctorate/PhD'
]
],
'employment_status' => [
'question' => 'What is your current employment status?',
'type' => 'single',
'options' => [
'student' => 'Student',
'employed_private' => 'Employed - Private Sector',
'employed_government' => 'Employed - Government/Public Sector',
'self_employed' => 'Self Employed/Business Owner',
'freelancer' => 'Freelancer/Consultant',
'homemaker' => 'Homemaker',
'retired' => 'Retired',
'unemployed' => 'Currently Unemployed'
]
],
'occupation_sector' => [
'question' => 'Which sector do you work in? (Skip if not applicable)',
'type' => 'single',
'options' => [
'it_software' => 'IT/Software',
'banking_finance' => 'Banking/Finance',
'healthcare' => 'Healthcare/Medical',
'education' => 'Education/Teaching',
'manufacturing' => 'Manufacturing',
'retail_sales' => 'Retail/Sales',
'government' => 'Government Services',
'agriculture' => 'Agriculture/Farming',
'media_entertainment' => 'Media/Entertainment',
'other' => 'Other'
]
],
'monthly_income' => [
'question' => 'What is your monthly personal income range?',
'type' => 'single',
'options' => [
'no_income' => 'No Income',
'below_15k' => 'Below ₹15,000',
'15k_30k' => '₹15,000 - ₹30,000',
'30k_50k' => '₹30,000 - ₹50,000',
'50k_75k' => '₹50,000 - ₹75,000',
'75k_1l' => '₹75,000 - ₹1,00,000',
'1l_2l' => '₹1,00,000 - ₹2,00,000',
'above_2l' => 'Above ₹2,00,000'
]
],
'work_experience' => [
'question' => 'How many years of work experience do you have?',
'type' => 'single',
'options' => [
'fresher' => 'Fresher (0 years)',
'1_2_years' => '1-2 years',
'3_5_years' => '3-5 years',
'6_10_years' => '6-10 years',
'11_15_years' => '11-15 years',
'above_15_years' => 'More than 15 years'
]
],
'language_preference' => [
'question' => 'Which languages are you comfortable with? (Select all that apply)',
'type' => 'multiple',
'options' => [
'hindi' => 'Hindi',
'english' => 'English',
'tamil' => 'Tamil',
'telugu' => 'Telugu',
'bengali' => 'Bengali',
'marathi' => 'Marathi',
'gujarati' => 'Gujarati',
'kannada' => 'Kannada',
'malayalam' => 'Malayalam',
'punjabi' => 'Punjabi',
'other' => 'Other'
]
]
]
],
'household_family' => [
'name' => 'Household & Family',
'description' => 'Share information about your household and family',
'questions' => [
'family_size' => [
'question' => 'How many people live in your household?',
'type' => 'single',
'options' => [
'1' => '1 (Just me)',
'2' => '2 people',
'3' => '3 people',
'4' => '4 people',
'5' => '5 people',
'6_plus' => '6 or more people'
]
],
'marital_status' => [
'question' => 'What is your marital status?',
'type' => 'single',
'options' => [
'single' => 'Single',
'married' => 'Married',
'divorced' => 'Divorced',
'widowed' => 'Widowed',
'in_relationship' => 'In a relationship'
]
],
'children' => [
'question' => 'Do you have children?',
'type' => 'single',
'options' => [
'no_children' => 'No children',
'expecting' => 'Expecting first child',
'1_child' => '1 child',
'2_children' => '2 children',
'3_children' => '3 children',
'4_plus_children' => '4 or more children'
]
],
'children_age_groups' => [
'question' => 'If you have children, what are their age groups? (Select all that apply)',
'type' => 'multiple',
'options' => [
'infant' => 'Infant (0-2 years)',
'toddler' => 'Toddler (3-5 years)',
'child' => 'Child (6-12 years)',
'teenager' => 'Teenager (13-18 years)',
'adult' => 'Adult (18+ years)',
'not_applicable' => 'Not applicable'
]
],
'house_type' => [
'question' => 'What type of housing do you live in?',
'type' => 'single',
'options' => [
'apartment' => 'Apartment/Flat',
'independent_house' => 'Independent House',
'villa' => 'Villa',
'row_house' => 'Row House/Townhouse',
'rented_room' => 'Rented Room',
'hostel_pg' => 'Hostel/PG',
'other' => 'Other'
]
],
'house_ownership' => [
'question' => 'Is your house?',
'type' => 'single',
'options' => [
'owned' => 'Owned by family',
'rented' => 'Rented',
'company_provided' => 'Company provided',
'family_owned' => 'Joint family property',
'other' => 'Other'
]
],
'pet_ownership' => [
'question' => 'Do you have any pets?',
'type' => 'multiple',
'options' => [
'dog' => 'Dog',
'cat' => 'Cat',
'bird' => 'Birds',
'fish' => 'Fish',
'other_pet' => 'Other pets',
'no_pets' => 'No pets'
]
],
'household_income' => [
'question' => 'What is your total monthly household income?',
'type' => 'single',
'options' => [
'below_15k' => 'Below ₹15,000',
'15k_25k' => '₹15,000 - ₹25,000',
'25k_50k' => '₹25,000 - ₹50,000',
'50k_75k' => '₹50,000 - ₹75,000',
'75k_1l' => '₹75,000 - ₹1,00,000',
'1l_2l' => '₹1,00,000 - ₹2,00,000',
'2l_5l' => '₹2,00,000 - ₹5,00,000',
'above_5l' => 'Above ₹5,00,000',
'prefer_not' => 'Prefer not to say'
]
]
]
],
'shopping_lifestyle' => [
'name' => 'Shopping & Lifestyle',
'description' => 'Tell us about your shopping habits and lifestyle preferences',
'questions' => [
'shopping_frequency' => [
'question' => 'How often do you shop for non-essential items?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'weekly' => 'Weekly',
'bi_weekly' => 'Bi-weekly',
'monthly' => 'Monthly',
'occasionally' => 'Occasionally',
'rarely' => 'Rarely'
]
],
'shopping_preference' => [
'question' => 'Where do you prefer to shop? (Select all that apply)',
'type' => 'multiple',
'options' => [
'online' => 'Online (e-commerce websites)',
'malls' => 'Shopping malls',
'local_stores' => 'Local stores/markets',
'supermarkets' => 'Supermarkets',
'brand_stores' => 'Brand exclusive stores',
'wholesale_markets' => 'Wholesale markets'
]
],
'monthly_shopping_budget' => [
'question' => 'What is your monthly shopping budget for non-essential items?',
'type' => 'single',
'options' => [
'below_2k' => 'Below ₹2,000',
'2k_5k' => '₹2,000 - ₹5,000',
'5k_10k' => '₹5,000 - ₹10,000',
'10k_20k' => '₹10,000 - ₹20,000',
'20k_50k' => '₹20,000 - ₹50,000',
'above_50k' => 'Above ₹50,000'
]
],
'brand_consciousness' => [
'question' => 'How important are brands to you when making purchase decisions?',
'type' => 'single',
'options' => [
'very_important' => 'Very important - I only buy branded products',
'somewhat_important' => 'Somewhat important - I prefer brands but consider alternatives',
'neutral' => 'Neutral - Brand doesn\'t matter much',
'not_important' => 'Not important - I focus on value and quality',
'avoid_brands' => 'I actively avoid expensive brands'
]
],
'online_shopping_frequency' => [
'question' => 'How often do you shop online?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'weekly' => 'Weekly',
'monthly' => 'Monthly',
'quarterly' => 'Quarterly',
'rarely' => 'Rarely',
'never' => 'Never'
]
],
'lifestyle_interests' => [
'question' => 'What are your main lifestyle interests? (Select all that apply)',
'type' => 'multiple',
'options' => [
'fitness' => 'Fitness and health',
'cooking' => 'Cooking and food',
'travel' => 'Travel and exploration',
'fashion' => 'Fashion and style',
'home_decor' => 'Home decoration',
'gadgets' => 'Technology and gadgets',
'books' => 'Reading and books',
'movies' => 'Movies and entertainment',
'music' => 'Music',
'sports' => 'Sports',
'art' => 'Art and culture'
]
],
'social_media_usage' => [
'question' => 'Which social media platforms do you actively use? (Select all that apply)',
'type' => 'multiple',
'options' => [
'facebook' => 'Facebook',
'instagram' => 'Instagram',
'twitter' => 'Twitter/X',
'linkedin' => 'LinkedIn',
'youtube' => 'YouTube',
'whatsapp' => 'WhatsApp',
'telegram' => 'Telegram',
'snapchat' => 'Snapchat',
'tiktok' => 'TikTok/Reels',
'none' => 'I don\'t use social media'
]
]
]
],
'technology_digital' => [
'name' => 'Technology & Digital',
'description' => 'Share your technology usage and digital preferences',
'questions' => [
'smartphone_brand' => [
'question' => 'Which smartphone brand do you currently use?',
'type' => 'single',
'options' => [
'samsung' => 'Samsung',
'apple' => 'Apple iPhone',
'xiaomi' => 'Xiaomi/Mi/Redmi',
'oneplus' => 'OnePlus',
'oppo' => 'Oppo',
'vivo' => 'Vivo',
'realme' => 'Realme',
'google' => 'Google Pixel',
'motorola' => 'Motorola',
'other' => 'Other'
]
],
'internet_usage_hours' => [
'question' => 'How many hours do you spend on the internet daily?',
'type' => 'single',
'options' => [
'1_2_hours' => '1-2 hours',
'3_4_hours' => '3-4 hours',
'5_6_hours' => '5-6 hours',
'7_8_hours' => '7-8 hours',
'9_10_hours' => '9-10 hours',
'more_than_10' => 'More than 10 hours'
]
],
'primary_internet_activity' => [
'question' => 'What do you primarily use the internet for? (Select all that apply)',
'type' => 'multiple',
'options' => [
'social_media' => 'Social media',
'entertainment' => 'Entertainment (videos, music)',
'work' => 'Work/Professional',
'shopping' => 'Online shopping',
'news' => 'News and information',
'education' => 'Learning and education',
'gaming' => 'Gaming',
'communication' => 'Communication (calls, messages)',
'banking' => 'Banking and financial services'
]
],
'streaming_services' => [
'question' => 'Which streaming services do you use? (Select all that apply)',
'type' => 'multiple',
'options' => [
'netflix' => 'Netflix',
'amazon_prime' => 'Amazon Prime Video',
'hotstar' => 'Disney+ Hotstar',
'youtube_premium' => 'YouTube Premium',
'sony_liv' => 'Sony LIV',
'zee5' => 'ZEE5',
'voot' => 'Voot',
'mx_player' => 'MX Player',
'spotify' => 'Spotify',
'none' => 'None of these'
]
],
'online_payment_methods' => [
'question' => 'Which online payment methods do you use? (Select all that apply)',
'type' => 'multiple',
'options' => [
'upi' => 'UPI (PhonePe, GooglePay, Paytm)',
'credit_card' => 'Credit Card',
'debit_card' => 'Debit Card',
'net_banking' => 'Net Banking',
'digital_wallet' => 'Digital Wallets',
'cod' => 'Cash on Delivery',
'bank_transfer' => 'Bank Transfer'
]
],
'tech_comfort_level' => [
'question' => 'How would you rate your comfort level with technology?',
'type' => 'single',
'options' => [
'expert' => 'Expert - I\'m very tech-savvy',
'advanced' => 'Advanced - I\'m comfortable with most tech',
'intermediate' => 'Intermediate - I can handle basic to moderate tech tasks',
'beginner' => 'Beginner - I use basic features only',
'minimal' => 'Minimal - I struggle with technology'
]
],
'smart_devices_owned' => [
'question' => 'Which smart devices do you own? (Select all that apply)',
'type' => 'multiple',
'options' => [
'smart_tv' => 'Smart TV',
'smart_speaker' => 'Smart Speaker (Alexa, Google Home)',
'smartwatch' => 'Smartwatch/Fitness Tracker',
'laptop' => 'Laptop',
'tablet' => 'Tablet',
'gaming_console' => 'Gaming Console',
'smart_home' => 'Smart Home Devices',
'none' => 'None of these'
]
]
]
],
'travel_transportation' => [
'name' => 'Travel & Transportation',
'description' => 'Tell us about your travel habits and transportation preferences',
'questions' => [
'travel_frequency' => [
'question' => 'How often do you travel for leisure/vacation?',
'type' => 'single',
'options' => [
'monthly' => 'Monthly',
'quarterly' => 'Every 3-4 months',
'twice_yearly' => 'Twice a year',
'annually' => 'Once a year',
'rarely' => 'Rarely (once in 2-3 years)',
'never' => 'Never'
]
],
'travel_destinations' => [
'question' => 'What type of destinations do you prefer? (Select all that apply)',
'type' => 'multiple',
'options' => [
'domestic_cities' => 'Domestic cities',
'hill_stations' => 'Hill stations',
'beaches' => 'Beaches',
'historical_places' => 'Historical places',
'religious_places' => 'Religious places',
'international' => 'International destinations',
'adventure_spots' => 'Adventure destinations',
'family_spots' => 'Family-friendly places'
]
],
'accommodation_preference' => [
'question' => 'What type of accommodation do you prefer while traveling?',
'type' => 'single',
'options' => [
'luxury_hotels' => 'Luxury hotels (5-star)',
'mid_range_hotels' => 'Mid-range hotels (3-4 star)',
'budget_hotels' => 'Budget hotels',
'resorts' => 'Resorts',
'homestays' => 'Homestays',
'hostels' => 'Hostels',
'airbnb' => 'Airbnb/Rental apartments',
'family_friends' => 'Stay with family/friends'
]
],
'daily_commute_mode' => [
'question' => 'What is your primary mode of daily transportation?',
'type' => 'single',
'options' => [
'own_car' => 'Own car',
'own_bike' => 'Own bike/scooter',
'public_transport' => 'Public transport (bus, metro)',
'auto_rickshaw' => 'Auto rickshaw',
'taxi_cab' => 'Taxi/Cab services',
'ride_sharing' => 'Ride sharing (Ola, Uber)',
'walking' => 'Walking',
'cycling' => 'Cycling',
'work_from_home' => 'Work from home (no commute)'
]
],
'vehicle_ownership' => [
'question' => 'Which vehicles do you own? (Select all that apply)',
'type' => 'multiple',
'options' => [
'car' => 'Car',
'motorcycle' => 'Motorcycle',
'scooter' => 'Scooter',
'bicycle' => 'Bicycle',
'electric_vehicle' => 'Electric vehicle',
'none' => 'None'
]
],
'fuel_type_preference' => [
'question' => 'If you own a vehicle, what fuel type do you prefer?',
'type' => 'single',
'options' => [
'petrol' => 'Petrol',
'diesel' => 'Diesel',
'cng' => 'CNG',
'electric' => 'Electric',
'hybrid' => 'Hybrid',
'not_applicable' => 'Not applicable (don\'t own vehicle)'
]
],
'ride_sharing_usage' => [
'question' => 'How often do you use ride-sharing services (Ola, Uber)?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'weekly' => 'Weekly',
'monthly' => 'Monthly',
'occasionally' => 'Occasionally',
'rarely' => 'Rarely',
'never' => 'Never'
]
]
]
],
'health_fitness' => [
'name' => 'Health & Fitness',
'description' => 'Share your health and fitness preferences and habits',
'questions' => [
'exercise_frequency' => [
'question' => 'How often do you exercise or engage in physical activities?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'few_times_week' => 'Few times a week',
'weekly' => 'Once a week',
'monthly' => 'Few times a month',
'rarely' => 'Rarely',
'never' => 'Never'
]
],
'exercise_types' => [
'question' => 'What types of physical activities do you engage in? (Select all that apply)',
'type' => 'multiple',
'options' => [
'gym' => 'Gym workouts',
'running' => 'Running/Jogging',
'walking' => 'Walking',
'yoga' => 'Yoga',
'cycling' => 'Cycling',
'swimming' => 'Swimming',
'sports' => 'Sports (cricket, football, etc.)',
'dancing' => 'Dancing',
'home_workouts' => 'Home workouts',
'none' => 'None'
]
],
'diet_preference' => [
'question' => 'What is your dietary preference?',
'type' => 'single',
'options' => [
'vegetarian' => 'Vegetarian',
'non_vegetarian' => 'Non-vegetarian',
'vegan' => 'Vegan',
'jain_vegetarian' => 'Jain vegetarian',
'eggetarian' => 'Eggetarian',
'flexitarian' => 'Flexitarian (mostly vegetarian)',
'no_preference' => 'No specific preference'
]
],
'health_concerns' => [
'question' => 'Do you have any of these health concerns? (Select all that apply)',
'type' => 'multiple',
'options' => [
'diabetes' => 'Diabetes',
'hypertension' => 'High blood pressure',
'heart_disease' => 'Heart disease',
'obesity' => 'Weight management issues',
'allergies' => 'Allergies',
'digestive_issues' => 'Digestive issues',
'mental_health' => 'Mental health concerns',
'none' => 'None',
'prefer_not_say' => 'Prefer not to say'
]
],
'healthcare_spending' => [
'question' => 'How much do you spend on healthcare annually?',
'type' => 'single',
'options' => [
'below_10k' => 'Below ₹10,000',
'10k_25k' => '₹10,000 - ₹25,000',
'25k_50k' => '₹25,000 - ₹50,000',
'50k_1l' => '₹50,000 - ₹1,00,000',
'above_1l' => 'Above ₹1,00,000',
'not_sure' => 'Not sure'
]
],
'health_insurance' => [
'question' => 'Do you have health insurance?',
'type' => 'single',
'options' => [
'employer_provided' => 'Yes, provided by employer',
'personal_policy' => 'Yes, personal policy',
'family_floater' => 'Yes, family floater policy',
'government_scheme' => 'Yes, government scheme',
'no_insurance' => 'No health insurance',
'not_sure' => 'Not sure'
]
],
'wellness_interests' => [
'question' => 'Which wellness activities interest you? (Select all that apply)',
'type' => 'multiple',
'options' => [
'meditation' => 'Meditation',
'spa_treatments' => 'Spa treatments',
'nutrition_counseling' => 'Nutrition counseling',
'fitness_training' => 'Personal fitness training',
'alternative_medicine' => 'Alternative medicine',
'mental_health_support' => 'Mental health support',
'wellness_retreats' => 'Wellness retreats',
'none' => 'None of these'
]
]
]
],
'entertainment_media' => [
'name' => 'Entertainment & Media',
'description' => 'Tell us about your entertainment preferences and media consumption',
'questions' => [
'tv_watching_hours' => [
'question' => 'How many hours do you watch TV/streaming content daily?',
'type' => 'single',
'options' => [
'none' => 'I don\'t watch TV',
'1_hour' => 'Less than 1 hour',
'1_2_hours' => '1-2 hours',
'2_3_hours' => '2-3 hours',
'3_5_hours' => '3-5 hours',
'more_than_5' => 'More than 5 hours'
]
],
'content_preferences' => [
'question' => 'What type of content do you prefer? (Select all that apply)',
'type' => 'multiple',
'options' => [
'bollywood_movies' => 'Bollywood movies',
'hollywood_movies' => 'Hollywood movies',
'regional_movies' => 'Regional movies',
'tv_serials' => 'TV serials/shows',
'reality_shows' => 'Reality shows',
'news' => 'News',
'documentaries' => 'Documentaries',
'comedy_shows' => 'Comedy shows',
'sports' => 'Sports',
'music_videos' => 'Music videos'
]
],
'movie_genres' => [
'question' => 'Which movie genres do you enjoy? (Select all that apply)',
'type' => 'multiple',
'options' => [
'action' => 'Action',
'comedy' => 'Comedy',
'drama' => 'Drama',
'romance' => 'Romance',
'thriller' => 'Thriller',
'horror' => 'Horror',
'sci_fi' => 'Science Fiction',
'documentary' => 'Documentary',
'biography' => 'Biography',
'animation' => 'Animation'
]
],
'music_preferences' => [
'question' => 'What type of music do you listen to? (Select all that apply)',
'type' => 'multiple',
'options' => [
'bollywood' => 'Bollywood',
'classical_indian' => 'Classical Indian',
'devotional' => 'Devotional/Religious',
'pop' => 'Pop',
'rock' => 'Rock',
'hip_hop' => 'Hip Hop',
'electronic' => 'Electronic/EDM',
'folk' => 'Folk',
'international' => 'International',
'regional' => 'Regional'
]
],
'gaming_habits' => [
'question' => 'How often do you play games (mobile, PC, console)?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'few_times_week' => 'Few times a week',
'weekly' => 'Weekly',
'monthly' => 'Monthly',
'rarely' => 'Rarely',
'never' => 'Never'
]
],
'reading_habits' => [
'question' => 'How often do you read books, magazines, or blogs?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'few_times_week' => 'Few times a week',
'weekly' => 'Weekly',
'monthly' => 'Monthly',
'rarely' => 'Rarely',
'never' => 'Never'
]
],
'content_consumption_device' => [
'question' => 'Which device do you primarily use for entertainment? (Select all that apply)',
'type' => 'multiple',
'options' => [
'smartphone' => 'Smartphone',
'smart_tv' => 'Smart TV',
'laptop' => 'Laptop',
'tablet' => 'Tablet',
'desktop' => 'Desktop computer',
'gaming_console' => 'Gaming console',
'traditional_tv' => 'Traditional TV'
]
],
'entertainment_spending' => [
'question' => 'How much do you spend on entertainment monthly?',
'type' => 'single',
'options' => [
'below_500' => 'Below ₹500',
'500_1000' => '₹500 - ₹1,000',
'1000_2000' => '₹1,000 - ₹2,000',
'2000_5000' => '₹2,000 - ₹5,000',
'above_5000' => 'Above ₹5,000',
'not_sure' => 'Not sure'
]
]
]
],
'food_dining' => [
'name' => 'Food & Dining',
'description' => 'Share your food preferences and dining habits',
'questions' => [
'cooking_frequency' => [
'question' => 'How often do you cook at home?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'few_times_week' => 'Few times a week',
'weekly' => 'Weekly',
'monthly' => 'Monthly',
'rarely' => 'Rarely',
'never' => 'Never - I don\'t cook'
]
],
'cuisine_preferences' => [
'question' => 'Which cuisines do you enjoy? (Select all that apply)',
'type' => 'multiple',
'options' => [
'north_indian' => 'North Indian',
'south_indian' => 'South Indian',
'regional_local' => 'Regional/Local cuisine',
'chinese' => 'Chinese',
'italian' => 'Italian',
'continental' => 'Continental',
'mexican' => 'Mexican',
'thai' => 'Thai',
'japanese' => 'Japanese',
'fast_food' => 'Fast food'
]
],
'dining_out_frequency' => [
'question' => 'How often do you dine out or order food?',
'type' => 'single',
'options' => [
'daily' => 'Daily',
'few_times_week' => 'Few times a week',
'weekly' => 'Weekly',
'monthly' => 'Monthly',
'occasionally' => 'Occasionally',
'rarely' => 'Rarely'
]
],
'food_delivery_apps' => [
'question' => 'Which food delivery apps do you use? (Select all that apply)',
'type' => 'multiple',
'options' => [
'zomato' => 'Zomato',
'swiggy' => 'Swiggy',
'uber_eats' => 'Uber Eats',
'dominos' => 'Domino\'s',
'pizza_hut' => 'Pizza Hut',
'restaurant_direct' => 'Restaurant direct delivery',
'none' => 'None - I don\'t use food delivery'
]
],
'food_spending_monthly' => [
'question' => 'How much do you spend on food (including dining out) monthly?',
'type' => 'single',
'options' => [
'below_3k' => 'Below ₹3,000',
'3k_5k' => '₹3,000 - ₹5,000',
'5k_8k' => '₹5,000 - ₹8,000',
'8k_12k' => '₹8,000 - ₹12,000',
'12k_20k' => '₹12,000 - ₹20,000',
'above_20k' => 'Above ₹20,000'
]
],
'special_dietary_requirements' => [
'question' => 'Do you have any special dietary requirements? (Select all that apply)',
'type' => 'multiple',
'options' => [
'gluten_free' => 'Gluten-free',
'dairy_free' => 'Dairy-free',
'sugar_free' => 'Sugar-free/Low sugar',
'low_sodium' => 'Low sodium',
'organic_only' => 'Organic food only',
'weight_management' => 'Weight management diet',
'diabetic_friendly' => 'Diabetic-friendly',
'none' => 'No special requirements'
]
],
'grocery_shopping_preference' => [
'question' => 'Where do you prefer to buy groceries? (Select all that apply)',
'type' => 'multiple',
'options' => [
'local_stores' => 'Local grocery stores',
'supermarkets' => 'Supermarkets',
'online_delivery' => 'Online grocery delivery',
'wholesale_markets' => 'Wholesale markets',
'organic_stores' => 'Organic/specialty stores',
'convenience_stores' => 'Convenience stores'
]
],
'beverage_preferences' => [
'question' => 'What beverages do you regularly consume? (Select all that apply)',
'type' => 'multiple',
'options' => [
'tea' => 'Tea',
'coffee' => 'Coffee',
'soft_drinks' => 'Soft drinks',
'juices' => 'Fruit juices',
'energy_drinks' => 'Energy drinks',
'health_drinks' => 'Health drinks/Protein shakes',
'alcohol' => 'Alcoholic beverages',
'water_only' => 'Mostly just water'
]
]
]
],
'financial_services' => [
'name' => 'Financial Services',
'description' => 'Tell us about your financial preferences and banking habits',
'questions' => [
'primary_bank' => [
'question' => 'Which is your primary bank?',
'type' => 'single',
'options' => [
'sbi' => 'State Bank of India (SBI)',
'hdfc' => 'HDFC Bank',
'icici' => 'ICICI Bank',
'axis' => 'Axis Bank',
'pnb' => 'Punjab National Bank',
'canara' => 'Canara Bank',
'bob' => 'Bank of Baroda',
'kotak' => 'Kotak Mahindra Bank',
'yes_bank' => 'Yes Bank',
'other' => 'Other'
]
],
'banking_frequency' => [
'question' => 'How often do you visit bank branches?',
'type' => 'single',
'options' => [
'weekly' => 'Weekly',
'monthly' => 'Monthly',
'quarterly' => 'Quarterly',
'rarely' => 'Rarely',
'never' => 'Never - I use only digital banking'
]
],
'investment_products' => [
'question' => 'Which investment products do you currently use? (Select all that apply)',
'type' => 'multiple',
'options' => [
'savings_account' => 'Savings account',
'fixed_deposits' => 'Fixed deposits',
'mutual_funds' => 'Mutual funds',
'stocks' => 'Stocks/Shares',
'ppf' => 'PPF (Public Provident Fund)',
'nps' => 'NPS (National Pension System)',
'life_insurance' => 'Life insurance',
'gold' => 'Gold investments',
'real_estate' => 'Real estate',
'none' => 'None of these'
]
],
'credit_products' => [
'question' => 'Which credit products do you use? (Select all that apply)',
'type' => 'multiple',
'options' => [
'credit_card' => 'Credit card',
'personal_loan' => 'Personal loan',
'home_loan' => 'Home loan',
'car_loan' => 'Car loan',
'education_loan' => 'Education loan',
'business_loan' => 'Business loan',
'overdraft' => 'Overdraft facility',
'none' => 'None'
]
],
'financial_planning' => [
'question' => 'Do you engage in financial planning?',
'type' => 'single',
'options' => [
'professional_advisor' => 'Yes, with a professional financial advisor',
'self_planned' => 'Yes, I plan myself',
'family_guidance' => 'Yes, with family guidance',
'basic_planning' => 'Basic planning only',
'no_planning' => 'No, I don\'t plan financially',
'want_to_start' => 'No, but I want to start'
]
],
'insurance_products' => [
'question' => 'What insurance products do you have? (Select all that apply)',
'type' => 'multiple',
'options' => [
'life_insurance' => 'Life insurance',
'health_insurance' => 'Health insurance',
'vehicle_insurance' => 'Vehicle insurance',
'home_insurance' => 'Home insurance',
'travel_insurance' => 'Travel insurance',
'term_insurance' => 'Term insurance',
'none' => 'No insurance'
]
],
'digital_payment_comfort' => [
'question' => 'How comfortable are you with digital payments?',
'type' => 'single',
'options' => [
'very_comfortable' => 'Very comfortable - I use for all transactions',
'mostly_comfortable' => 'Mostly comfortable - I use for most transactions',
'somewhat_comfortable' => 'Somewhat comfortable - I use for small amounts',
'limited_use' => 'Limited use - Only when necessary',
'prefer_cash' => 'I prefer cash transactions'
]
],
'financial_goals' => [
'question' => 'What are your main financial goals? (Select all that apply)',
'type' => 'multiple',
'options' => [
'emergency_fund' => 'Building emergency fund',
'retirement_planning' => 'Retirement planning',
'home_purchase' => 'Buying a home',
'child_education' => 'Children\'s education',
'wealth_creation' => 'Wealth creation',
'debt_reduction' => 'Reducing debt',
'travel_fund' => 'Travel fund',
'business_investment' => 'Starting/expanding business',
'no_specific_goals' => 'No specific goals'
]
]
]
],
'communication_payments' => [
'name' => 'Communication & Payments',
'description' => 'Share your communication preferences and survey availability',
'questions' => [
'preferred_days_for_surveys' => [
'question' => 'Which days of the week are you available for surveys? (Select all that apply)',
'type' => 'multiple',
'options' => [
'monday' => 'Monday',
'tuesday' => 'Tuesday',
'wednesday' => 'Wednesday',
'thursday' => 'Thursday',
'friday' => 'Friday',
'saturday' => 'Saturday',
'sunday' => 'Sunday',
'any_day' => 'Any day of the week'
]
],
'notification_preferences' => [
'question' => 'How would you like to receive survey notifications? (Select all that apply)',
'type' => 'multiple',
'options' => [
'sms' => 'SMS',
'email' => 'Email',
'whatsapp' => 'WhatsApp',
'app_notification' => 'App notification',
'phone_call' => 'Phone call'
]
],
'primary_communication_language' => [
'question' => 'What is your preferred language for communication?',
'type' => 'single',
'options' => [
'english' => 'English',
'hindi' => 'Hindi',
'tamil' => 'Tamil',
'telugu' => 'Telugu',
'bengali' => 'Bengali',
'marathi' => 'Marathi',
'gujarati' => 'Gujarati',
'kannada' => 'Kannada',
'malayalam' => 'Malayalam',
'punjabi' => 'Punjabi',
'other' => 'Other'
]
],
'survey_participation_time' => [
'question' => 'What time of day do you prefer to participate in surveys? (Select all that apply)',
'type' => 'multiple',
'options' => [
'early_morning' => 'Early Morning (6 AM - 9 AM)',
'mid_morning' => 'Mid Morning (9 AM - 12 PM)',
'afternoon' => 'Afternoon (12 PM - 3 PM)',
'late_afternoon' => 'Late Afternoon (3 PM - 6 PM)',
'evening' => 'Evening (6 PM - 9 PM)',
'night' => 'Night (9 PM - 12 AM)',
'late_night' => 'Late Night (12 AM - 6 AM)',
'flexible' => 'Flexible - any time works for me'
]
],
'device_ownership' => [
'question' => 'Which devices do you use regularly? (Select all that apply)',
'type' => 'multiple',
'options' => [
'smartphone' => 'Smartphone',
'laptop' => 'Laptop/Desktop',
'tablet' => 'Tablet',
'smart_tv' => 'Smart TV',
'smartwatch' => 'Smartwatch',
'feature_phone' => 'Feature Phone (non-smartphone)'
]
],
'online_payment_methods' => [
'question' => 'Which online payment methods do you use? (Select all that apply)',
'type' => 'multiple',
'options' => [
'upi' => 'UPI (PhonePe, GooglePay, Paytm)',
'credit_card' => 'Credit Card',
'debit_card' => 'Debit Card',
'net_banking' => 'Net Banking',
'digital_wallet' => 'Digital Wallets',
'cod' => 'Cash on Delivery',
'bank_transfer' => 'Bank Transfer'
]
],
'survey_types_interest' => [
'question' => 'What types of surveys interest you most? (Select all that apply)',
'type' => 'multiple',
'options' => [
'products' => 'Product reviews and feedback',
'brands' => 'Brand awareness surveys',
'lifestyle' => 'Lifestyle and habits',
'technology' => 'Technology and gadgets',
'entertainment' => 'Entertainment and media',
'politics' => 'Political opinions',
'social_issues' => 'Social issues',
'health' => 'Health and wellness',
'finance' => 'Financial products and services',
'all_types' => 'All types of surveys'
]
]
]
],
'household_classification' => [
'name' => 'Household Classification (ISEC)',
'description' => 'Help us understand your household background for better survey matching. Based on MRSI ISEC 2024 classification.',
'questions' => [
'cwe_occupation' => [
'question' => 'What is the occupation of the Chief Wage Earner (the person who earns the most in your household)?',
'type' => 'single',
'options' => [
'labour' => 'Unskilled / Semi-skilled Labour (daily wage, domestic worker, farm labour)',
'farmer' => 'Farmer / Agricultural Worker (owns or works on farm)',
'worker' => 'Skilled Worker / Artisan / Small Trader (mechanic, carpenter, small shopkeeper)',
'trader' => 'Trader / Business Owner / Contractor (medium/large business, contractor)',
'clerical' => 'Clerical / Supervisory / Junior Officer (office clerk, supervisor, junior govt employee)',
'managerial' => 'Senior Manager / Professional / Executive (doctor, engineer, CA, senior govt officer, executive)',
]
],
'male_education' => [
'question' => 'What is the highest level of education of the most educated male adult (21 years or above) in your household?',
'type' => 'single',
'options' => [
'no_adult' => 'No male adult aged 21+ in household',
'no_formal' => 'No formal schooling / Illiterate',
'upto_5' => 'Schooling up to Class 5',
'class_6_9' => 'Schooling Class 6 to 9',
'class_10_14' => 'Class 10 pass / SSC / HSC / Diploma',
'degree_regular' => 'Graduate / Post-Graduate (regular college degree)',
'degree_professional' => 'Professional Degree (Engineering / Medicine / CA / Law / MBA etc.)',
]
],
'female_education' => [
'question' => 'What is the highest level of education of the most educated female adult (21 years or above) in your household?',
'type' => 'single',
'options' => [
'no_adult' => 'No female adult aged 21+ in household',
'no_formal' => 'No formal schooling / Illiterate',
'upto_5' => 'Schooling up to Class 5',
'class_6_9' => 'Schooling Class 6 to 9',
'class_10_14' => 'Class 10 pass / SSC / HSC / Diploma',
'degree_regular' => 'Graduate / Post-Graduate (regular college degree)',
'degree_professional' => 'Professional Degree (Engineering / Medicine / CA / Law / MBA etc.)',
]
],
]
],
];
// Get the requested section
$currentSection = isset($_GET['section']) ? $_GET['section'] : null;
if (!$currentSection || !isset($profilerSections[$currentSection])) {
header('Location: dashboard.php#profiler');
exit;
}
$section = $profilerSections[$currentSection];
// Get existing responses for this section
$existingResponses = [];
try {
$stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = ?");
$stmt->execute([$user['id'], $currentSection]);
while ($row = $stmt->fetch()) {
$existingResponses[$row['question_id']] = json_decode($row['response'], true);
}
} catch (Exception $e) {
logError('Error fetching existing responses', ['user_id' => $user['id'], 'section' => $currentSection, 'error' => $e->getMessage()]);
}
// Determine mode: view (default if has responses) or edit
$hasResponses = !empty($existingResponses);
$editMode = isset($_GET['edit']) && $_GET['edit'] == '1';
// If no responses yet, always edit mode
if (!$hasResponses) $editMode = true;
$successMessage = '';
$errorMessages = [];
// Handle form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$responses = [];
$hasErrors = false;
foreach ($section['questions'] as $questionId => $questionData) {
if ($questionData['type'] === 'single') {
$value = isset($_POST[$questionId]) ? sanitize($_POST[$questionId]) : '';
if (!empty($value)) {
$responses[$questionId] = $value;
} elseif (isset($existingResponses[$questionId])) {
// Cannot empty a previously answered question — keep old response
$responses[$questionId] = $existingResponses[$questionId];
}
} elseif ($questionData['type'] === 'multiple') {
$values = isset($_POST[$questionId]) ? $_POST[$questionId] : [];
if (is_array($values) && !empty($values)) {
$cleanValues = array_map('sanitize', $values);
$responses[$questionId] = $cleanValues;
} elseif (isset($existingResponses[$questionId])) {
// Cannot empty — keep old response
$responses[$questionId] = $existingResponses[$questionId];
}
}
}
if (!$hasErrors) {
try {
$pdo->beginTransaction();
// Save all responses
foreach ($responses as $questionId => $response) {
$stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()");
$responseJson = json_encode($response);
$stmt->execute([$user['id'], $currentSection, $questionId, $responseJson, $responseJson]);
}
// Calculate completion percentage
$totalQuestions = count($section['questions']);
$answeredQuestions = count($responses);
$completionPercentage = ($answeredQuestions / $totalQuestions) * 100;
$isCompleted = $completionPercentage >= 100;
// Update completion status
$stmt = $pdo->prepare("INSERT INTO profiler_completion (user_id, section, total_questions, answered_questions, completion_percentage, is_completed, completed_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE answered_questions = ?, completion_percentage = ?, is_completed = ?, completed_at = CASE WHEN ? = 1 THEN NOW() ELSE completed_at END, updated_at = NOW()");
$completedAt = $isCompleted ? date('Y-m-d H:i:s') : null;
$stmt->execute([$user['id'], $currentSection, $totalQuestions, $answeredQuestions, $completionPercentage, $isCompleted, $completedAt, $answeredQuestions, $completionPercentage, $isCompleted, $isCompleted]);
// Award points if section is completed and not already awarded
if ($isCompleted) {
$stmt = $pdo->prepare("SELECT points_awarded FROM profiler_completion WHERE user_id = ? AND section = ?");
$stmt->execute([$user['id'], $currentSection]);
$completion = $stmt->fetch();
if ($completion && !$completion['points_awarded']) {
// ISEC section earns 20 points, all others earn 5
$pointsToAward = ($currentSection === 'household_classification') ? 20 : 5;
$pointsDescription = 'Profiler section completion: ' . $section['name'];
$stmt = $pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ?");
$stmt->execute([$user['id'], $pointsToAward, $pointsToAward, $pointsToAward, $pointsToAward]);
$stmt = $pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', ?, ?, ?)");
$stmt->execute([$user['id'], $pointsToAward, 'profiler_' . $currentSection, $pointsDescription]);
$stmt = $pdo->prepare("UPDATE profiler_completion SET points_awarded = 1 WHERE user_id = ? AND section = ?");
$stmt->execute([$user['id'], $currentSection]);
logError('Profiler points awarded', ['user_id' => $user['id'], 'section' => $currentSection, 'points' => $pointsToAward]);
}
// For ISEC section: compute and save SEC class to users table
if ($currentSection === 'household_classification') {
$occ = $responses['cwe_occupation'] ?? null;
$mEdu = $responses['male_education'] ?? null;
$fEdu = $responses['female_education'] ?? null;
if ($occ && $mEdu && $fEdu) {
$tier = computeISECTier($occ, $mEdu, $fEdu);
$secClass = $tier ? getISECClass($tier) : null;
if ($secClass) {
$stmt = $pdo->prepare("UPDATE users SET isec_class = ?, isec_tier = ?, updated_at = NOW() WHERE id = ?");
$stmt->execute([$secClass, $tier, $user['id']]);
logError('ISEC class computed', ['user_id' => $user['id'], 'tier' => $tier, 'class' => $secClass]);
}
}
}
}
$pdo->commit();
// Reload responses and switch to view mode
$existingResponses = [];
$stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = ?");
$stmt->execute([$user['id'], $currentSection]);
while ($row = $stmt->fetch()) {
$existingResponses[$row['question_id']] = json_decode($row['response'], true);
}
$hasResponses = !empty($existingResponses);
$editMode = false;
$successMessage = 'Your responses have been saved successfully!';
} catch (Exception $e) {
$pdo->rollback();
logError('Error saving profiler responses', ['user_id' => $user['id'], 'section' => $currentSection, 'error' => $e->getMessage()]);
$errorMessages[] = 'Error saving your responses. Please try again.';
}
}
}
// Helper: get option label for a value
function getOptionLabel($questionData, $value) {
return isset($questionData['options'][$value]) ? $questionData['options'][$value] : ucwords(str_replace('_', ' ', $value));
}
?>
- Profiler | Relevant Reflex
Complete your profile, earn points, and participate in paid surveys.
Important! Read 4 essential rules before taking any survey to protect your account and earn maximum rewards.
Available Points
₹ value
Surveys Done
total
Profile
%
sections
Total Earned
Since
Complete Profile
Earn up to 70 points
Redeem Rewards
Convert points to cash
Get Help
Support & FAQs
⚠ Read This Before You Take Any Survey
4 essential rules to protect your account and earn maximum rewards
1
Take your time. Read every question carefully. There are no right or wrong answers — we want your genuine opinion. Think about each question and answer what you truly feel. Surveys that are rushed through too quickly get automatically flagged and your response may be rejected without reward.
2
One attempt per person, per device. Each survey can only be taken once from your IP address or device. Duplicate attempts are automatically detected and flagged. Do not try to retake a survey using a different browser, incognito mode, or VPN — it will be caught and may result in account action.
3
Do not straightline your responses. Straightlining means selecting the same answer option for every question in a row (e.g., choosing "Agree" for all statements). This is a well-known indicator of low-quality responses and is flagged by our system. Only select the same answer repeatedly if that genuinely reflects your opinion.
4
Give thoughtful answers to open-ended questions. When a survey asks you to type your opinion or explain something in your own words, write a genuine, meaningful response. Vague, gibberish, or nonsensical text (e.g., random letters, copy-pasted filler, or irrelevant answers) will be flagged. Responses containing such text will be marked invalid and the completion will not count — no points will be awarded.
Why this matters: Research clients review every response for quality. Flagged responses (speeding, duplicates, straightlining, or gibberish open-ended answers) are rejected and no points are awarded. Repeated violations may lead to fewer survey invitations or account restrictions.
Complete your profile for more surveys. done. Continue →
How it works: Click any survey to see full details. Completed surveys are reviewed when the project closes. Points are credited once approved. "Under Review" means quality concerns (e.g., LOI below minimum threshold). ● = normal LOI, ● = slow, ● = below threshold.
Share your link with friends, groups, or on social media
✍️
They register using your link and verify their email
You earn ₹5 (10 pts)
📋
Every time they complete a survey
You earn ₹5 (10 pts) more
💰
Rewards go directly into your points balance for redemption
Where to Share Your Link
💬 Messaging Apps: WhatsApp groups, Telegram channels & groups, Instagram DMs 📱 Social Media: Facebook posts & stories, Instagram Reels/Shorts, YouTube video descriptions, Twitter/X threads 📣 Promotions: Digital ad banners, blog articles, email newsletters, LinkedIn posts ⚠️ Fair Use: Referral rewards are for genuine referrals only. Multiple clicks from the same IP are limited. Self-referrals are not counted. Abuse may result in reward reversal.
Click & Signup History
#
Referred Email
Clicked
Signed Up
Verified
Signup Reward
Survey Earnings
🔗
No referral clicks yet. Share your link to get started!
$r): ?>
Not signed up
✓ YesPending
✓ Verified⏳ Pending—
₹5 PaidProcessing—
0): ?>
₹₹0.00
Referral Reward Transactions
Date
Type
Points
Description
💰
No referral rewards yet. Start sharing your link!
Signup RewardSurvey Reward
+ pts
₹
-------------------- END OF FILE --------------------
### FILE 32: RR com/reset-password.php
- Type: PHP
- Size: 10.56 KB
- Path: RR com
- Name: reset-password.php
------------------------------------------------------------
getConnection();
$stmt = $pdo->prepare("
SELECT email, expires_at
FROM password_resets
WHERE token = ? AND expires_at > NOW()
");
$stmt->execute([$token]);
$reset = $stmt->fetch();
if ($reset) {
$email = $reset['email'];
$isValidToken = true;
}
} catch (Exception $e) {
logError('Error checking reset token', ['error' => $e->getMessage()]);
}
}
// Handle password reset form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $isValidToken) {
$newPassword = isset($_POST['password']) ? $_POST['password'] : '';
$confirmPassword = isset($_POST['confirm_password']) ? $_POST['confirm_password'] : '';
// Validation
$errors = [];
if (empty($newPassword)) {
$errors[] = 'Password is required.';
}
if (empty($confirmPassword)) {
$errors[] = 'Please confirm your password.';
}
if (!validatePassword($newPassword)) {
$errors[] = 'Password must be at least 8 characters long.';
}
if ($newPassword !== $confirmPassword) {
$errors[] = 'Passwords do not match.';
}
if (empty($errors)) {
try {
// Start transaction
$pdo->beginTransaction();
// Hash new password
$hashedPassword = hashPassword($newPassword);
// Update user password
$stmt = $pdo->prepare("UPDATE users SET password = ?, updated_at = NOW() WHERE email = ?");
$stmt->execute([$hashedPassword, $email]);
// Delete used reset token
$stmt = $pdo->prepare("DELETE FROM password_resets WHERE token = ?");
$stmt->execute([$token]);
// Delete all user sessions (force re-login)
$stmt = $pdo->prepare("DELETE FROM user_sessions WHERE user_id = (SELECT id FROM users WHERE email = ?)");
$stmt->execute([$email]);
// Commit transaction
$pdo->commit();
logError('Password reset successful', ['email' => $email]);
// Redirect to success page
showResetResult(true, 'Password Reset Successful', 'Your password has been reset successfully. You can now log in with your new password.');
} catch (PDOException $e) {
if ($pdo->inTransaction()) {
$pdo->rollback();
}
logError('Database error during password reset', [
'error' => $e->getMessage(),
'email' => $email
]);
$errors[] = 'Failed to reset password due to a system error. Please try again later.';
} catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollback();
}
logError('General error during password reset', [
'error' => $e->getMessage(),
'email' => $email
]);
$errors[] = 'An unexpected error occurred. Please try again later.';
}
}
}
function showResetResult($success, $title, $message) {
$statusClass = $success ? 'success' : 'error';
$statusColor = $success ? '#28a745' : '#dc3545';
$iconClass = $success ? 'fa-check-circle' : 'fa-exclamation-triangle';
?>
- Relevant Reflex
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking "Accept All", you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 37: RR com/sitemap.xml
- Type: XML
- Size: 4.72 KB
- Path: RR com
- Name: sitemap.xml
------------------------------------------------------------
https://www.relevantreflex.com/2026-04-10weekly1.0https://www.relevantreflex.com/about.php2026-04-07monthly0.8https://www.relevantreflex.com/doubts.php2026-04-07monthly0.8https://www.relevantreflex.com/articles.php2026-04-10weekly0.9https://www.relevantreflex.com/contact.php2026-04-07monthly0.6https://www.relevantreflex.com/privacy.php2026-04-07yearly0.4https://www.relevantreflex.com/terms.php2026-04-07yearly0.4https://www.relevantreflex.com/disclaimer.php2026-04-07yearly0.4https://www.relevantreflex.com/ticket-guide.php2026-04-07monthly0.4https://www.relevantreflex.com/articles/earn-money-online-surveys-india-guide.php2026-04-13monthly0.9https://www.relevantreflex.com/articles/paid-surveys-india-earning-potential.php2026-04-09monthly0.9https://www.relevantreflex.com/articles/relevant-reflex-review-legit.php2026-04-09monthly0.9https://www.relevantreflex.com/articles/best-paid-survey-sites-india.php2026-04-09monthly0.8https://www.relevantreflex.com/articles/online-surveys-india-students.php2026-04-09monthly0.8https://www.relevantreflex.com/articles/online-surveys-india-housewives.php2026-04-10monthly0.8https://www.relevantreflex.com/articles/how-to-identify-genuine-survey-websites.php2026-04-07monthly0.8https://www.relevantreflex.com/articles/5-ways-maximize-survey-earnings.php2026-04-07monthly0.8https://www.relevantreflex.com/articles/complete-guide-survey-beginners-india.php2026-04-07monthly0.8https://www.relevantreflex.com/articles/realistic-earning-expectations-surveys-india.php2026-04-07monthly0.8https://www.relevantreflex.com/articles/best-survey-platforms-indian-users.php2026-04-07monthly0.8https://www.relevantreflex.com/articles/time-management-tips-survey-takers.php2026-04-07monthly0.8
-------------------- END OF FILE --------------------
### FILE 38: RR com/sms-config.php
- Type: PHP
- Size: 11.78 KB
- Path: RR com
- Name: sms-config.php
------------------------------------------------------------
gateway = 'twofactor'; // Using 2Factor as primary gateway
// SMS Gateway configurations
$this->config = [
'msg91' => [
'auth_key' => 'YOUR_MSG91_AUTH_KEY', // Replace with actual key
'template_id' => 'YOUR_TEMPLATE_ID', // Replace with actual template ID
'route' => '4', // Transactional route
'country' => '91'
],
'textlocal' => [
'api_key' => 'YOUR_TEXTLOCAL_API_KEY',
'username' => 'YOUR_TEXTLOCAL_USERNAME',
'hash' => 'YOUR_TEXTLOCAL_HASH',
'sender' => 'TXTLCL' // 6 characters or less
],
'twofactor' => [
'api_key' => '79d4feb6-d168-11ea-9fa5-0200cd936042', // Your actual 2Factor API key
'sender_id' => 'RELREF', // Matches 2Factor dashboard: Sender Id = RELREF
'template_name' => 'Profile OTP' // Matches 2Factor dashboard: Template Name = Profile OTP
],
'fast2sms' => [
'api_key' => 'YOUR_FAST2SMS_API_KEY',
'route' => 'dlt', // DLT route for OTP
'sender_id' => 'FSTSMS'
]
];
}
/**
* Send OTP SMS
*/
public function sendOTP($mobileNumber, $otpCode, $templateMessage = null) {
// Clean mobile number
$mobileNumber = preg_replace('/[^0-9]/', '', $mobileNumber);
// Remove leading zero if present
if (substr($mobileNumber, 0, 1) === '0') {
$mobileNumber = substr($mobileNumber, 1);
}
// Default OTP message
if (!$templateMessage) {
$templateMessage = "Your Relevant Reflex verification code is: {$otpCode}. Valid for 10 minutes. Do not share this with anyone.";
}
switch ($this->gateway) {
case 'msg91':
return $this->sendViaMSG91($mobileNumber, $otpCode, $templateMessage);
case 'textlocal':
return $this->sendViaTextLocal($mobileNumber, $templateMessage);
case 'twofactor':
return $this->sendViaTwoFactor($mobileNumber, $otpCode);
case 'fast2sms':
return $this->sendViaFast2SMS($mobileNumber, $templateMessage);
default:
return $this->mockSend($mobileNumber, $otpCode); // For testing
}
}
/**
* MSG91 SMS Gateway
*/
private function sendViaMSG91($mobileNumber, $otpCode, $message) {
$config = $this->config['msg91'];
$url = "https://api.msg91.com/api/v5/otp";
$data = [
'template_id' => $config['template_id'],
'mobile' => $config['country'] . $mobileNumber,
'authkey' => $config['auth_key'],
'otp' => $otpCode,
'extra_param' => json_encode(['otp' => $otpCode])
];
return $this->makeAPICall($url, $data, 'POST');
}
/**
* TextLocal SMS Gateway
*/
private function sendViaTextLocal($mobileNumber, $message) {
$config = $this->config['textlocal'];
$url = "https://api.textlocal.in/send/";
$data = [
'apikey' => $config['api_key'],
'numbers' => '91' . $mobileNumber,
'message' => $message,
'sender' => $config['sender']
];
return $this->makeAPICall($url, $data, 'POST');
}
/**
* 2Factor SMS Gateway
*
* Uses OTP SMS API with explicit template name to force SMS delivery.
* Template: "XXXX is the OTP to verify your mobile number at Relevant Reflex"
* Sender ID: RELREF | Template Name: Profile OTP
*
* By specifying the template name in the URL, 2Factor uses the registered
* DLT SMS template instead of defaulting to voice calls.
*/
private function sendViaTwoFactor($mobileNumber, $otpCode) {
$config = $this->config['twofactor'];
// OTP API with template name — forces SMS delivery via registered DLT template
// Format: /SMS/{phone}/{otp}/{template_name}
$templateName = urlencode($config['template_name']);
$url = "https://2factor.in/API/V1/{$config['api_key']}/SMS/{$mobileNumber}/{$otpCode}/{$templateName}";
$result = $this->makeAPICall($url, [], 'GET');
// Log the attempt
logError('2Factor OTP SMS with template', [
'mobile' => $mobileNumber,
'template' => $config['template_name'],
'status' => $result['response']['Status'] ?? 'unknown',
'details' => $result['response']['Details'] ?? 'none'
]);
if ($result['success'] && isset($result['response']['Status'])
&& $result['response']['Status'] == 'Success') {
return [
'success' => true,
'message' => 'OTP sent via SMS successfully',
'session_id' => $result['response']['Details'] ?? null,
'response' => $result['response']
];
}
return [
'success' => false,
'message' => 'Failed to send SMS OTP: ' . ($result['response']['Details'] ?? 'Unknown error'),
'response' => $result['response'] ?? []
];
}
/**
* Fast2SMS Gateway
*/
private function sendViaFast2SMS($mobileNumber, $message) {
$config = $this->config['fast2sms'];
$url = "https://www.fast2sms.com/dev/bulkV2";
$data = [
'authorization' => $config['api_key'],
'sender_id' => $config['sender_id'],
'message' => $message,
'route' => $config['route'],
'numbers' => $mobileNumber
];
$headers = [
'authorization: ' . $config['api_key'],
'Content-Type: application/json'
];
return $this->makeAPICall($url, $data, 'POST', $headers);
}
/**
* Mock SMS sending for testing
*/
private function mockSend($mobileNumber, $otpCode) {
logError('Mock SMS sent', [
'mobile' => $mobileNumber,
'otp' => $otpCode,
'message' => 'OTP for testing: ' . $otpCode
]);
return [
'success' => true,
'message' => 'SMS sent successfully (Mock)',
'reference_id' => 'MOCK_' . time()
];
}
/**
* Make API call to SMS gateway
*/
private function makeAPICall($url, $data, $method = 'POST', $headers = []) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
if (!empty($data)) {
if (empty($headers) || !in_array('Content-Type: application/json', $headers)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
} else {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
}
}
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
logError('SMS API Error', ['error' => $error, 'url' => $url]);
return [
'success' => false,
'message' => 'Network error: ' . $error
];
}
$decodedResponse = json_decode($response, true);
logError('SMS API Response', [
'url' => $url,
'http_code' => $httpCode,
'response' => $decodedResponse ?: $response
]);
// Parse response based on gateway
return $this->parseResponse($decodedResponse ?: $response, $httpCode);
}
/**
* Parse SMS gateway response
*/
private function parseResponse($response, $httpCode) {
if ($httpCode >= 200 && $httpCode < 300) {
return [
'success' => true,
'message' => 'SMS sent successfully',
'response' => $response
];
} else {
return [
'success' => false,
'message' => 'SMS sending failed',
'response' => $response
];
}
}
/**
* Get available SMS balance (if supported by gateway)
*/
public function getBalance() {
switch ($this->gateway) {
case 'msg91':
$config = $this->config['msg91'];
$url = "https://api.msg91.com/api/balance.php?authkey={$config['auth_key']}&type=4";
return $this->makeAPICall($url, [], 'GET');
case 'twofactor':
$config = $this->config['twofactor'];
$url = "https://2factor.in/API/V1/{$config['api_key']}/ADDON_SERVICES/BAL/SMS";
return $this->makeAPICall($url, [], 'GET');
default:
return ['success' => false, 'message' => 'Balance check not supported for this gateway'];
}
}
}
// Global SMS helper function
function sendOTPSMS($mobileNumber, $otpCode) {
$smsManager = new SMSManager();
return $smsManager->sendOTP($mobileNumber, $otpCode);
}
/*
* SETUP INSTRUCTIONS FOR 2FACTOR SMS GATEWAY
* ===========================================
*
* Your 2Factor API Key: 79d4feb6-d168-11ea-9fa5-0200cd936042
*
* FIXING "VOICE CALL INSTEAD OF SMS" ISSUE:
* ------------------------------------------
* The 2Factor OTP API has auto-retry that sends voice calls when SMS fails.
* To get SMS working properly:
*
* STEP 1: Login to https://2factor.in with your account
*
* STEP 2: Disable Voice Auto-Retry
* - Go to Dashboard → Settings (or OTP Settings)
* - Find "Auto Retry" / "Voice OTP Retry" / "Retry Configuration"
* - DISABLE it (turn off voice fallback)
*
* STEP 3: Check DLT Registration (REQUIRED for SMS in India)
* - In India, TRAI requires DLT registration for all SMS
* - Go to 2Factor Dashboard → DLT Settings / SMS Templates
* - You need:
* a) A registered Sender ID (e.g., "RREFX")
* b) A DLT-approved Content Template for OTP
* Example template: "Your Relevant Reflex OTP is {#var#}. Valid for 10 minutes."
* - Update the sender_id and template_name in config above after registering
* - If you don't have DLT registration, register at:
* Jio: https://trueconnect.jio.com
* Airtel: https://www.airtel.in/business/commercial-communication
* Vodafone: https://smartping.live/entity/reg-as
*
* STEP 4: Check SMS Balance
* - Go to Dashboard → Balance
* - Verify you have SMS credits (not just voice credits)
* - Current balance: ~7,038 SMS credits
*
* STEP 5: Test
* - After disabling auto-retry and setting up DLT template
* - Try sending OTP from mobile-verification.php
* - Check errors.log for detailed API responses
*
* HOW THIS CODE WORKS:
* - First tries Transactional SMS API (no voice fallback at all)
* - If that fails, falls back to OTP API (may trigger voice if auto-retry is on)
* - Both attempts are logged to errors.log for debugging
*
*/
?>
-------------------- END OF FILE --------------------
### FILE 39: RR com/support-upload-helper.php
- Type: PHP
- Size: 10.69 KB
- Path: RR com
- Name: support-upload-helper.php
------------------------------------------------------------
SUPPORT_MAX_FILE_SIZE) {
continue;
}
// Validate extension
$ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if (!in_array($ext, SUPPORT_ALLOWED_EXTENSIONS)) {
continue;
}
// Validate MIME type
$finfo = new finfo(FILEINFO_MIME_TYPE);
$detectedType = $finfo->file($tmpName);
if (!in_array($detectedType, SUPPORT_ALLOWED_TYPES)) {
continue;
}
// Generate unique filename
$storedName = 'support_' . $messageId . '_' . uniqid() . '.' . $ext;
$fullPath = $uploadPath . $storedName;
$relativePath = SUPPORT_UPLOAD_URL . $monthDir . '/' . $storedName;
if (move_uploaded_file($tmpName, $fullPath)) {
try {
$stmt = $pdo->prepare("
INSERT INTO support_attachments (message_id, file_name, original_name, file_path, file_type, file_size)
VALUES (?, ?, ?, ?, ?, ?)
");
$stmt->execute([$messageId, $storedName, $originalName, $relativePath, $detectedType, $fileSize]);
$attachmentIds[] = $pdo->lastInsertId();
} catch (Exception $e) {
// Clean up file if DB insert fails
@unlink($fullPath);
}
}
}
return $attachmentIds;
}
/**
* Get attachments for multiple messages (batch load)
* @param PDO $pdo
* @param array $messageIds Array of message IDs
* @return array Keyed by message_id => [attachments]
*/
function getAttachmentsForMessages($pdo, $messageIds) {
$result = [];
if (empty($messageIds)) return $result;
$placeholders = implode(',', array_fill(0, count($messageIds), '?'));
$stmt = $pdo->prepare("
SELECT * FROM support_attachments
WHERE message_id IN ($placeholders)
ORDER BY created_at ASC
");
$stmt->execute($messageIds);
$attachments = $stmt->fetchAll();
foreach ($attachments as $att) {
$result[$att['message_id']][] = $att;
}
return $result;
}
/**
* Render attachment HTML for display
* @param array $attachments Array of attachment rows
* @return string HTML string
*/
function renderAttachmentsHTML($attachments) {
if (empty($attachments)) return '';
$html = '
Welcome to Relevant Reflex!
These Terms and Conditions ("Terms") govern your use of our online survey platform and related services. Please read them carefully.
1 Acceptance of Terms
By using Relevant Reflex's services, you acknowledge that you have read, understood, and agree to be bound by these Terms, as well as our Privacy Policy.
If you do not agree with any part of these terms, you must not use our services. Your continued use of the platform constitutes acceptance of any modifications to these Terms.
2 Eligibility
2.1 Age Requirement
You must be at least 18 years old to use our services. By registering, you represent and warrant that you meet this age requirement.
2.2 Geographic Requirement
You must be a resident of India to participate in our surveys and receive rewards. This helps us provide relevant survey opportunities and comply with local regulations.
2.3 Account Limitations
You may only maintain one account with Relevant Reflex. Multiple accounts from the same individual are prohibited and may result in account suspension.
3 Account Registration and Security
3.1 Account Responsibility
You are responsible for:
Maintaining the confidentiality of your account information
All activities that occur under your account
Notifying us immediately of any unauthorized use
Ensuring your login credentials are secure
3.2 Accurate Information
You agree to provide accurate and up-to-date information during registration and throughout your use of our services. False or misleading information may result in account termination.
3.3 Account Verification
You must verify your email address and may be required to provide additional verification for account security or compliance purposes.
4 Survey Participation
4.1 Honest Responses
You agree to provide honest and thoughtful responses to surveys. Quality responses are essential for meaningful research.
4.2 Survey Qualification
We reserve the right to disqualify you from a survey if we detect:
Fraudulent or inconsistent responses
Use of automated tools or bots
Excessively fast completion times
Random or nonsensical answers
4.3 Survey Availability
Survey opportunities are based on your demographic profile and survey requirements. We cannot guarantee specific numbers or types of surveys.
Important: Completion of a survey does not guarantee reward if disqualified for quality reasons. We maintain strict quality standards to ensure valuable research data.
5 Rewards and Payments
5.1 Reward Distribution
Rewards will be issued as per the terms specified for each survey. Typical processing times are:
Survey validation: 1-5 business days
Payment processing: 3-7 business days
Bank transfer: 2-3 additional business days
5.2 Reward Modifications
We reserve the right to modify, suspend, or terminate the reward system at any time with reasonable notice to members.
5.3 Reward Restrictions and Payout Terms
Unless specified otherwise:
Rewards are non-transferable between accounts
Accumulated rewards can be withdrawn as cash via UPI once the minimum payout threshold has been reached. Rewards from specific bonus promotions may be subject to additional conditions stated at the time of the promotion.
Minimum payout threshold: ₹500. You must accumulate at least ₹500 in your account balance before requesting a withdrawal.
Payments are processed via UPI transfer to your registered UPI ID. UPI is currently the sole payment method for member withdrawals.
Payment processing may take 3–7 business days after a withdrawal request is submitted and approved.
5.4 Tax Responsibilities
You are responsible for reporting and paying any applicable taxes on rewards received. We may provide necessary documentation for tax purposes.
6 Intellectual Property
6.1 Platform Content
All content on our website, including text, graphics, logos, images, and software, is the property of Relevant Reflex or its licensors and is protected by copyright laws.
6.2 Usage Restrictions
You may not:
Use, reproduce, or distribute our content without express written permission
Modify or create derivative works from our platform
Reverse engineer any part of our services
Use our trademarks or branding without authorization
6.3 User-Generated Content
By providing survey responses and feedback, you grant us a non-exclusive, royalty-free license to use this information for research and platform improvement purposes.
7 Prohibited Conduct
You agree NOT to engage in any of the following activities:
7.1 Technical Violations
Use automated means (bots, scripts) to access our services or complete surveys
Attempt to interfere with the proper functioning of our website
Circumvent any security measures or access controls
Use VPNs or proxy services to mask your location
7.2 Identity and Fraud
Impersonate any person or entity
Create multiple accounts
Provide false personal information
Share account credentials with others
7.3 Legal Violations
Engage in any activity that violates applicable law or regulation
Violate the rights of other users or third parties
Transmit harmful, threatening, or offensive content
Engage in harassment or discrimination
Enforcement: Violation of these terms may result in immediate account suspension or termination, forfeiture of rewards, and potential legal action.
8 Termination
8.1 Termination by Us
We reserve the right to suspend or terminate your account at our discretion, without notice, for:
Violation of these Terms
Fraudulent activity
Extended inactivity (24+ months)
Legal or regulatory requirements
8.2 Termination by You
You may terminate your account at any time by:
Using the account deletion option in your settings
Contacting our support team
Sending a written request to support@relevantreflex.com
8.3 Effects of Termination
Upon termination:
Your access to the platform will be immediately revoked
Pending rewards may be forfeited (depending on circumstances)
Your personal data will be handled according to our Privacy Policy
Certain provisions of these Terms will survive termination
9 Limitation of Liability
9.1 Service Disclaimer
Our services are provided "as is" without warranties of any kind. We do not guarantee:
Uninterrupted or error-free service
Specific survey availability or earnings
Compatibility with all devices or browsers
Accuracy of third-party content
9.2 Liability Limitations
Relevant Reflex is not liable for any indirect, incidental, special, or consequential damages, including:
Loss of profits or earnings
Business interruption
Data loss or corruption
Emotional distress
9.3 Maximum Liability
Our total liability for any claim arising from these Terms shall not exceed the amount paid to you in the past 12 months, or ₹1,000, whichever is greater.
10 Indemnification
You agree to indemnify and hold Relevant Reflex harmless from any claims, losses, or damages arising from:
Your use of our services
Violation of these Terms
Violation of any law or regulation
Infringement of third-party rights
Your survey responses or other content
11 Privacy Policy
Your privacy is important to us. Our Privacy Policy explains how we collect, use, and protect your information. By using our services, you also agree to our Privacy Policy.
Key privacy principles:
We never sell your personal data to third parties
Your survey responses are anonymized for research
You control your data and can request deletion
We use industry-standard security measures
12 Changes to Terms
12.1 Modification Process
We may modify these Terms at any time. When we make changes, we will:
Update the "Last Modified" date
Notify active users via email
Provide a summary of significant changes
Allow reasonable time for review (minimum 30 days for material changes)
12.2 Acceptance of Changes
Continued use of our services after changes constitutes acceptance of the modified Terms. If you disagree with changes, you should terminate your account before they take effect.
13 Governing Law and Jurisdiction
13.1 Applicable Law
These Terms are governed by the laws of India, without regard to conflict of law principles.
13.2 Jurisdiction
Any disputes shall be subject to the exclusive jurisdiction of the courts in Tamil Nadu, India.
13.3 Dispute Resolution
Before pursuing legal action, we encourage users to:
Contact our support team to resolve issues
Allow 30 days for resolution attempts
Consider mediation for complex disputes
14 Contact Information
If you have questions about these Terms, please contact us:
Relevant Reflex
Ethirmedu, NH 544
Tamilnadu - 638183
India
Thank you for using Relevant Reflex!
We appreciate your participation in our survey community and your commitment to providing quality responses.
We use cookies to improve your experience and for advertising purposes (including Google Ads). By clicking “Accept All”, you consent to our use of cookies as described in our Privacy Policy. You may decline non-essential cookies.
-------------------- END OF FILE --------------------
### FILE 42: RR com/ticket-guide.php
- Type: PHP
- Size: 34.52 KB
- Path: RR com
- Name: ticket-guide.php
------------------------------------------------------------
Support Ticket Guide - How It Works | Relevant Reflex
Support Ticket Guide
Learn how our support ticket system works and how to get the best help from our team.
Our support ticket system is designed to provide you with efficient, trackable help for any issues or questions you may have. Each ticket gets a unique number and goes through a structured process to ensure nothing gets missed.
How to Create a Support Ticket
Login to your account - Visit your dashboard
Go to Support section - Click "Support" in the navigation
Fill out the form - Provide subject and detailed description
Every support ticket goes through different statuses as our team works to resolve your issue. Here's what each status means:
OPEN
What it means: Your ticket has been received and is waiting for our support team to review it.
What happens next: A support agent will review your issue and respond with initial guidance or questions.
Can you reply? Yes, you can add more information anytime.
PENDING
What it means: Our support team has responded and is waiting for your reply or action.
What happens next: Please check your email and dashboard for our response. We may need more information or be waiting for you to try a suggested solution.
Can you reply? Yes, please respond to keep the conversation going.
RESOLVED
What it means: Our team believes your issue has been solved, but we want to make sure!
What happens next: Please test the solution and let us know if it worked. If the issue persists, just reply and we'll reopen the ticket.
Can you reply? Yes, you can confirm the fix worked or report if issues continue.
CLOSED
What it means: Your issue has been completely resolved and the ticket is archived.
What happens next: Nothing! Your issue is solved. If you have a new problem, please create a new ticket.
Can you reply? No, closed tickets cannot be reopened. Please create a new ticket for new issues.
Priority Levels
When creating a ticket, choose the priority level that best matches your situation:
LOWGeneral Questions
24-48 hours
Use for: How-to questions, feature requests, general inquiries
MEDIUMStandard Issues
12-24 hours
Use for: Account issues, survey problems, payment questions
HIGHUrgent Problems
4-8 hours
Use for: Cannot access account, missing payments, data issues
URGENTCritical Issues
1-2 hours
Use for: Security concerns, service outages, data loss
Typical Workflow
Example: "I can't access my account"
Day 1 - You create ticket
OPEN "I can't log in to my account"
Day 1 - We respond (4 hours later)
PENDING "Can you try resetting your password? Click here..."
Day 2 - You reply
PENDING "I tried but didn't receive the reset email"
Day 2 - We investigate and fix
RESOLVED "Found the issue - email was blocked. Fixed it and reset your password to: [new password]"
Day 2 - You confirm
RESOLVED "Perfect! I can log in now. Thank you!"
Day 3 - We close ticket
CLOSED Issue resolved successfully.
Response Times
We strive to respond to all tickets promptly. Our target response times are:
Business Hours
Monday-Friday: 9:00 AM - 6:00 PM IST Saturday: 10:00 AM - 4:00 PM IST Sunday: Closed (emergency only)
Response Goals
Urgent: Within 2 hours High: Within 8 hours Medium: Within 24 hours Low: Within 48 hours
Pro Tip
Response times are for first response. Complex issues may require multiple exchanges, but we'll keep you updated on progress throughout the resolution process.
Best Practices
DO
Be specific - Include error messages, screenshots
One issue per ticket - Don't combine multiple problems
Choose correct priority - Be honest about urgency
Respond promptly - Reply to our questions quickly
Provide context - When did it start? What changed?
Be patient - Allow time for investigation
DON'T
Create duplicate tickets - One ticket per issue
Mark everything urgent - Saves urgent for real emergencies
Leave out details - More info = faster resolution
Use inappropriate channels - Keep support in tickets
Get impatient - Quality takes time
Close tickets too early - Make sure it's really fixed
Good Ticket Examples
GOOD Example
Subject: Cannot complete survey ID #12345 - browser crashes
Priority: Medium
Description: "Hi, I'm trying to complete survey #12345 'Shopping Preferences' but on question 8 (the one about brands), my browser (Chrome v91 on Windows 10) crashes and closes. This has happened 3 times now. I've tried clearing my cache and using incognito mode, but same issue. I need to complete this survey by Friday to get the reward. Screenshots attached."
Why this is good: Specific survey ID, exact problem description, browser details, steps already tried, deadline mentioned, screenshots included.
POOR Example
Subject: Survey not working
Priority: Urgent
Description: "Your surveys don't work. Fix it."
Why this is poor: No specific details, wrong priority level, no context, rude tone, impossible to diagnose.
Frequently Asked Questions
Q: Can I reply to a resolved ticket?
A: Yes! If the solution didn't work or you have follow-up questions, just reply to the resolved ticket. We'll reopen it and continue helping.
Q: What happens if I don't respond to a pending ticket?
A: We'll wait 7 days for your response. After that, we'll send a reminder. If there's no response after 14 days, we'll mark it as resolved.
Q: Can I change the priority of my ticket?
A: You can mention in a reply if urgency has changed, but our support team manages priority levels based on actual impact and urgency.
Q: How do I know when you reply to my ticket?
A: You'll receive an email notification and can also check your dashboard support section for updates.
Q: Can I call for support instead?
A: We primarily use tickets to ensure nothing gets lost and maintain quality records. For complex issues, our team may schedule a call as part of the resolution process.
Check your spam/junk folder for the verification email
Make sure you clicked the complete link from the email
Contact our support team at support@relevantreflex.com
Our team responds within 24 hours
FILE: RelevantReflexCom/assets/css/bootstrap.min.css
-------------------- END OF FILE --------------------
### FILE 46: RR com/articles/5-ways-maximize-survey-earnings.php
- Type: PHP
- Size: 12.35 KB
- Path: RR com/articles
- Name: 5-ways-maximize-survey-earnings.php
------------------------------------------------------------
5 Ways to Maximize Survey Earnings in India | Relevant Reflex
December 10, 2024 |
Tips & Tricks |
Last updated: April 2026
5 Ways to Maximize Your Survey Earnings in India
Most survey takers in India earn far less than they could — not because of low survey availability, but because of avoidable mistakes. These five strategies can meaningfully increase how much you earn each month.
1. Complete Your Profile 100%
Your profile is the single most important factor in how many surveys you receive. Survey platforms match members to surveys based on demographics — age, occupation, income range, household details, and interests. A half-complete profile means you get matched to only a fraction of available surveys.
On Relevant Reflex, members who complete all profiler sections receive significantly more survey invitations than those with basic profiles. Set aside 20–30 minutes to fill everything in thoroughly and honestly — it pays off consistently every month.
2. Check for Surveys Every Single Day
Many surveys have a fixed quota — once enough respondents have completed them, they close. If you check your dashboard only a few times a week, you will miss surveys that filled up in the meantime. Members who log in daily and check their email for invitations consistently earn more than those who participate sporadically.
The best habit is to check your survey dashboard first thing in the morning, as many new surveys are added overnight by research teams in different time zones.
3. Participate in Profiler Surveys Whenever Available
Profiler surveys are short surveys that gather additional information about your lifestyle, preferences, and purchase habits. They are often overlooked because they pay less individually — but completing them unlocks a significantly larger pool of paid surveys targeted to your updated profile.
Think of profiler surveys as an investment. Spending 5 minutes on a profiler survey today can unlock ₹300–₹500 worth of targeted surveys over the next few weeks.
4. Answer Honestly and Consistently
Survey platforms use quality checks — including consistency questions and speeding detection — to identify unreliable responses. Members who rush through surveys or give random answers get flagged and receive fewer invitations over time. Honest, thoughtful responses protect your account quality and ensure continued access to surveys.
This is not just about ethics — it is about protecting your earning potential. A flagged account sees a dramatic drop in survey invitations that is very difficult to recover from.
5. Choose the Right Languages
Only select languages you are genuinely fluent in when setting up your profile. Attempting surveys in languages you do not understand leads to longer completion times, which triggers quality flags in the system. Surveys that take unusually long to complete are automatically reviewed and may not be credited.
If you are fluent in both English and Tamil, select both — this expands your eligible survey pool. But do not select Hindi or other regional languages simply to receive more surveys if you cannot complete them accurately.
Start Earning with Relevant Reflex
Relevant Reflex is an India-based survey platform with 50,000+ members and ₹25 lakh+ paid out since 2021. UPI payments, ₹500 minimum payout. Join free today.
-------------------- END OF FILE --------------------
### FILE 47: RR com/articles/best-paid-survey-sites-india.php
- Type: PHP
- Size: 34.23 KB
- Path: RR com/articles
- Name: best-paid-survey-sites-india.php
------------------------------------------------------------
Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)
April 9, 2026 Platform Comparison 13 min read
Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)
A factual, balanced comparison — including platforms we compete with — to help you choose the right survey sites for your situation.
Disclosure: This article is written by Relevant Reflex, one of the platforms reviewed below. We have made every effort to provide factual, balanced information about competitors. Per Google's Product Review Guidelines, we do not make unsupported negative claims about other platforms. All comparison data is based on publicly available information as of April 2026.
If you are looking for paid survey sites in India, you have two broad categories to choose from: India-based platforms built specifically for Indian users with UPI payment, and international platforms that accept Indian members but pay via PayPal or gift cards. Both have their place — the right choice depends on your priorities.
This article compares the main options honestly so you can make an informed decision. The recommendation at the end is based on what actually matters to Indian users — UPI payment support, India-specific survey volume, minimum payout threshold, and reliability.
Best for: Indian users who want UPI payment and India-specific surveys
Founded in 2021 in Tamil Nadu, Relevant Reflex is built specifically for Indian members. All surveys are India-specific — commissioned by Indian brands and international companies researching the Indian market. Payment is via UPI only, with a ₹250 minimum threshold and 3–7 business day processing time. With 50,000+ verified members and ₹25 lakh+ paid out, it has a verifiable track record.
What it does well: UPI payment, India-specific survey content, low minimum threshold, honest earning expectations, free to join.
Limitation: Survey volume varies by day and demographic. No mobile app yet — mobile web only. Not suitable as a sole income source.
Verdict: Best choice for Indian users who want UPI cash payments with no international conversion hassle.
Independently verified: Relevant Reflex is researched and listed on
Paid Survey Hub India —
a third-party directory that independently tests and lists only survey platforms proven to accept and pay Indian members.
2. OpinionWorld India India-Focused
Best for: Users who want another India-focused option alongside Relevant Reflex
OpinionWorld operates in India as part of the global SSI/Dynata network, one of the world's largest market research data collectors. This gives it access to a large volume of surveys from multinational brands researching the Indian market. Payment options include bank transfer and some gift card options, though UPI support is limited compared to India-native platforms.
What it does well: Good survey volume from international brands, established global company backing, India-specific survey content.
Limitation: Less seamless UPI integration compared to India-native platforms. Payment can take longer. Interface is less user-friendly for mobile users.
Verdict: Good complement to Relevant Reflex for increasing overall survey volume, especially for users researched by multinational brands.
International Platforms Available in India
3. Swagbucks International
Best for: Users comfortable with gift card payments who want multiple earning methods
Swagbucks is one of the most well-known GPT (Get-Paid-To) platforms globally. Indian members can earn SB points through surveys, watching videos, shopping online, and completing offers. Points are redeemable for gift cards from brands like Amazon India, Flipkart, and others. PayPal cash is available but less convenient for Indian users.
What it does well: Multiple earning methods beyond just surveys — videos, games, shopping cashback. Established global platform with strong reputation. Amazon India and Flipkart gift card redemption options are genuinely useful.
Limitation: No direct UPI payment. Survey volume for Indian demographics is lower than India-focused platforms. Some surveys are routed through third-party providers with inconsistent quality. Minimum redemption for PayPal is $25 which takes time to accumulate.
Verdict: Worth joining for the gift card options and diversified earning methods, but not a substitute for India-native UPI platforms.
4. Toluna International
Best for: Users who want to influence product decisions for global brands
Toluna is a large global survey panel with an India presence. It offers surveys from major international brands including FMCG, technology, and automotive companies. The point system is more complex than direct cash platforms, and redemption options for Indian users typically involve gift cards rather than direct bank transfer.
What it does well: High-quality surveys from reputable global brands. Active community features with polls and discussions. Regular contests. Good survey variety.
Limitation: Complex points system can be confusing. No UPI payment. Minimum redemption requires a significant number of accumulated points. Customer service response times can be slow for Indian users.
Verdict: Good supplementary platform, especially for users interested in global brand research, but not ideal as a primary platform for Indian users wanting cash payments.
5. ySense International
Best for: Users who have a PayPal account and want a reliable international option
ySense (formerly ClixSense) is a well-established GPT platform with a strong reputation for actually paying members. It aggregates surveys from multiple survey networks, which means more variety but also more inconsistency in survey quality. PayPal is the primary payment method, which requires Indian users to have a verified PayPal account.
What it does well: Very reliable payment track record. Good survey volume from aggregated networks. Daily tasks available beyond surveys. Transparent point system.
Limitation: $10 PayPal minimum payout is higher than India-native platforms. Requires a PayPal account. Survey availability for Indian demographics can be inconsistent. Some surveys screen out Indian respondents at higher rates.
Verdict: Trustworthy platform with a good payment record, but the PayPal requirement and higher minimum payout make it less convenient for most Indian users than UPI-native alternatives.
How to Choose the Right Platform for You
Choose based on your primary priority:
Want UPI cash payment? → Relevant Reflex first, OpinionWorld second
Want Amazon/Flipkart gift cards? → Swagbucks or Toluna
Have a PayPal account and want global platforms? → ySense + Toluna
Want maximum survey volume? → Join all 3–5 platforms above
First-time survey user? → Start with Relevant Reflex to understand the process, then expand
Why You Should Join Multiple Platforms
The single most effective strategy for maximising your monthly earnings from paid surveys in India is joining 3–5 platforms rather than committing to just one. Here is why:
Every platform has different client relationships. A survey on Swagbucks from an FMCG brand will never appear on Relevant Reflex, and vice versa. By joining multiple platforms, you access a larger total pool of surveys — meaning more daily opportunities and fewer days with nothing available.
The time investment is front-loaded. You spend 20–30 minutes setting up and completing your profile on each new platform — but after that, the marginal daily time required to check an additional platform is minimal. Most members who join 3 platforms check all three in the same 30-minute session each morning.
Our recommendation for Indian users starting from scratch: begin with Relevant Reflex for UPI cash, add OpinionWorld for additional India-specific surveys, and add Swagbucks for the diversified earning methods and gift card redemption. Evaluate after 2 months and add more platforms based on which types suit your profile best.
Looking for an earlier overview?
Our original platform overview — Best Survey Platforms for Indian Users — covers the broader landscape of survey platforms available in India and is a useful companion read alongside this detailed 2026 comparison.
Frequently Asked Questions
Which paid survey site is best for Indian users who want UPI payment?
Relevant Reflex is currently the best option for UPI payment in India, as it is built natively for Indian users with direct UPI payouts to PhonePe, Google Pay, and Paytm at a ₹250 minimum threshold.
Can I join multiple paid survey sites in India?
Yes, and it is recommended. Joining 3–5 platforms significantly increases your monthly earnings. Each platform has different clients and survey pools, so they complement rather than overlap each other.
Are international survey sites worth joining for Indian users?
Yes, as supplementary platforms — especially Swagbucks for gift cards and ySense for PayPal payments. However, India-native platforms offer more India-specific surveys and UPI payment, making them more convenient as primary platforms for most Indian users.
Which survey site has the lowest minimum payout for Indian users?
Among India-focused platforms, Relevant Reflex has a ₹250 minimum payout threshold via UPI — one of the lowest among legitimate platforms available to Indian users.
Start with India's UPI-Native Survey Platform
Join Relevant Reflex free — ₹250 minimum payout directly to your PhonePe, GPay, or Paytm.
-------------------- END OF FILE --------------------
### FILE 48: RR com/articles/best-survey-platforms-indian-users.php
- Type: PHP
- Size: 14.21 KB
- Path: RR com/articles
- Name: best-survey-platforms-indian-users.php
------------------------------------------------------------
Best Survey Platforms for Indian Users in 2026 | Relevant Reflex
November 20, 2024 |
India Specific |
Last updated: April 2026
Best Survey Platforms for Indian Users in 2026
Not all survey platforms work equally well for Indian users. Payment methods, survey availability for Indian demographics, minimum thresholds, and language support all vary significantly. This guide helps you choose the right platforms for your situation.
What Makes a Survey Platform Good for Indian Users?
Before listing any platforms, it helps to understand what criteria matter most for someone based in India. The most important factors are: UPI or Indian payment method support, a low minimum payout threshold that is achievable within weeks rather than months, surveys actually targeted at Indian demographics rather than repurposed global surveys, and a responsive support team that understands Indian users.
Relevant Reflex
Relevant Reflex is built specifically for India, operating out of Tamil Nadu since 2021. Unlike most platforms on this list which are global platforms with an India section, Relevant Reflex sources surveys specifically for Indian consumer profiles. Payment is via UPI direct transfer — PhonePe, Google Pay, and Paytm are all supported — with a ₹500 minimum threshold. With 50,000+ members and ₹25 lakh+ paid out, it is a verified and active platform for Indian survey takers.
Best for: Indian users who want UPI payments and India-focused surveys. Minimum payout: ₹250 via UPI Free to join: Yes
Third-party verified: Relevant Reflex is independently listed as the #1 ranked platform on
Paid Survey Hub India —
a free directory that researches and verifies survey sites specifically for Indian users.
Swagbucks India
Swagbucks is one of the most well-known global reward platforms and is available in India. In addition to surveys, members can earn by watching videos, searching the web, and shopping online. The platform pays in "SB" points redeemable for gift cards or PayPal cash. Survey availability for Indian users is moderate — there are surveys available but fewer than on India-specific platforms.
Best for: Members who want multiple earning methods beyond surveys. Minimum payout: Approx. ₹400 equivalent Payment: PayPal or gift cards (no direct UPI)
Toluna India
Toluna is a large global panel with a dedicated India presence. The platform has a community element — members can create polls and participate in discussions in addition to surveys. Survey frequency for Indian members is decent, and the platform has been operating in India for many years. Payment is via PayPal or Paytm once the minimum threshold is reached.
Best for: Members who enjoy community features alongside surveys. Minimum payout: ₹500 equivalent Payment: PayPal or Paytm
ySense (formerly ClixSense)
ySense is a well-established platform available in India offering surveys, tasks, and offers. It has a strong track record of payments and a large user base. The platform pays via PayPal, Skrill, or Payoneer — not directly via UPI, which is a limitation for some Indian users. Survey availability is reasonable for Indian demographics.
Best for: Members comfortable with PayPal or Skrill for receiving payments. Minimum payout: Approx. ₹800 equivalent Payment: PayPal, Skrill, Payoneer
Key Things to Watch Out For
When evaluating any survey platform, watch for these warning signs: requests for payment to join or access surveys, promises of unrealistically high earnings, no physical address or contact information, and payment methods that are not easily accessible in India. Legitimate platforms are always free to join and transparent about how much members typically earn.
How Many Platforms Should You Join?
Most experienced survey takers in India join 3–5 platforms simultaneously. This increases the total number of surveys available to you and reduces the impact of any one platform having a quiet month. However, spreading yourself too thin across 10+ platforms makes it difficult to keep profiles updated and surveys completed on time. Start with 2–3 platforms, get comfortable, then expand.
Start with Relevant Reflex
India-built, UPI payments, ₹500 minimum payout, 50,000+ members, free to join. Sign up in under 2 minutes.
December 5, 2024 |
Getting Started |
Last updated: April 2026
Complete Guide to Online Surveys for Beginners in India
If you have never taken a paid survey online before, this guide explains everything from choosing the right platform to receiving your first UPI payment — in plain, simple language.
What Are Paid Online Surveys?
Companies and brands need to understand what Indian consumers think about their products, services, and advertisements. Instead of running expensive focus groups, they commission online surveys through market research platforms. These platforms pay ordinary people — students, homemakers, working professionals, retirees — to share their honest opinions. You answer questions, and you earn rewards that can be redeemed as cash via UPI.
Step 1 — Choose the Right Survey Platform
Not all survey sites are equal. Look for platforms that are genuinely India-focused, offer UPI payments, have a low minimum payout threshold, and have verifiable member reviews. Avoid sites that ask for any registration fee or promise unrealistically high earnings. Relevant Reflex, for example, is free to join, pays via UPI, and has a ₹500 minimum threshold — achievable within your first few weeks.
Step 2 — Register with Accurate Information
When signing up, always provide your real details — age, gender, occupation, city, and income range. This is not just a policy requirement. Survey platforms match you to surveys based on your demographic profile. Fake details lead to fewer survey matches, more screen-outs, and lower earnings. There is no benefit to providing inaccurate information.
Step 3 — Verify Your Email and Mobile
After registering, check your inbox for a verification email and click the confirmation link. Some platforms also require mobile verification. Completing both steps unlocks your full survey access and, on Relevant Reflex, earns you bonus points for verifying each.
Step 4 — Complete Your Profile Thoroughly
Before looking for surveys, spend time completing your profile sections — including profiler surveys about your lifestyle, income, vehicle ownership, electronics, and interests. This is the most important step most beginners skip. A thorough profile means you qualify for more surveys from day one.
Step 5 — Start Taking Surveys
Log in to your dashboard and look for available surveys. Each survey shows an estimated completion time and reward amount. Start with shorter surveys to build familiarity with the format. Answer all questions honestly — quality checks are built into most surveys, and inconsistent answers will disqualify your response without payment.
Step 6 — Understand Survey Types
There are several types of surveys you may encounter. Standard opinion surveys cover products, brands, and current topics and take 5–20 minutes. Profiler surveys gather demographic details and take 2–5 minutes. Product testing surveys are longer, sometimes requiring you to use a product at home before reviewing it. Focus groups are invitation-only group discussions that offer the highest rewards.
Step 7 — Redeem Your Rewards via UPI
Once you reach the minimum payout threshold (₹500 on Relevant Reflex), you can request a withdrawal to your UPI ID — PhonePe, Google Pay, or Paytm all work. Payments are processed within 3–7 business days. Always ensure your UPI ID is entered correctly in your profile settings before requesting a withdrawal.
What to Expect in Your First Month
In your first month, expect to earn between ₹300 and ₹1,000 depending on how actively you participate and how thoroughly you completed your profile. This is normal — survey availability increases as your profile data becomes richer. Most members see their earnings grow steadily from the second month onwards as they qualify for more targeted surveys.
Ready to Start?
Relevant Reflex is free to join, pays via UPI, and has 50,000+ active members across India. Registration takes under 2 minutes. Sign up now and start earning.
-------------------- END OF FILE --------------------
### FILE 50: RR com/articles/earn-money-online-surveys-india-guide.php
- Type: PHP
- Size: 27.28 KB
- Path: RR com/articles
- Name: earn-money-online-surveys-india-guide.php
------------------------------------------------------------
How to Earn Money with Online Surveys in India 2026 | Relevant Reflex
April 13, 2026 |
Complete Guide |
12 min read
How to Earn Money with Online Surveys in India: The Complete Guide (2026)
Online surveys in India have become one of the most accessible ways to earn supplementary income from home — no investment, no special skills, and no fixed schedule required. This guide covers everything you need to know in 2026: what online surveys actually are, how much you can realistically earn, how to get started, and the strategies that separate consistent earners from those who give up after a week.
At Relevant Reflex, we have been operating India's survey platform since 2021. We have paid over ₹25 lakh to 50,000+ verified Indian members via UPI. Everything in this guide is based on real data from our platform — not theoretical estimates.
Online surveys are questionnaires commissioned by brands, companies, and market research firms to understand what Indian consumers think about their products, services, and advertising. Instead of running expensive in-person focus groups, companies pay survey platforms to collect this feedback digitally from a large pool of respondents.
When you join a survey platform in India, you become part of that respondent pool. When a company wants opinions from people matching your profile — say, a 28-year-old working professional in Tamil Nadu who owns a car — the platform sends you that survey. You complete it honestly, and you earn a reward.
This is a genuine, well-established industry. Market research is a multi-billion dollar global business, and brands genuinely need consumer feedback to make product, pricing, and marketing decisions. The money paid to survey respondents is a tiny fraction of what companies would otherwise spend on traditional research methods.
Who Commissions These Surveys?
The surveys available on Indian platforms typically come from three sources. Large consumer brands like FMCG companies, automobile manufacturers, and electronics brands regularly commission surveys to understand purchase intent and brand perception. Market research agencies collect data on behalf of multiple clients simultaneously. And media companies including streaming platforms, news organisations, and app developers run surveys to understand audience preferences.
How Much Can You Realistically Earn from Online Surveys in India?
This is the question most people ask first — and the one where many survey platforms are dishonest. Here is the truth based on actual member data from Relevant Reflex:
Member Type
Daily Time
Monthly Earnings
Profile Status
Beginner (Month 1–2)
30–45 mins
₹500 – ₹1,500
Partially complete
Active member
1–2 hours
₹2,000 – ₹4,000
Fully complete
Experienced member
2+ hours
₹4,000 – ₹6,000
100% + profilers done
*Indicative ranges based on member data. Individual earnings are not guaranteed and vary. See our Earnings Disclaimer.
What determines where you fall in this range? Three factors matter most. First, profile completeness — members who complete all profiler sections receive significantly more survey invitations than those with basic profiles. Second, consistency — members who log in daily and check their email for invitations earn considerably more than those who participate sporadically. Third, demographic profile — certain demographics such as professionals in technology or healthcare, car owners, and parents of young children receive more high-value survey invitations because brands specifically target these groups.
What Surveys Pay in India
Standard opinion surveys of 5–15 minutes typically pay ₹20–₹80 on Indian platforms. Longer surveys of 20–30 minutes pay ₹100–₹250. Product testing surveys, which require you to use a product at home for a week before reviewing it, can pay ₹500–₹2,000. Focus group discussions, which are invitation-only group sessions of 60–90 minutes, pay the highest rewards — often ₹1,000–₹3,000 per session.
Step-by-Step: How to Start Earning with Online Surveys in India
Step 1 — Choose a Legitimate Platform
The most important decision you will make is which platform to join. Look for platforms that are free to join with no registration fee, offer UPI payments (not just PayPal or international transfers), have a minimum payout threshold below ₹1,000, and have verifiable payment records — either from public reviews or direct member testimonials.
Relevant Reflex is free to join, pays via UPI with a ₹500 minimum threshold, and has paid ₹25 lakh+ to Indian members since 2021. You can also join 2–3 other platforms simultaneously to increase survey volume.
Step 2 — Register with Accurate Information
When signing up, provide your real age, gender, occupation, income range, and location. This is not just a policy requirement — it directly determines which surveys you receive. Fake details lead to fewer survey matches, more screen-outs, and lower earnings. There is no benefit to providing inaccurate information.
Step 3 — Complete Email and Mobile Verification
After registering, verify your email address immediately by clicking the link in your inbox. Some platforms also require mobile number verification. Completing both unlocks your full survey access. On Relevant Reflex, verified members receive bonus points for completing both verification steps.
Step 4 — Complete Your Profile Thoroughly
Before looking for surveys, spend 20–30 minutes completing every section of your profile. This includes the main profile (occupation, education, household) and any available profiler surveys covering areas like vehicle ownership, electronics, gaming habits, financial products, and lifestyle. This single step has the largest impact on how many surveys you receive.
Log in every day — even if only for 5 minutes to check for new surveys. Many surveys close once their quota is filled. Members who check daily catch surveys before they close; those who check every few days regularly miss them. Set a phone reminder if needed.
Step 6 — Complete Surveys Honestly
Answer every question thoughtfully and accurately. Survey platforms use built-in quality checks — including consistency questions and timing analysis — to detect rushed or random responses. Flagged responses are not credited, and repeated flags can reduce your survey eligibility. Honest participation protects both your earnings and your account quality.
Step 7 — Withdraw Your Earnings
Once you reach the minimum payout threshold, go to the redemption section and enter your UPI ID. Ensure your UPI ID is correct before submitting — incorrect UPI IDs cause payment failures. Withdrawals are typically processed within 3–7 business days on Relevant Reflex.
Pro Tips for Higher Earnings from Online Surveys in India
Prioritise Profiler Surveys Every Time
Whenever a new profiler survey appears in your dashboard, complete it the same day. Profiler surveys are short (2–5 minutes) and often unpaid or low-paid individually — but completing them unlocks a significantly larger pool of targeted, higher-paying surveys. Think of them as an investment that pays off over weeks and months.
Choose Your Languages Carefully
Only select languages you can read and write fluently. Taking surveys in unfamiliar languages results in slow completion times, which is flagged as suspicious by the quality system. If you are fluent in both English and Tamil, selecting both expands your eligible survey pool. But do not select additional languages simply to receive more invitations.
Join 3–5 Platforms Simultaneously
No single platform has surveys available every day for every demographic. Joining 3–5 legitimate platforms ensures you always have something available. Update your profile on each platform, check all of them daily, and prioritise the highest-paying surveys available across all platforms at any given time.
Use Idle Time Productively
Most surveys take 5–20 minutes — a natural fit for commutes, lunch breaks, or time between tasks. Rather than blocking out dedicated survey time, treat surveys as productive use of moments that would otherwise be idle. Many of our most consistent earners complete surveys during their morning commute or while waiting for appointments.
Never Rush
Completing a survey in half the expected time is a quality red flag. If a 15-minute survey is completed in 4 minutes, the response is flagged and not credited. Take each survey at a natural pace, read questions carefully, and give thoughtful answers. A single quality response that earns ₹80 is worth more than three rushed responses that earn nothing.
How Survey Payments Work in India
The shift to UPI payments has made online surveys significantly more accessible for Indian members. Unlike older platforms that paid only via PayPal or gift cards — both of which have limitations for Indian users — UPI-native platforms like Relevant Reflex transfer earnings directly to your PhonePe, Google Pay, or Paytm account.
The process is straightforward. You earn points or direct rupee credits for each completed survey. Once your account balance reaches the minimum threshold (₹500 on Relevant Reflex), you can submit a withdrawal request. Enter your UPI ID in the redemption section, confirm it is correct, and submit. Payments are typically processed within 3–7 business days.
One important note on taxes: survey earnings in India are technically taxable income. Most members earning supplementary income from surveys do not need to file separately unless their total annual income from all sources exceeds the taxable threshold. If you earn consistently above ₹4,000–₹5,000 per month from surveys, consult a tax advisor about whether this needs to be reported.
Frequently Asked Questions — Online Surveys India
How much can you realistically earn from online surveys in India?
Most active members earn between ₹500 and ₹4,000 per month depending on profile completeness, participation consistency, and demographic profile. Beginners typically earn ₹500–₹1,500 in their first month. Experienced, active members earn ₹2,000–₹4,000 per month.
Are online surveys in India legitimate and safe?
Yes — legitimate paid survey platforms are genuine businesses. Relevant Reflex has paid over ₹25 lakh to 50,000+ verified Indian members since 2021. The key is choosing platforms that are free to join, offer UPI payments, and have verifiable payment records. Avoid any platform that charges a registration fee.
How do I get paid from online surveys in India?
Most India-focused platforms pay via UPI — directly to your PhonePe, Google Pay, or Paytm account. The minimum payout threshold on Relevant Reflex is ₹500. Once you reach this threshold, you can request a withdrawal which is typically processed within 3–7 business days.
Why do I keep getting screened out of surveys?
Getting screened out means that particular survey was targeting a specific demographic that does not match your profile. This is completely normal and happens to all members. The fix is to complete your profiler surveys thoroughly — the more detail you provide about your lifestyle, income, and interests, the better your profile matches available surveys.
How long does it take to receive the first survey payment in India?
Most new members reach the ₹500 minimum payout threshold within 2–4 weeks of joining, assuming they log in daily and complete available surveys. After requesting a withdrawal, payment is typically processed within 3–7 business days via UPI.
Ready to Start Earning with Online Surveys?
Join 50,000+ Indians already earning with Relevant Reflex. Free to join, UPI payments, ₹500 minimum payout.
-------------------- END OF FILE --------------------
### FILE 51: RR com/articles/how-to-identify-genuine-survey-websites.php
- Type: PHP
- Size: 11.3 KB
- Path: RR com/articles
- Name: how-to-identify-genuine-survey-websites.php
------------------------------------------------------------
How to Identify Genuine Survey Websites India | Relevant Reflex
December 15, 2024 |
Avoiding Scams |
Last updated: April 2026
How to Identify Genuine Survey Websites in India
In India's growing online survey landscape, legitimate earning opportunities exist alongside fraudulent sites. Knowing how to tell them apart protects your time and personal data.
1. Look for Transparent Contact Information
Every legitimate survey platform displays a physical address, working email address, and a privacy policy. If a survey site has no "About Us" or "Contact" page, treat it as a red flag. Genuine platforms like Relevant Reflex display their full address (Ethirmedu, Tamil Nadu) and respond to support queries within 24 hours.
2. They Never Charge to Join
Reputable paid survey sites in India are always free to join. Any site asking for a registration fee, "activation charge", or upfront payment is a scam. No legitimate market research company requires payment from respondents.
3. Check Payment Methods Suited to India
A genuine India-focused survey platform will offer UPI transfers, Paytm, or PhonePe — not just PayPal or international wire transfers. If a site only offers international payment methods with high minimum thresholds, it may not actually serve Indian members well.
4. Read Reviews on Independent Sites
Search for the platform's name on SurveyPolice, Google Reviews, or Trustpilot. Genuine platforms accumulate real reviews over time. Be wary of platforms with zero reviews or only 5-star reviews posted on the same day.
5. Realistic Earnings Claims
Legitimate survey sites set realistic expectations. If a platform promises ₹50,000 per month from surveys alone, that is not realistic. Genuine platforms are honest — most members earn ₹500–₹4,000 per month depending on their profile and participation level.
6. They Have a Clear Privacy Policy
Genuine platforms explain exactly what data they collect, how it is used, and whether it is shared with third parties. A missing or vague privacy policy is a serious warning sign, especially given India's data protection laws.
About Relevant Reflex
Relevant Reflex is an India-based paid survey platform operating since 2021. We have 50,000+ verified members across India and have paid out ₹25 lakh+ via UPI. Join free today.
-------------------- END OF FILE --------------------
### FILE 52: RR com/articles/online-surveys-india-housewives.php
- Type: PHP
- Size: 33.16 KB
- Path: RR com/articles
- Name: online-surveys-india-housewives.php
------------------------------------------------------------
Online Surveys India for Housewives: Work From Home and Earn in 2026
April 10, 2026 Homemakers Guide 10 min read
Online Surveys India for Housewives: Work From Home and Earn in 2026
A practical guide for Indian homemakers — earn ₹1,000–₹3,500 per month from your phone, in your own time, with no investment required.
For Indian homemakers who manage household expenses, grocery purchases, childcare decisions, and daily family needs, paid online surveys offer something genuinely valuable: a way to earn money independently, on your own schedule, from your phone — with no investment, no employer, and no fixed hours.
This is not a get-rich-quick scheme. It is a legitimate market research activity where companies pay for the opinions of Indian homemakers because those opinions directly influence product and pricing decisions. Your experience managing a household makes your feedback genuinely valuable to brands — and they pay for it.
Indian homemakers control the majority of household purchase decisions — groceries, cleaning products, cooking oil, personal care, children's products, household appliances, and more. Market research companies know this, and they actively seek homemaker opinions for their clients.
This means homemakers with complete profiles often receive more survey invitations than many other demographic groups. The surveys sent to homemakers are typically about products you already buy and use — making them faster to complete and easier to answer honestly than surveys about unfamiliar topics.
These are surveys about products and brands you likely already have opinions about — which is exactly why your participation is valuable and why your answers are taken seriously by the brands commissioning the research.
Realistic Earnings for Homemakers
Homemakers who match common research demographics — married women aged 25–45 with children, managing household purchasing decisions — typically fall into the more active earning bracket. Here is a realistic picture:
Daily Time
Monthly Earnings
Suitable When
20–30 mins
₹700 – ₹1,500
Busy periods, young children at home
45–60 mins
₹1,500 – ₹2,800
Most homemakers — sustainable daily commitment
60–90 mins
₹2,500 – ₹3,500+
When children are at school, more free time available
"I started after my second child was born and I had stepped away from my teaching job. In month 1 I earned ₹820. Now in month 7 I'm earning ₹2,600–₹3,000 every month. It goes directly into my personal savings — money I earned myself."
— Kavitha R., Homemaker, Madurai
"I do surveys during the hour after the children leave for school and before I start cooking. Usually 3–4 surveys a day. Last month I withdrew ₹2,100 via GPay. My husband was surprised it was real."
— Meena S., Homemaker, Bengaluru
Fitting Surveys Into Your Daily Routine
The design of survey participation fits naturally into a homemaker's schedule because it requires no fixed time slot, no advance preparation, and can be paused and resumed. Most surveys take 10–20 minutes and require only your phone.
Sample Daily Survey Schedule for a Homemaker
8:30 – 9:00 AMAfter children leave for school — check for new surveys, complete 1–2 short surveys (10–15 mins each). Best time for focused survey completion.
11:00 – 11:30 AMMid-morning quiet period — complete 1 longer survey (15–20 mins). Check email for new survey invitations.
2:00 – 2:30 PMAfter lunch, before children return — complete remaining available surveys. Good time for longer detailed surveys.
Evening (optional)Check for newly opened surveys — some new surveys open in the afternoon. Quick 5-minute check only.
This schedule gives you approximately 60–75 minutes of survey time per day without affecting your household responsibilities. On days when you are particularly busy, simply skip — there is no penalty and no minimum participation requirement.
How to Get Started — Step by Step
Step 1 — Register with your real personal information
Sign up at Relevant Reflex using your real age, marital status, number of children, household income range, and location. This demographic data is exactly what determines which surveys you receive. Inaccurate information leads to fewer and lower-value survey matches — there is no benefit to providing false details.
Step 2 — Verify your email immediately
After registering, check your email inbox and click the verification link right away. Unverified accounts do not receive survey invitations. If you do not see the email, check your spam folder and look for an email from Relevant Reflex.
Step 3 — Complete your profile in full on day 1
Spend your first session — approximately 30–40 minutes — completing every section of your profile. For homemakers, the most important sections are household size and composition, number and ages of children, monthly household spending on groceries and personal care, appliances owned, shopping habits (online vs in-store), and vehicle ownership. These specific data points unlock the FMCG, children's products, and household research surveys that are most relevant to homemakers.
Step 4 — Complete profiler surveys as they appear
Profiler surveys are short (3–6 minutes) and appear periodically in your dashboard. They expand your profile data and unlock new survey categories. Completing every profiler survey within 24 hours of it appearing is the single most effective way to increase the number and quality of survey invitations you receive.
Step 5 — Log in daily and check email
Set up email notifications if possible, so you receive alerts when new surveys arrive. Many surveys close within hours once their quota fills. Members who check daily catch these opportunities; those who check every few days regularly miss them. Even a 5-minute daily check is enough to stay ahead of closing surveys.
Step 6 — Withdraw via UPI when you reach ₹250
Once your account balance reaches ₹250 (500 points), go to the redemption section, enter your UPI ID, and submit a withdrawal request. The money arrives in your PhonePe, Google Pay, or Paytm account within 3–7 business days — independently, in your name.
Profile Tips Specific to Homemakers
Be specific about your household spending
Brands commission surveys targeting homemakers who spend specific amounts on groceries, personal care, or household products. Provide your honest monthly spending figures in each category — do not understate or approximate. More specific data leads to better survey matches and more relevant invitations.
Include your children's ages precisely
Companies making products for specific age groups — baby products for 0–2 years, school supplies for 6–12 years, teenage consumer products — look specifically for mothers in those age ranges. Providing your children's exact ages (not just "school age") unlocks a significant category of product research surveys.
Mention all brands you use regularly
When profile surveys ask about brand usage — which cooking oil, which detergent, which personal care brands — answer honestly and specifically. Brand research surveys are some of the highest-paying, and they specifically target users of particular brands. If you use Aashirvaad atta, Fortune oil, or Surf Excel, say so — it matters.
Update your profile when your household situation changes
If you have a new child, move to a different city, or your household income changes significantly, update your profile. Outdated profile data leads to poor survey matching and missed opportunities. Check your profile completeness every 3 months.
Financial Independence Through UPI Payments
For many Indian homemakers, having a personal income — however small — that arrives directly in their own UPI account represents a meaningful form of financial independence. Survey earnings go directly to your account, in your name, accessible to you immediately upon processing.
Many members use their survey earnings for personal expenses they would otherwise need to ask their spouses about — mobile recharges, personal care products, books, subscriptions, or small gifts for themselves or their children. Others save steadily — ₹2,000/month adds up to ₹24,000 per year, which is meaningful supplemental savings.
The UPI-native payment system on Relevant Reflex means you do not need a credit card, PayPal account, or any special financial setup. If you already use PhonePe, Google Pay, or Paytm — which most Indian smartphone users do — you are already set up to receive payments.
Safety note: Legitimate survey platforms will never ask for your bank account number, debit card details, OTP, or UPI PIN. Relevant Reflex only needs your UPI ID (the handle like yourname@ybl) to send you money — never your PIN. If any platform asks for your PIN or OTP, it is a scam.
Frequently Asked Questions
Can housewives in India earn money from online surveys?
Yes. Indian homemakers are one of the most valued demographics for market research. Homemakers can realistically earn ₹1,000–₹3,500 per month through consistent survey participation with no investment and a flexible schedule.
How much can an Indian housewife earn from online surveys per month?
Most active homemaker members earn ₹1,000–₹3,500 per month. Homemakers with children, car ownership, or household incomes above ₹5 lakh typically receive more high-value survey invitations and earn toward the higher end of this range.
What is the best time for housewives to do online surveys in India?
Most homemakers find mid-morning (after children leave for school, between 8:30–11 AM) the most productive time. This quiet period allows focused survey completion without interruption.
Do I need a laptop or can I use my phone?
Your Android or iPhone is sufficient. Relevant Reflex is fully mobile-optimised. All surveys can be completed on a phone without a laptop or desktop computer.
Is it safe to join a paid survey site as a homemaker in India?
Yes, as long as you join legitimate platforms that are free to join and never ask for your bank PIN, OTP, or upfront payment. Relevant Reflex is free, asks only for your UPI ID to send you money, and never requires any financial information that could compromise your accounts.
Can I do surveys even if I have very limited free time?
Yes. Even 20 minutes per day is enough to earn ₹700–₹1,000 per month. There is no minimum daily requirement — on very busy days, simply check for new surveys in 5 minutes and skip the rest. No penalty, no pressure.
Start Earning Your First ₹500 This Month
Join free, complete your profile in 30 minutes, and start receiving survey invitations matched to your household profile.
-------------------- END OF FILE --------------------
### FILE 53: RR com/articles/online-surveys-india-students.php
- Type: PHP
- Size: 32.34 KB
- Path: RR com/articles
- Name: online-surveys-india-students.php
------------------------------------------------------------
Online Surveys India for Students: Earn Pocket Money in College (2026)
April 9, 2026 Students Guide 10 min read
Online Surveys India for Students: Earn Pocket Money in College (2026)
No investment, no fixed schedule, UPI payout — a practical guide for Indian college students looking for genuine supplemental income.
India has over 40 million college students — and for many, managing monthly expenses on a limited budget is a real challenge. Paid online surveys offer a genuine, zero-investment way to earn ₹500–₹2,000 per month without disrupting your studies. You do not need any skills, prior experience, or a laptop — your Android phone is enough.
This guide is written specifically for Indian college students. We cover why students are a valued survey demographic, how to fit survey participation around your schedule, what you can realistically earn, and how to avoid the common mistakes that cause new members to give up too early.
Students aged 18–24 are one of the most researched demographic groups in India's market research industry. Here is why — and why this works in your favour:
Indian college students represent the country's next generation of consumers. Brands want to understand what influences your purchasing decisions before you form strong brand loyalties. Companies in smartphones, fashion, food delivery, streaming services, edtech, gaming, and FMCG products regularly commission surveys specifically targeting 18–24 year olds in India.
This means students with accurate, complete profiles often receive more survey invitations than older demographics in the same region. Brands are willing to pay for access to student opinions because this demographic is notoriously difficult to reach through traditional research methods.
Survey categories students commonly qualify for:
Smartphone usage and brand preferences
Food delivery apps (Swiggy, Zomato) and ordering habits
Social media usage patterns — Instagram, YouTube, Moj
Career and education services — coaching, online courses
Fashion and personal care products
Gaming apps and habits
What Students Actually Earn — Honest Numbers
Here is a realistic earnings picture for Indian college students based on actual member data:
Daily Time
Monthly Earnings
Best For
15–20 mins (casual)
₹300 – ₹700
Exam periods, busy semesters
30–45 mins (regular)
₹700 – ₹1,500
Most students — sustainable pace
60–90 mins (active)
₹1,500 – ₹2,500
Semester breaks, multiple platforms
To put these numbers in context: ₹1,500/month covers most students' monthly mobile recharge and data costs. ₹2,500/month covers transport, canteen expenses, or a monthly OTT subscription with money left over. It is genuine supplemental income — not a salary, but meaningfully useful for students managing tight budgets.
"I started during my second year of engineering. The first month I earned ₹650, which I used to buy data. By month 4, I was making ₹1,800 per month consistently — enough to stop asking my parents for pocket money every week."
— Arun K., Engineering Student, Chennai
How to Fit Surveys Around Your College Schedule
The best thing about survey participation for students is the complete flexibility. There is no fixed schedule, no minimum hours, and no penalty for taking a day off. Here is how to structure it around a typical college week:
Time Slot
Survey Activity
Why It Works
Morning commute (bus/metro)
Check for new surveys, complete 1–2 short polls
Dead time converted to earnings — 15–20 mins
Between lectures (free periods)
Complete 1 standard survey (10–15 mins)
Uninterrupted time, no equipment needed
After college (before dinner)
Complete 1–2 surveys, check new invitations
Most productive time for longer surveys
Weekend mornings
Complete any pending profiler surveys, 2–3 standard surveys
More time available, better focus
During exam periods, simply reduce to 10–15 minutes per day — just enough to check for new surveys and complete one or two quick polls. Survey earnings do not require a fixed minimum time commitment. Even 15 minutes per day yields ₹300–₹500 per month.
Step-by-Step: How to Get Started
Step 1 — Sign up with accurate information
Register at Relevant Reflex using your real name, age, gender, and email address. Use a personal email you check daily — survey invitations arrive by email and surveys close quickly once quotas fill. Do not use a college email that you may lose access to after graduation.
Step 2 — Verify your email immediately
Check your inbox right after registering and click the verification link. This activates your full account. Without email verification, you will not receive survey invitations.
Step 3 — Complete your profile thoroughly on day 1
Spend 25–35 minutes completing every section of your profile — especially your education status, year of study, course, smartphone usage, apps you use regularly, and spending habits. This profile data determines which surveys you qualify for. Students with complete profiles consistently receive 3–4x more invitations than those with incomplete profiles.
Step 4 — Complete profiler surveys as they appear
Profiler surveys are short questionnaires (2–5 minutes) that build a more detailed picture of your interests and habits. Every profiler you complete unlocks new survey categories. Make it a habit to complete any new profiler survey within 24 hours of it appearing in your dashboard.
Step 5 — Check in daily and be consistent
Log in at least once per day — even if only for 5 minutes. Many surveys close once their quota fills, sometimes within hours. Members who check daily earn significantly more than those who check every few days because they catch surveys before they close.
Step 6 — Withdraw via UPI when you reach ₹250
Once your balance reaches ₹250 (500 points), go to the redemption section, enter your UPI ID (PhonePe, GPay, or Paytm), and submit your withdrawal request. Processing takes 3–7 business days. Your first withdrawal is the proof that the platform actually pays — and it is a good feeling.
Tips Specific to Student Members
Register with your permanent personal email, not your college email
Many students register using their college-provided email address. This is a mistake — college email access is usually revoked after graduation or when you change institutions. Use a Gmail or personal email address you will have access to permanently.
Be specific about your course and institution type in your profile
Brands often commission surveys specifically targeting engineering students, medical students, MBA students, or students at certain types of institutions (IITs, NITs, state universities, private colleges). The more specific your profile, the more precisely you can be matched to surveys designed for your demographic.
Surveys about apps and services you actually use are more valuable
When completing surveys about apps or services you use genuinely — Swiggy, Spotify, Instagram, WhatsApp — your answers are more authentic and complete. Survey platforms use quality checks to detect rushed or inconsistent answers. Genuine users of the products being researched also complete surveys faster, which improves your earnings per hour.
Do not do surveys during lectures
This sounds obvious but is worth stating. Survey quality checks detect when users are distracted — rushing through questions, giving inconsistent answers, or completing surveys in implausibly short times. These responses are flagged and not credited. Surveys done in 10 minutes that should take 15 minutes earn nothing.
Semester breaks are high-earning periods
During semester breaks when you have 3–4 hours of free time per day, consider increasing your survey time to 60–90 minutes across 2–3 platforms. Members who make full use of semester break time can accumulate 3–4 months of typical earnings in 4–6 weeks of focused participation.
How UPI Payout Works for Students
Most Indian college students already have UPI set up on their phones through PhonePe, Google Pay, or Paytm. This makes withdrawing survey earnings straightforward — there is no need to set up a bank account separately or deal with international payment processors.
To withdraw your earnings on Relevant Reflex:
Go to your dashboard and click on the redemption section
Enter your UPI ID exactly as registered on your UPI app — a small typo will cause the payment to fail
Submit the withdrawal request — minimum amount is ₹250
Payment arrives in your UPI account within 3–7 business days
You will receive a notification on your UPI app when the payment lands
Important: Double-check your UPI ID before submitting a withdrawal request. An incorrect UPI ID will result in a failed payment. If you are unsure of your exact UPI ID, open your PhonePe or GPay app and check the profile section for your UPI handle (usually in the format: yourname@ybl or yourphone@okaxis).
Frequently Asked Questions
Can college students in India earn money from online surveys?
Yes. Students aged 18–24 are a highly valued research demographic. Indian students can realistically earn ₹500–₹2,000 per month through consistent survey participation with no investment required.
Do I need a laptop or will my phone work?
Your Android or iPhone is sufficient. Relevant Reflex is fully mobile-optimised. Most surveys are designed to be completed on a phone and typically take 10–20 minutes.
Do I need to be 18 to join paid survey sites in India?
Yes. Most legitimate survey platforms including Relevant Reflex require members to be at least 18 years old to participate and earn rewards. This is a legal requirement related to contract eligibility.
Will paid surveys affect my studies?
Not if you manage your time well. Most students spend 20–30 minutes per day during idle time — commutes, free periods, or before bed. Survey participation does not require fixed time blocks and can be paused during exams without penalty.
Do I need to invest money to join paid survey sites as a student?
No. Legitimate paid survey platforms are always free to join. Never pay a registration fee or membership fee. Platforms that charge fees are scams.
Start Earning Your First ₹500 This Month
Join free, complete your profile, and start receiving survey invitations matched to your student profile.
-------------------- END OF FILE --------------------
### FILE 54: RR com/articles/paid-surveys-india-earning-potential.php
- Type: PHP
- Size: 33.89 KB
- Path: RR com/articles
- Name: paid-surveys-india-earning-potential.php
------------------------------------------------------------
Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?
April 9, 2026 Earning Guide 10 min read
Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?
An honest breakdown based on real data from 50,000+ Indian members — no inflated numbers, no false promises.
If you've searched for paid surveys in India, you've probably seen websites claiming you can earn ₹10,000–₹50,000 per month just by answering a few questions. Those numbers are not real. They are designed to get you to click, not to give you accurate information.
This article gives you the honest picture — based on actual member data from Relevant Reflex, which has operated India's paid survey platform since 2021 and paid over ₹25 lakh to 50,000+ verified Indian members via UPI. We want you to join us knowing exactly what to expect, not disappointed by unrealistic claims.
Here is what members at different stages of experience and engagement actually earn on Indian survey platforms. These ranges are based on real payout data — not projections or estimates from international markets.
Member Type
Daily Time
Monthly Earnings
Profile Status
Beginner Month 1–2
30–45 mins
₹500 – ₹1,500
Partially complete profile
Active Member Month 3–6
1–2 hours
₹2,000 – ₹4,000
Fully complete profile
Experienced Member 6+ months
2+ hours
₹4,000 – ₹6,000
100% profile + all profilers done
Multi-Platform 3–5 platforms combined
2–3 hours
₹6,000 – ₹10,000
Full profiles on all platforms
Important: These ranges reflect what active, consistent members earn. Individual results vary based on your demographic profile, time investment, and survey availability in your region. Earnings are supplemental income — not a replacement for a primary salary. See our Earnings Disclaimer for full details.
What Individual Surveys Actually Pay in India
Understanding the per-survey payout structure helps you set realistic daily expectations. Here is a breakdown by survey type and duration:
Survey Type
Duration
Typical Payout
Availability
Quick opinion polls
2–5 min
₹10 – ₹30
Daily
Standard surveys
10–15 min
₹40 – ₹120
Several per week
Detailed surveys
20–30 min
₹100 – ₹300
1–3 per week
Product testing surveys
30–45 min + usage period
₹400 – ₹2,000
Occasional (invite only)
Focus group discussions
60–90 min
₹1,000 – ₹3,000
Rare (invite only)
Profiler surveys
3–8 min
₹5 – ₹20 (or 0, but unlock more surveys)
Periodic
The key insight from this table: your monthly income is not determined by one big survey — it is built from consistent daily participation across multiple survey types. A member who completes 2–3 standard surveys per day plus one detailed survey every two days can realistically accumulate ₹2,000–₹3,000 per month before even factoring in the occasional product test or focus group.
5 Factors That Determine Your Earnings
1. Profile Completeness
This is the single most impactful factor and the one most beginners underestimate. Survey platforms match respondents to surveys based on demographic data — your age, gender, occupation, household income, education, family situation, vehicle ownership, and dozens of other criteria. A member with a fully completed profile including all optional profiler sections receives significantly more invitations than someone with basic information only.
On Relevant Reflex, members who complete 100% of their profile and all available profiler surveys receive on average 3–4x more survey invitations than members with incomplete profiles. This single action can double or triple your monthly earnings without any additional time investment.
2. Daily Login Consistency
Many surveys close once their response quota is filled — often within hours of opening. Members who check their dashboard and email daily catch these surveys before they close. Those who log in every few days regularly miss opportunities that are already gone. This is not something that can be compensated for by spending longer on the platform when you do log in — the surveys simply are not available anymore.
3. Your Demographic Profile
Some demographics receive more high-value surveys than others. This is determined by what Indian brands and market research agencies are currently studying — not something you can change. Demographics that typically receive more surveys in India include working professionals aged 25–45, car owners, parents of children under 12, people with household incomes above ₹5 lakh per year, residents of metros and Tier 1 cities, and people who regularly purchase consumer electronics, FMCG products, or financial products.
If your profile matches these demographics, your earnings potential is naturally higher. If it does not, your earnings will be lower — and that is honest. Survey platforms match based on research demand, not on what members want to earn.
4. Number of Platforms
No single survey platform has unlimited surveys available every day. Even the most active members on a single platform will have days with few or no surveys available. Joining 3–5 legitimate platforms ensures you always have something to complete. Members who combine Relevant Reflex with 2–3 other India-focused platforms typically earn 60–80% more per month than single-platform members with similar demographics.
5. Response Speed to Invitations
When you receive a survey invitation by email, responding within 1–2 hours dramatically increases your chances of completing it before the quota fills. Setting up email notifications for survey invitations and checking them promptly is a simple habit that meaningfully increases monthly earnings for most members.
How to Move from Beginner to Active Earner
The gap between earning ₹500/month and ₹3,000/month is almost entirely explained by these five actions — not by luck or by having the right demographic profile:
The 5 actions that move you from beginner to active earner:
Complete 100% of your profile on day 1 — spend the first 30–45 minutes after joining doing nothing else. This is the most valuable time you will invest on the platform.
Complete every profiler survey within 24 hours of it appearing. Set a habit of checking for new profilers every Monday morning.
Log in every day, even if only for 5 minutes to check for new surveys. Missing a day means missing surveys that closed overnight.
Join 2–3 other legitimate Indian survey platforms within your first month. Use your Relevant Reflex earnings as proof that the model works, then expand.
Be patient for the first 6–8 weeks. The algorithm needs time to learn your profile and match you with appropriate surveys. Members who give up in week 3 never see the earnings that months 3–6 deliver.
What a Realistic 3-Month Goal Looks Like
Here is what a typical new member journey looks like on Relevant Reflex, assuming consistent daily participation:
Month
What Happens
Expected Earnings
Month 1
Profile setup, learning the platform, completing profilers, first surveys — algorithm is still calibrating your profile
₹500 – ₹1,200
Month 2
More targeted survey invitations arriving, profiler data built up, first UPI withdrawal possible
₹1,000 – ₹2,500
Month 3
Consistent survey flow, good understanding of which survey types suit your profile, regular withdrawals
₹2,000 – ₹4,000
This progression is real — it happens because the matching algorithm gets more accurate data about your profile and preferences over time, and because profiler surveys you completed in month 1 begin unlocking higher-value survey categories in months 2–3.
The members who earn ₹500/month in month 1 and ₹4,000/month in month 6 are not the same people who give up in week 2 because they only earned ₹150 in their first survey session. Patience and consistency are what actually separate high earners from low earners on Indian survey platforms.
Frequently Asked Questions
How much can a beginner earn from paid surveys in India per month?
A beginner in their first 1–2 months can typically earn ₹500–₹1,500 per month, assuming daily logins and a partially completed profile. This increases significantly in months 3–6 as the platform calibrates to your profile.
Can you earn ₹5,000 per month from paid surveys in India?
Yes, but it requires consistent daily participation of 2+ hours, a fully completed profile, and a demographic that receives high-value survey invitations. Experienced members on multiple platforms can reach ₹6,000–₹10,000 combined.
What factors affect how much you earn from paid surveys in India?
The main factors are profile completeness, daily login consistency, your demographic profile, the number of platforms you use, and how quickly you respond to survey invitations.
How much does a single paid survey pay in India?
Short surveys of 5–10 minutes typically pay ₹20–₹60. Standard surveys of 15–20 minutes pay ₹60–₹200. Longer surveys pay ₹150–₹400. Focus group discussions of 60–90 minutes can pay ₹1,000–₹3,000.
Is ₹10,000/month from paid surveys in India possible?
It is possible but requires combining 3–5 platforms, 3+ hours of daily participation, a strong demographic profile, and several months of consistent participation. It is not achievable for most members in their first few months on a single platform.
Start Building Your Survey Income Today
Join 50,000+ Indians earning with Relevant Reflex. Free to join — UPI payments — ₹250 minimum payout.
November 28, 2024 |
Maximize Earnings |
Last updated: April 2026
Realistic Earning Expectations from Paid Surveys in India
Before joining any paid survey platform, it is important to understand what you can realistically earn — and what factors determine how much you make each month.
The Honest Truth About Survey Earnings in India
Online surveys are a genuine way to earn supplementary income in India — but they are not a replacement for a job or a primary income source. Anyone promising thousands of rupees per day from surveys alone is not being honest. The good news is that with consistent participation and a complete profile, most active members build a reliable monthly side income.
Indicative Earnings by Experience Level
Based on member data from Relevant Reflex, here is what members at different stages of participation typically earn. These are indicative ranges — individual results vary based on the factors described below.
Member Level
Daily Time
Monthly Earnings Range
Profile Status
Beginner (first 1–2 months)
30–45 mins
₹500 – ₹1,500
Partially complete
Active member
1–2 hours
₹2,000 – ₹4,000
Fully complete
Experienced member
2+ hours
₹5,000+
100% complete + profilers done
* These are indicative ranges based on member data. Individual earnings are not guaranteed and vary. See our Earnings Disclaimer.
What Determines How Much You Earn
Several factors directly influence your monthly survey earnings:
Your Demographic Profile
Certain demographics receive more survey invitations because brands specifically want their feedback. For example, professionals in technology, healthcare, or finance are frequently targeted for industry surveys that pay higher rates. Parents of young children, car owners, and frequent online shoppers also tend to receive more surveys. This is not something you can control — but being honest about your profile ensures you receive surveys you actually qualify for.
Profile Completeness
Members with complete profiles — including all profiler sections covering lifestyle, assets, income, and interests — receive significantly more survey invitations than those with basic profiles. This is the single most controllable factor in your earnings.
Daily Participation Consistency
Members who check their dashboard and email daily earn consistently more than those who participate sporadically. Many surveys close once their quota is filled — checking in daily means you catch surveys before they close.
Survey Availability in Your Region
Survey availability fluctuates based on what research clients are studying at any given time. Some months may have high survey volume; others may be quieter. This is normal and affects all members equally.
Why You Get Screened Out of Some Surveys
Getting screened out — where you start a survey but get disqualified partway through — is a normal part of survey taking and happens to every member. It means the survey was targeting a specific demographic that does not match your profile. You are not penalised for being screened out, and it does not affect your account quality. Over time, as your profiler data becomes richer, your screen-out rate decreases.
Surveys as Supplementary Income
The most satisfied survey takers treat earnings as a supplement — covering phone bills, streaming subscriptions, occasional dining out, or small savings contributions. Members who approach surveys with this mindset participate more consistently and sustainably than those expecting a primary income replacement.
Join 50,000+ Members Earning with Surveys
Relevant Reflex has paid ₹25 lakh+ to members across India since 2021. UPI payments, ₹500 minimum payout, free to join. Create your free account today.
-------------------- END OF FILE --------------------
### FILE 56: RR com/articles/relevant-reflex-review-legit.php
- Type: PHP
- Size: 31.19 KB
- Path: RR com/articles
- Name: relevant-reflex-review-legit.php
------------------------------------------------------------
Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)
April 9, 2026 Platform Review 11 min read
Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)
We are reviewing our own platform — so we have committed to being honest about both what works well and what our limitations are.
Disclosure: This review is written by the Relevant Reflex team about our own platform. We have made every effort to be honest and balanced, including acknowledging our limitations. We encourage you to read third-party reviews alongside this one before deciding to join.
When someone searches "is Relevant Reflex legit", they want a straight answer — not marketing language. This article gives you that. We cover what we are, what we have paid out, what our members say, and importantly, what our limitations are. A survey platform that only tells you the positives is not being honest with you.
Relevant Reflex is an India-based paid online survey platform founded in 2021 and operating from Ethirmedu, Tamil Nadu. We connect Indian consumers with companies and market research agencies that need opinions on their products, services, and advertising.
Members register for free, complete their demographic profile, and receive survey invitations matched to their profile. Completed surveys earn points redeemable as cash via UPI — directly to PhonePe, Google Pay, or Paytm. The minimum payout threshold is ₹250 (500 points at ₹0.50 per point).
We are a market research data collection company — not a get-rich-quick scheme, not an app that pays you for downloading other apps, and not a platform that charges a registration fee. We operate in a well-established, legitimate global industry.
Payment Proof and Payout Data
The most common question people ask when evaluating any survey platform is simple: do they actually pay? Here is our verified payout data as of April 2026:
Verified Payout Facts — Relevant Reflex (as of April 2026):
Total paid to members: ₹25 lakh+ via UPI
Total verified members: 50,000+ across India
Payment method: UPI only (PhonePe, GPay, Paytm)
Minimum payout threshold: ₹250 (500 pts × ₹0.50)
Average payout processing time: 3–7 business days
Platform founded: 2021
Registration fee: None — free to join
UPI payment screenshots from members are available on our social media profiles and can be requested by emailing support@relevantreflex.com. We blur account numbers and personal details before sharing. The transaction references in these screenshots are verifiable on the UPI network.
Our Honest Ratings
Payment reliability
4.5/5
Survey availability
3.5/5
Payout speed
4.0/5
Ease of use
4.3/5
Earning potential
3.7/5
Overall
4.2/5
Pros and Cons — Balanced View
What Works Well
Completely free to join — no fees ever
UPI payments — works with PhonePe, GPay, Paytm
Low ₹250 minimum payout threshold
India-specific surveys — not repurposed international content
Reliable payment processing — members are paid
Responsive email support team
Mobile-friendly platform — works well on Android and iOS
No investment of any kind required
Honest Limitations
Survey volume varies — not every day has available surveys
Some demographics receive fewer invitations than others
Screen-outs are common — this is normal on all platforms
Earnings are supplemental — not a primary income replacement
No app yet — mobile web only
Payout takes 3–7 days — not instant
Focus groups are invite-only and not guaranteed
What Members Say
Rather than curating only positive reviews, here is a representative range of member feedback we have received — positive and critical:
"I was sceptical at first but after receiving my first UPI payment of ₹650 in week 3, I was convinced. Now in my fourth month and earning around ₹2,800 per month consistently."
— Priya S., Software Professional, Bengaluru
"The first month was slow — maybe ₹400 total. But I kept at it, completed all the profiler surveys, and by month 3 I was getting 8–10 survey invitations per week. My last withdrawal was ₹1,800 in one go."
— Rajesh M., Teacher, Chennai
"I wish there were more surveys available every day. Some days I log in and there are only 1–2 available which is a bit disappointing. But when they are available they are genuine and the payment always comes through."
— Anitha K., Homemaker, Coimbatore
"I got screened out of several surveys in my first week and almost quit. Then I read that this is normal and completed my full profile. The screening rate dropped a lot after that. Good platform overall."
— Mohammed R., Student, Hyderabad
Our Honest Limitations
We believe you should know these before joining:
Survey availability is not guaranteed
The number of surveys available to you on any given day depends on what our research clients need that day, and whether your profile matches those requirements. There will be days — sometimes several in a row — where there are no new surveys available for your demographic. This is true of every survey platform in the world, not just ours. We cannot guarantee a minimum number of daily surveys.
Not everyone earns the same amount
Members with demographics that are frequently targeted by market research — working professionals in metros, car owners, parents — receive more survey invitations than members with less commonly researched profiles. We are transparent that earnings vary significantly by demographic profile.
Screen-outs happen
Being screened out of a survey — where you start and get rejected after a few questions — is a standard part of survey participation everywhere. Companies want specific demographic subgroups, and once a quota fills, everyone else is screened out. This is not a reflection of your answers being wrong. It is unavoidable in the survey industry.
This is supplemental income, not a salary
We do not want members to join expecting to replace a full-time income. Most active members earn ₹1,500–₹4,000 per month — genuinely useful supplemental income, but not a living wage. Members who join with realistic expectations are consistently satisfied. Members who join expecting ₹20,000 per month are always disappointed — on every platform.
Verdict — Is Relevant Reflex Worth Joining?
Yes — with realistic expectations
Relevant Reflex is a legitimate, free-to-join, UPI-paying Indian survey platform. It is not a scam, does not charge fees, and does pay its members. We have verifiable payment records across 50,000+ members.
It is worth joining if you want supplemental income from home with no investment, have 30–120 minutes per day available, and are patient enough to build up earnings over the first 2–3 months.
It is not the right fit if you expect to earn more than ₹6,000–₹8,000 per month from surveys alone, want instant payments, or are looking for a primary income source.
Our recommendation: Join free, complete your full profile on day 1, spend 30–45 minutes per day for the first 2 weeks, and evaluate after your first withdrawal. The experience will tell you everything you need to know.
Frequently Asked Questions
Is Relevant Reflex a legitimate survey platform?
Yes. Relevant Reflex is a legitimate India-based paid survey platform founded in 2021, operating from Tamil Nadu. It has paid over ₹25 lakh to 50,000+ verified Indian members via UPI and is free to join.
Does Relevant Reflex actually pay via UPI?
Yes. Payments go directly to your UPI account — PhonePe, Google Pay, or Paytm — once the ₹250 minimum threshold is reached. Withdrawals are processed within 3–7 business days.
Is there a registration fee?
No. Joining Relevant Reflex is completely free. We do not charge a registration fee, membership fee, or any other fee at any point. If any website claims you need to pay to join Relevant Reflex, that is a fraudulent site — not us.
What are the limitations of Relevant Reflex?
Survey availability varies by day and demographic. Members in smaller cities or with less commonly researched profiles may receive fewer invitations. Like all platforms, screen-outs happen. Earnings are supplemental — not a primary income replacement.
How long has Relevant Reflex been operating?
Relevant Reflex was founded in 2021 and has been operating continuously since then, growing to 50,000+ verified members across India.
Try It Yourself — Free to Join
The best way to evaluate any survey platform is to try it. Join free, complete your profile, and see your first earnings within 2–4 weeks.
-------------------- END OF FILE --------------------
### FILE 57: RR com/articles/time-management-tips-survey-takers.php
- Type: PHP
- Size: 13.35 KB
- Path: RR com/articles
- Name: time-management-tips-survey-takers.php
------------------------------------------------------------
Time Management Tips for Survey Takers in India | Relevant Reflex
November 15, 2024 |
Tips & Tricks |
Last updated: April 2026
Time Management Tips for Survey Takers in India
One of the biggest advantages of paid surveys is flexibility — you can participate whenever time allows. But without a simple routine, it is easy to miss surveys or participate inconsistently. These tips help you get the most from the time you invest.
Set a Fixed Daily Check-In Time
The most consistent earners on survey platforms share one habit — they check their dashboard at the same time every day. It does not need to be a long session. A 5–10 minute check each morning to see what surveys are available, and a quick email scan for invitation emails, is enough to ensure you never miss a survey that opened overnight.
Many surveys close within 24–48 hours of opening because research clients need responses quickly. Members who check daily catch these before they fill up. Members who check every few days regularly find surveys they qualified for have already closed.
Use Idle Time Productively
Most surveys on Relevant Reflex take between 5 and 20 minutes to complete. This fits naturally into time that would otherwise be idle — waiting for a bus or auto, a tea break at work, time between college classes, or the first 15 minutes after waking up. Rather than blocking out dedicated "survey time," many members find it easier to treat surveys as a productive use of idle moments throughout the day.
Prioritise Higher-Paying Surveys First
When multiple surveys are available at the same time, start with the ones that offer the highest reward relative to their estimated completion time. A 10-minute survey paying ₹80 is a better use of your time than a 15-minute survey paying ₹50. Over a month, making these small prioritisation decisions consistently adds up to meaningfully higher earnings.
Do Not Force Every Survey
If you are short on time, it is better to skip a survey entirely than to rush through it. Surveys completed too quickly are flagged by quality detection systems — the response gets rejected, you earn nothing, and your account quality score takes a hit. A rejected response wastes more time than skipping the survey would have. Participate when you can give each survey the attention it requires.
Mobile vs Desktop — Know When to Use Each
Relevant Reflex works on both mobile and desktop. Short opinion surveys of 5–10 minutes are well-suited to mobile — you can complete them during commutes or short breaks. Longer surveys of 15–25 minutes, particularly those with detailed questions or grids, are more comfortable on a desktop or laptop where reading and responding is easier. Using the right device for the right survey type reduces fatigue and improves response quality.
Complete Profile Updates Promptly
When the platform prompts you to update a section of your profile or complete a new profiler survey, do it the same day. Profile updates directly affect which surveys you are matched with. Delaying them means missing out on surveys that were targeted at your updated demographic in the meantime. Profiler surveys are typically short — 2 to 5 minutes — and the downstream benefit in survey availability is significant.
Track Your Monthly Earnings
Keeping a simple note of your monthly survey earnings — even just a number in your phone's notes app — helps you stay motivated and spot patterns. If you notice a particular month where earnings dropped, you can usually trace it back to a period of inconsistent participation. Tracking reinforces the habit and gives you a visible measure of progress over time.
Avoid Survey Burnout
Survey fatigue is real. Trying to complete every available survey every day can become exhausting and leads to lower-quality responses. A sustainable approach is better than an intensive one — 30 to 60 minutes of quality participation daily will produce better long-term results than 3-hour sessions a few times a week followed by days of inactivity.
Join Relevant Reflex and Start Earning
50,000+ members across India earn survey rewards via UPI on their own schedule. Free to join, ₹500 minimum payout. Sign up now — takes under 2 minutes.