# PSH IN 18 APR 26 001 - REPOSITORY ================================================================================ Project Name: PSH IN 18 APR 26 001 Created: 2026-04-18 03:04:59 Last Updated: 2026-04-18 03:05:05 Source ZIP: PSH IN.zip Total Files: 29 Total Folders: 8 ================================================================================ ## FILE STRUCTURE ================================================================================ PSH IN 18 APR 26 001/ └── PSH IN/ ├── about-us.php ├── assets/ │ └── style.css ├── config/ │ └── config.php ├── contact.php ├── faq.php ├── google7106e441233c8b50.html ├── includes/ │ ├── footer.php │ └── header.php ├── index.php ├── management/ │ ├── add-survey.php │ ├── change-password.php │ ├── dashboard.php │ ├── delete-survey.php │ ├── edit-survey.php │ ├── includes/ │ │ ├── footer.php │ │ └── header.php │ ├── index.php │ ├── logout.php │ ├── manage-reviews.php │ ├── manage-surveys.php │ ├── manage-tickets.php │ ├── newsletter-subscribers.php │ ├── reply-ticket.php │ └── view-ticket.php ├── privacy-policy.php ├── robots.txt ├── sitemap.xml ├── survey-detail.php ├── terms-conditions.php └── uploads/ └── review_proofs ================================================================================ ## FILE CONTENTS ================================================================================ ### FILE 1: PSH IN/about-us.php - Type: PHP - Size: 6.39 KB - Path: PSH IN - Name: about-us.php ------------------------------------------------------------

About Paid Survey Hub India

We are a free, independent directory that helps Indians find verified paid survey sites — saving hours of research and protecting you from scams. No membership fees. No signups. Just honest information.

Our Mission

At Paid Survey Hub India, our mission is straightforward: to connect Indians with genuine, verified paid online survey opportunities — while cutting through the confusion of finding legitimate platforms in a market full of scams and outdated information.

India has thousands of people looking for ways to earn supplemental income from home. The online survey industry is a legitimate way to do this — but only if you join the right platforms. We do the research and verification so you don't have to waste time on sites that don't pay, don't accept Indian members, or worse, try to steal your data.

Why We Built This

The Indian survey-taker faces a specific set of challenges that other markets don't:

🕵️

Too many scam sites

Sites that collect your data and never pay. We verify payment history before listing anything.

🌍

International sites that block India

Many global platforms don't accept Indian registrations. We only list platforms that genuinely work in India.

💳

Awkward payment methods

PayPal and gift cards don't suit everyone. We highlight UPI and bank transfer options prominently.

Wasted time on bad platforms

Getting screened out after 20 minutes, or earning 10 paise per survey. We only list platforms with reasonable payouts.

What Makes Us Different

  • India-specific verification — every platform is checked for Indian accessibility, not just global reputation.
  • No paid listings — we do not charge survey companies to appear in our directory. Our listings are based on merit only.
  • Honest about limitations — we note when a platform has limited India survey volume, awkward payment methods, or invite-only access.
  • Completely free to browse — no signup, no membership fee, no catches. Open to everyone.
  • Regularly updated — we remove sites that stop paying or stop accepting Indian members. The directory reflects current reality, not outdated information.

Who Uses This Directory

🎓

Students

🏠

Homemakers

💼

Professionals

🌟

Retirees

Anyone looking for genuine supplemental income from home — without investment, without a fixed schedule, and without any special skills.

Our Verification Process

Before any survey site appears in our directory, we check:

  • Does it accept registrations from India? (We test with Indian email addresses and phone numbers)
  • Does it have a verified payment history? (We look for independent reviews, payment screenshots, and community feedback)
  • Is the minimum payout threshold reasonable for Indian members? (Below ₹1,000 equivalent is our benchmark)
  • Are payment methods accessible in India? (UPI, PayPal, gift cards from Indian retailers)
  • Is it free to join? (Any platform that charges a registration fee is automatically excluded)

Important Disclaimer

Paid Survey Hub India is an information directory only. We are not a survey company and do not conduct surveys ourselves. We are not affiliated with any of the listed platforms (except Relevant Reflex, which is owned by the same team — disclosed clearly). Earnings from surveys vary by demographic, profile completeness, time invested, and platform availability. We do not guarantee any specific income from any platform listed.

Ready to find your first survey site?

Browse our full directory — free, no signup required.

Browse Survey Sites →
-------------------- END OF FILE -------------------- ### FILE 2: PSH IN/contact.php - Type: PHP - Size: 7.63 KB - Path: PSH IN - Name: contact.php ------------------------------------------------------------ real_escape_string(substr($_POST['name'] ?? '', 0, 255))); $email = trim($conn->real_escape_string(substr($_POST['email'] ?? '', 0, 255))); $message = trim($conn->real_escape_string(substr($_POST['message'] ?? '', 0, 2000))); if (empty($name) || empty($email) || empty($message)) { $error = 'All fields are required.'; } elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $error = 'Please enter a valid email address.'; } elseif (strlen($message) < 15) { $error = 'Please write at least 15 characters in your message.'; } else { // Save to database $response_token = md5(uniqid($email, true) . time()); $sql = "INSERT INTO contact_messages (name, email, message, ticket_status, response_token) VALUES ('$name', '$email', '$message', 'new', '$response_token')"; if ($conn->query($sql)) { $ticket_id = $conn->insert_id; // Notify admin via email $admin_email = 'gethelp@paidsurveyhub.in'; $email_subject = "New Contact Message #$ticket_id — PaidSurveyHub India"; $email_body = "New contact form submission on PaidSurveyHub India.\n\n" . "Ticket ID: #$ticket_id\n" . "From: $_POST[name] <$_POST[email]>\n" . "Message:\n$_POST[message]\n\n" . "Manage at: " . SITE_URL . ADMIN_PATH . "/manage-tickets.php"; $headers = "From: PaidSurveyHub \r\nReply-To: $_POST[email]\r\n"; @mail($admin_email, $email_subject, $email_body, $headers); // Auto-reply to sender $reply_subject = "We received your message — Paid Survey Hub India (Ticket #$ticket_id)"; $reply_body = "Hi $_POST[name],\n\nThank you for contacting Paid Survey Hub India.\n\n" . "We have received your message and will respond to this email within 24 hours.\n\n" . "Your Ticket ID: #$ticket_id\n\n" . "Regards,\nPaid Survey Hub India Team\ngethelp@paidsurveyhub.in\nhttps://paidsurveyhub.in"; $reply_headers = "From: PaidSurveyHub \r\n"; @mail($_POST['email'], $reply_subject, $reply_body, $reply_headers); $success = "Your message has been sent! We will reply to " . htmlspecialchars($_POST['email']) . " within 24 hours. Your ticket ID is #$ticket_id."; } else { $error = 'Something went wrong. Please try again or email us directly.'; } } } } $page_title = 'Contact Us — Paid Survey Hub India'; $meta_description = 'Contact Paid Survey Hub India. Have a question about our survey directory? Get in touch with our support team.'; $canonical = SITE_URL . '/contact.php'; include 'includes/header.php'; ?>

Contact Us

Have a question about our directory or a survey site? We'll get back to you within 24 hours.

⏱ Response Time
Within 24 hours
Or send us a message
We will reply to this address.

By submitting you agree to our Privacy Policy. We never share your details with third parties.

What we can help with: Questions about our directory, suggesting a survey site to add, reporting a site that has stopped paying, general questions about survey platforms in India.

What we cannot help with: Account issues, payment disputes, or support tickets for individual survey platforms — please contact those platforms directly using the support links on their detail pages.

-------------------- END OF FILE -------------------- ### FILE 3: PSH IN/faq.php - Type: PHP - Size: 18.37 KB - Path: PSH IN - Name: faq.php ------------------------------------------------------------ ' . json_encode([ "@context" => "https://schema.org", "@type" => "FAQPage", "mainEntity" => [ ["@type"=>"Question","name"=>"What is Paid Survey Hub India?","acceptedAnswer"=>["@type"=>"Answer","text"=>"Paid Survey Hub India is a free, publicly accessible directory that lists verified paid survey websites available to Indian users. We research and test platforms so you can find legitimate opportunities without wasting time on scams."]], ["@type"=>"Question","name"=>"Is Paid Survey Hub India free to use?","acceptedAnswer"=>["@type"=>"Answer","text"=>"Yes, completely free. No registration, no membership fee, no catches. You can browse all survey sites, read details, and access full information without creating an account."]], ["@type"=>"Question","name"=>"How much can I earn from paid surveys in India?","acceptedAnswer"=>["@type"=>"Answer","text"=>"Most active members on India-focused platforms earn between ₹500 and ₹4,000 per month depending on their demographic profile, daily participation, and the platforms they use. Surveys are supplemental income, not a full-time salary replacement."]], ["@type"=>"Question","name"=>"Which survey site is best for UPI payment in India?","acceptedAnswer"=>["@type"=>"Answer","text"=>"Relevant Reflex is currently the only India-built survey platform offering direct UPI payment to PhonePe, Google Pay, and Paytm with a ₹250 minimum payout. International platforms like Swagbucks and Toluna pay via gift cards or PayPal."]], ["@type"=>"Question","name"=>"How do I avoid survey scams in India?","acceptedAnswer"=>["@type"=>"Answer","text"=>"Avoid any platform that charges a registration fee, promises unusually high earnings, asks for your bank PIN or OTP, or has no verifiable payment history. All legitimate survey platforms are free to join and pay you — not the other way around."]], ] ], JSON_UNESCAPED_SLASHES) . ''; include 'includes/header.php'; ?>

Frequently Asked Questions

Find answers to common questions about our directory, survey platforms, earnings, and how to stay safe online.

ℹ About Paid Survey Hub India
What is Paid Survey Hub India?

Paid Survey Hub India is a free, publicly accessible directory that lists verified paid survey websites available to Indian users. We research, test, and list platforms that genuinely accept Indian members and have a proven payment history — so you can find legitimate opportunities without wasting time on scams. We are not a survey company and do not conduct surveys ourselves.

Is Paid Survey Hub India free to use?

Yes, completely free. No registration, no membership fee, no hidden charges. You can browse all survey sites, read full details, and access all information without creating an account or providing any personal information.

Are you a survey company?

No. We are an information directory. We do not conduct surveys, collect survey responses, or pay you for survey participation. We simply list and describe the platforms where you can do all of that. When you click on a survey site, you go directly to that platform's own website.

How do you verify the survey sites you list?

Before listing any platform we check: (1) Does it accept registrations from India? (2) Does it have a verifiable payment history? (3) Is the minimum payout threshold reasonable for Indian users? (4) Are payment methods accessible in India (UPI, PayPal, Indian retailer gift cards)? (5) Is it free to join? Any platform that fails these checks is not listed.

Is Relevant Reflex related to Paid Survey Hub?

Yes — Relevant Reflex and Paid Survey Hub India are owned by the same team. We disclose this clearly. Relevant Reflex is ranked #1 in our directory because it is the only India-built, UPI-native survey platform. All other listings in our directory are independent platforms from which we receive no compensation for being listed.

🚀 Getting Started with Surveys
How do I start earning from paid surveys in India?

Browse our directory and choose 2–3 platforms that accept your demographic. Register for free on each — it takes 5–10 minutes per platform. Complete your profile thoroughly on day 1. Then log in daily to check for new survey invitations. Once your balance reaches the minimum payout threshold, request a withdrawal to your UPI account.

How many survey sites should I join?

We recommend joining 3–5 platforms. No single platform has surveys available every day for every demographic. Joining multiple platforms ensures you always have something to complete. Start with 2–3, get comfortable with the process over 4–6 weeks, then add more if you want to increase your earnings.

Do I need a laptop or will my phone work?

Most survey platforms are fully mobile-optimised and work on Android and iOS smartphones. Some have dedicated apps. Platforms like Relevant Reflex, AttaPoll, and Google Opinion Rewards are specifically designed for mobile. A laptop is not required.

Do I need to be 18 to participate in paid surveys?

Yes. Most survey platforms including all those listed in our directory require members to be at least 18 years old. This is a legal requirement related to contract eligibility and data processing consent.

💰 Earnings & Payments
How much can I earn from paid surveys in India?

Most active members on India-focused platforms earn between ₹500 and ₹4,000 per month. Beginners typically earn ₹500–₹1,500 in their first 1–2 months. Experienced members who use multiple platforms and have complete profiles earn ₹2,000–₹4,000 per month. These are supplemental earnings — not a primary income replacement.

Which survey sites pay via UPI in India?

Relevant Reflex is currently the only India-built survey platform with native UPI payment (PhonePe, Google Pay, Paytm) with a ₹250 minimum payout. International platforms like Swagbucks and Toluna pay via gift cards or PayPal. OpinionWorld India offers some bank transfer options. Check individual platform detail pages for current payment information.

Why do I keep getting screened out of surveys?

Being screened out means the survey was targeting a specific demographic that doesn't match your profile, or the quota for your demographic was already filled. This is completely normal and happens on every platform worldwide. The fix is to complete your profile surveys thoroughly — the more accurately platforms know your demographics, the better matched your survey invitations will be.

Are survey earnings taxable in India?

Survey earnings are technically income in India. For most people earning ₹1,000–₹4,000 per month from surveys, this is below the taxable threshold when combined with a primary salary or when it is their only income source below the ₹2.5 lakh annual limit. If you consistently earn significantly from surveys, consult a tax professional about your specific situation.

🛡️ Avoiding Scams
How do I know if a survey site is a scam?

Red flags to watch for: (1) The site charges a registration or membership fee — legitimate platforms are always free. (2) It promises unusually high earnings like ₹10,000 per day or ₹500 per survey for 5-minute surveys. (3) It asks for your bank PIN, OTP, Aadhaar number, or debit card details. (4) There are no verifiable payment proofs or independent reviews. (5) The website has no contact information or support channel. If any of these apply, do not join.

Are all sites listed in this directory genuine?

We verify all listed platforms at the time of listing for Indian accessibility and payment history. However, platforms can change over time — their policies, payment methods, or quality of service may change without notice. We recommend doing your own research and starting with small participation before committing significant time to any platform. We update and remove sites regularly based on community feedback.

What information should I never share with a survey site?

Never share: your bank account PIN, UPI PIN, debit/credit card number, OTP (one-time password), Aadhaar card number, PAN card number, or any government ID. Legitimate survey platforms only need your name, email, and demographic information (age, gender, occupation) to match you with surveys. They only need your UPI ID (not PIN) to send you money.

💡 Tips for More Earnings
What's the single most important thing to do after joining?

Complete your profile 100% on day 1. This is the most impactful action you can take. Survey platforms match respondents to surveys based on demographic data. Members with fully completed profiles — including all profiler/lifestyle surveys — receive 3–4x more survey invitations than those with incomplete profiles.

Why should I log in daily even when there are no surveys?

Many surveys close within hours of opening once their respondent quota fills. Members who check daily catch these opportunities; those who check every few days regularly miss surveys that are already closed. A quick 5-minute daily check can significantly increase your monthly earnings over members who participate sporadically.

Does answering honestly really matter?

Yes — and it protects you. Survey platforms use quality checks including consistency questions, timing analysis, and response pattern detection. Rushed or inconsistent answers get flagged, the response doesn't get credited, and repeated issues can lead to account suspension. Honest, thoughtful participation is also what unlocks higher-value surveys over time.

Ready to find your first survey site?

Browse our verified directory — free, no signup needed.

Browse Survey Sites →
-------------------- END OF FILE -------------------- ### FILE 4: PSH IN/google7106e441233c8b50.html - Type: HTML - Size: 53 B - Path: PSH IN - Name: google7106e441233c8b50.html ------------------------------------------------------------ google-site-verification: google7106e441233c8b50.html -------------------- END OF FILE -------------------- ### FILE 5: PSH IN/index.php - Type: PHP - Size: 16.85 KB - Path: PSH IN - Name: index.php ------------------------------------------------------------ real_escape_string($_GET['search'])) : ''; $filter = isset($_GET['filter']) ? trim($conn->real_escape_string($_GET['filter'])) : ''; // Build search condition $search_condition = ''; if (!empty($search)) { $search_condition = " AND (s.title LIKE '%$search%' OR s.description LIKE '%$search%')"; } // Fetch rank #1 survey $rank1_sql = "SELECT s.*, COALESCE(AVG(r.rating), 0) as avg_rating, COUNT(r.id) as review_count FROM survey_sites s LEFT JOIN survey_reviews r ON s.id = r.survey_id AND r.is_approved = 1 WHERE s.rank = 1 $search_condition GROUP BY s.id"; $rank1_result = $conn->query($rank1_sql); $rank1_survey = ($rank1_result && $rank1_result->num_rows > 0) ? $rank1_result->fetch_assoc() : null; // Fetch ranks 2-5 $ranked_sql = "SELECT s.*, COALESCE(AVG(r.rating), 0) as avg_rating, COUNT(r.id) as review_count FROM survey_sites s LEFT JOIN survey_reviews r ON s.id = r.survey_id AND r.is_approved = 1 WHERE s.rank IS NOT NULL AND s.rank > 1 $search_condition GROUP BY s.id ORDER BY s.rank ASC"; $ranked_result = $conn->query($ranked_sql); // Fetch unranked (randomised) $unranked_sql = "SELECT s.*, COALESCE(AVG(r.rating), 0) as avg_rating, COUNT(r.id) as review_count FROM survey_sites s LEFT JOIN survey_reviews r ON s.id = r.survey_id AND r.is_approved = 1 WHERE s.rank IS NULL $search_condition GROUP BY s.id ORDER BY RAND()"; $unranked_result = $conn->query($unranked_sql); // Count total $total_sites = 0; if ($rank1_survey) $total_sites++; if ($ranked_result) $total_sites += $ranked_result->num_rows; if ($unranked_result) $total_sites += $unranked_result->num_rows; // Schema for ItemList $schema_items = []; $schema_pos = 1; // Helper: render star HTML function render_stars($rating) { $full = floor($rating); $empty = 5 - $full; $stars = str_repeat('★', $full) . str_repeat('☆', $empty); return $stars; } // Helper: truncate function trunc($str, $len = 180) { return strlen($str) > $len ? substr($str, 0, $len) . '…' : $str; } include 'includes/header.php'; ?>
🇮🇳 India's Survey Directory

Find the Best Paid Survey Sites in India

We've verified + survey platforms so you don't have to. Compare payment methods, minimum payouts, and India availability — then join the ones that suit you.

+Verified Sites
100%Free to Browse
2026Updated
₹500+Min. Payout Options
No survey sites found for "". View all sites
⭐ Our Top Pick for Indian Users
num_rows > 0): ?>
🥇 Highly Recommended
fetch_assoc()): $schema_items[] = [ 'pos' => $schema_pos++, 'name' => $survey['title'], 'url' => $survey['website_link'], 'image' => SITE_URL . '/uploads/' . $survey['image'], ]; ?>
num_rows > 0): ?>
🌐 More Verified Survey Sites
fetch_assoc()): $schema_items[] = [ 'pos' => $schema_pos++, 'name' => $survey['title'], 'url' => $survey['website_link'], 'image' => SITE_URL . '/uploads/' . $survey['image'], ]; ?>
🔍

All Sites Verified

Every platform is personally tested for Indian accessibility and payment history. We remove non-performing sites regularly.

💰

Compare & Choose

Compare payment methods — UPI, PayPal, gift cards — minimum payouts, and survey frequency before you sign up anywhere.

🆓

Always Free to Browse

This directory is completely free. No signup, no fees, no catches. All survey sites listed are also free to join.

🇮🇳

New to Paid Surveys?

Start with India's only UPI-native survey platform — built specifically for Indian members since 2021. Free to join. Payments directly to PhonePe, GPay, or Paytm.

Join Relevant Reflex Free ↗ 50,000+ members  ·  ₹250 min. payout  ·  No investment
"ListItem", "position" => $si['pos'], "item" => [ "@type" => "Thing", "@id" => $si['url'], "name" => $si['name'], "image" => $si['image'], "url" => $si['url'], ], ]; } $schema = [ "@context" => "https://schema.org", "@type" => "ItemList", "name" => "Best Paid Survey Sites in India 2026", "description" => "Verified directory of paid survey platforms that accept Indian members", "numberOfItems" => count($schema_items), "itemListElement" => $items_json, ]; echo ''; endif; ?> -------------------- END OF FILE -------------------- ### FILE 6: PSH IN/privacy-policy.php - Type: PHP - Size: 5.97 KB - Path: PSH IN - Name: privacy-policy.php ------------------------------------------------------------

Privacy Policy

Last Updated: April 10, 2026

Paid Survey Hub India is a free, publicly accessible directory. We do not require you to create an account or provide personal information to browse our content. This policy explains what limited data we do collect and how we use it.

1. What We Are

Paid Survey Hub India (paidsurveyhub.in) is a free information directory listing verified paid survey websites available to Indian users. You do not need to register, create an account, or provide any personal information to use this website.

2. Information We Collect

Information You Provide

We only collect personal information when you choose to contact us via our contact form. This includes your name and email address — used solely to respond to your enquiry.

Automatically Collected Information

Like all websites, we automatically collect limited technical information when you visit, including:

  • IP address (anonymised)
  • Browser type and version
  • Device type (desktop/mobile)
  • Pages visited and time spent
  • Referring website (how you found us)

This information is collected by Google Analytics and Google Ads (gtag.js) in anonymised form. We use it to understand which content is most useful to visitors and to improve the directory.

3. How We Use Your Information

  • Contact enquiries: To respond to messages you send via our contact form
  • Analytics: To understand visitor behaviour and improve our content (anonymised data only)
  • Security: To detect and prevent malicious activity or abuse

We do not use your information for marketing, we do not sell it to third parties, and we do not share it with survey companies listed in our directory.

4. Cookies

We use cookies in the following ways:

  • Google Analytics: Anonymised usage statistics. You can opt out via Google's opt-out tool.
  • Google Ads: Conversion tracking for our own advertising campaigns. This does not affect your browsing experience.
  • Essential cookies: Required for basic site functionality (no personal data stored).

You can control cookie preferences through your browser settings. Disabling cookies will not affect your ability to browse this directory.

5. Third-Party Survey Websites

Our directory contains links to third-party survey websites. When you click through to these sites:

  • You are leaving paidsurveyhub.in and entering a third-party website
  • Each survey site has its own privacy policy and data practices
  • We have no control over and take no responsibility for third-party data practices
  • We strongly recommend reviewing the privacy policy of any survey site before registering

6. Data Security

We implement standard security measures to protect any information collected. Contact form submissions are transmitted securely. However, no internet transmission is 100% secure and we cannot guarantee absolute security.

7. Data Retention

Contact form enquiries are retained for up to 12 months and then deleted. Anonymised analytics data is retained as per Google Analytics default settings (26 months).

8. Your Rights

You have the right to:

  • Request access to any personal information we hold about you
  • Request correction of inaccurate information
  • Request deletion of your information
  • Object to processing of your information

To exercise any of these rights, contact us via our contact form or email gethelp@paidsurveyhub.in.

9. Children's Privacy

This website is not intended for individuals under 18 years of age. We do not knowingly collect information from anyone under 18.

10. Changes to This Policy

We may update this Privacy Policy periodically. The "Last Updated" date above reflects the most recent revision. Material changes will be noted on this page.

11. Contact Us

For any privacy-related questions or concerns:

-------------------- END OF FILE -------------------- ### FILE 7: PSH IN/robots.txt - Type: TXT - Size: 132 B - Path: PSH IN - Name: robots.txt ------------------------------------------------------------ User-agent: * Allow: / Disallow: /management/ Disallow: /config/ Disallow: /includes/ Sitemap: https://paidsurveyhub.in/sitemap.xml -------------------- END OF FILE -------------------- ### FILE 8: PSH IN/sitemap.xml - Type: XML - Size: 3.75 KB - Path: PSH IN - Name: sitemap.xml ------------------------------------------------------------ https://www.paidsurveyhub.in/ 2026-04-10 weekly 1.0 https://www.paidsurveyhub.in/about-us.php 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/faq.php 2026-04-10 monthly 0.8 https://www.paidsurveyhub.in/contact.php 2026-04-10 monthly 0.5 https://www.paidsurveyhub.in/privacy-policy.php 2026-04-10 yearly 0.3 https://www.paidsurveyhub.in/terms-conditions.php 2026-04-10 yearly 0.3 https://www.paidsurveyhub.in/survey-detail.php?id=1 2026-04-10 monthly 0.9 https://www.paidsurveyhub.in/survey-detail.php?id=4 2026-04-10 monthly 0.8 https://www.paidsurveyhub.in/survey-detail.php?id=20 2026-04-10 monthly 0.8 https://www.paidsurveyhub.in/survey-detail.php?id=6 2026-04-10 monthly 0.8 https://www.paidsurveyhub.in/survey-detail.php?id=9 2026-04-10 monthly 0.8 https://www.paidsurveyhub.in/survey-detail.php?id=2 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=3 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=7 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=8 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=10 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=15 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=16 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=19 2026-04-10 monthly 0.7 https://www.paidsurveyhub.in/survey-detail.php?id=21 2026-04-10 monthly 0.7 -------------------- END OF FILE -------------------- ### FILE 9: PSH IN/survey-detail.php - Type: PHP - Size: 46.74 KB - Path: PSH IN - Name: survey-detail.php ------------------------------------------------------------ query($sql); if (!$result || $result->num_rows == 0) { header('Location: ' . SITE_URL . '/'); exit; } $survey = $result->fetch_assoc(); // Check if proof columns exist before selecting them $proof_cols = ''; $cols_result = $conn->query("SHOW COLUMNS FROM survey_reviews LIKE 'proof_file'"); if ($cols_result && $cols_result->num_rows > 0) { $proof_cols = ', proof_file, proof_type'; } // Fetch approved reviews $reviews_sql = "SELECT rating, feedback{$proof_cols}, reviewer_name, reviewer_location, reviewer_email, created_at, helpful_count FROM survey_reviews WHERE survey_id = $survey_id AND is_approved = 1 ORDER BY created_at DESC LIMIT 20"; $reviews_result = $conn->query($reviews_sql); // Rating breakdown $breakdown_sql = "SELECT rating, COUNT(*) as cnt FROM survey_reviews WHERE survey_id = $survey_id AND is_approved = 1 GROUP BY rating ORDER BY rating DESC"; $breakdown_result = $conn->query($breakdown_sql); $breakdown = [5=>0, 4=>0, 3=>0, 2=>0, 1=>0]; if ($breakdown_result) { while ($row = $breakdown_result->fetch_assoc()) { $breakdown[(int)$row['rating']] = (int)$row['cnt']; } } // Handle review submission $review_success = false; $review_error = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit_review'])) { // Honeypot spam check if (!empty($_POST['website_url'])) { $review_error = 'Spam detected.'; } else { $rating = (int)($_POST['rating'] ?? 0); $feedback = trim($conn->real_escape_string($_POST['feedback'] ?? '')); $name = trim($conn->real_escape_string(substr($_POST['reviewer_name'] ?? '', 0, 100))); $location = trim($conn->real_escape_string(substr($_POST['reviewer_location'] ?? '', 0, 100))); $email_raw = trim($_POST['reviewer_email'] ?? ''); $newsletter_consent = isset($_POST['newsletter_consent']) ? 1 : 0; $ip = $conn->real_escape_string($_SERVER['REMOTE_ADDR'] ?? ''); // Validate if ($rating < 1 || $rating > 5) { $review_error = 'Please select a star rating.'; } elseif (empty($name)) { $review_error = 'Please enter your name.'; } elseif (empty($email_raw) || !filter_var($email_raw, FILTER_VALIDATE_EMAIL)) { $review_error = 'Please enter a valid email address. Your email is required to verify your review.'; } elseif (strlen($feedback) < 20) { $review_error = 'Please write at least 20 characters in your review.'; } else { $email = $conn->real_escape_string(substr($email_raw, 0, 255)); // Handle proof file upload $proof_file = null; $proof_type = null; if (!empty($_FILES['proof_file']['name']) && $_FILES['proof_file']['error'] === UPLOAD_ERR_OK) { $allowed_types = ['image/jpeg','image/jpg','image/png','image/gif','application/pdf']; $file_type = mime_content_type($_FILES['proof_file']['tmp_name']); $file_size = $_FILES['proof_file']['size']; if (!in_array($file_type, $allowed_types)) { $review_error = 'Only JPG, PNG, GIF images or PDF files are allowed as proof.'; } elseif ($file_size > 5 * 1024 * 1024) { $review_error = 'Proof file must be under 5MB.'; } else { $ext = pathinfo($_FILES['proof_file']['name'], PATHINFO_EXTENSION); $proof_file = 'review_proof_' . time() . '_' . rand(1000,9999) . '.' . strtolower($ext); $upload_dir = 'uploads/review_proofs/'; if (!is_dir($upload_dir)) mkdir($upload_dir, 0755, true); if (!move_uploaded_file($_FILES['proof_file']['tmp_name'], $upload_dir . $proof_file)) { $proof_file = null; } else { $proof_type = (strpos($file_type, 'pdf') !== false) ? 'pdf' : 'image'; } } } if (!$review_error) { // Rate limiting — 1 review per IP per survey per day $rate_check = "SELECT COUNT(*) as cnt FROM survey_reviews WHERE survey_id = $survey_id AND ip_address = '$ip' AND created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)"; $rate_row = $conn->query($rate_check)->fetch_assoc(); // Same email check $email_check = "SELECT COUNT(*) as cnt FROM survey_reviews WHERE survey_id = $survey_id AND reviewer_email = '$email'"; $email_row = $conn->query($email_check)->fetch_assoc(); if ($rate_row['cnt'] > 0) { $review_error = 'You have already submitted a review for this platform today. Please wait 24 hours.'; } elseif ($email_row['cnt'] > 0) { $review_error = 'A review from this email address already exists for this platform.'; } else { $name_val = !empty($name) ? "'$name'" : "'Anonymous'"; $loc_val = !empty($location) ? "'" . $conn->real_escape_string($location) . "'" : "NULL"; $proof_file_val = $proof_file ? "'" . $conn->real_escape_string($proof_file) . "'" : "NULL"; $proof_type_val = $proof_type ? "'" . $conn->real_escape_string($proof_type) . "'" : "NULL"; // Build INSERT — include proof columns only if they exist $proof_col_sql = $proof_cols ? ", proof_file, proof_type" : ""; $proof_val_sql = $proof_cols ? ", {$proof_file_val}, {$proof_type_val}" : ""; $insert = "INSERT INTO survey_reviews (survey_id, member_id, reviewer_name, reviewer_location, reviewer_email, newsletter_consent, rating, feedback, is_approved, ip_address{$proof_col_sql}) VALUES ($survey_id, NULL, $name_val, $loc_val, '$email', $newsletter_consent, $rating, '$feedback', 0, '$ip'{$proof_val_sql})"; if ($conn->query($insert)) { if ($newsletter_consent) { $survey_name_esc = $conn->real_escape_string($survey['title']); $sub_sql = "INSERT INTO newsletter_subscribers (email, name, source, source_survey_id, source_survey_name, ip_address) VALUES ('$email', $name_val, 'review_form', $survey_id, '$survey_name_esc', '$ip') ON DUPLICATE KEY UPDATE is_active=1, unsubscribed_at=NULL, name=COALESCE(name, $name_val)"; $conn->query($sub_sql); } $review_success = true; } else { $review_error = 'Something went wrong. Please try again.'; } } } } } } // Helper: parse contact field → smart display function parse_contact($contact) { $contact = trim($contact); if (empty($contact)) return null; // Check if it contains an email if (filter_var($contact, FILTER_VALIDATE_EMAIL)) { return ['type' => 'email', 'value' => $contact, 'display' => $contact]; } // Check if contains email within text if (preg_match('/[\w.+-]+@[\w-]+\.[\w.]+/', $contact, $m)) { return ['type' => 'email', 'value' => $m[0], 'display' => $m[0]]; } // It's a URL — extract domain for display $url = $contact; if (!preg_match('/^https?:\/\//', $url)) $url = 'https://' . $url; $parsed = parse_url($url); $domain = $parsed['host'] ?? $url; $domain = preg_replace('/^www\./', '', $domain); return ['type' => 'url', 'value' => $url, 'display' => 'Contact Form (' . $domain . ')']; } function mask_email($email) { if (empty($email)) return ''; $parts = explode('@', $email); if (count($parts) !== 2) return '***@***.***'; $name = $parts[0]; $domain = $parts[1]; $masked_name = substr($name, 0, 1) . str_repeat('*', max(2, strlen($name) - 1)); $domain_parts = explode('.', $domain); $masked_domain = substr($domain_parts[0], 0, 1) . str_repeat('*', max(2, strlen($domain_parts[0]) - 1)); $tld = implode('.', array_slice($domain_parts, 1)); return $masked_name . '@' . $masked_domain . '.' . $tld; } function render_stars_html($rating, $size = '1rem') { $full = floor($rating); $empty = 5 - $full; $html = ''; $html .= str_repeat('★', $full) . '' . str_repeat('★', $empty) . ''; $html .= ''; return $html; } $contact_info = parse_contact($survey['support_contact']); $total_reviews = (int)$survey['review_count']; $avg_rating = round($survey['avg_rating'], 1); $page_title = htmlspecialchars($survey['title']) . ' Review 2026 — Is it Legitimate? | PaidSurveyHub India'; $meta_description = 'Read verified member reviews of ' . htmlspecialchars($survey['title']) . '. See star ratings, honest feedback from Indian users, payment details, and whether it\'s worth joining in 2026.'; $canonical = SITE_URL . '/survey-detail.php?id=' . $survey_id; $extra_schema = ''; // Always output Product schema — include offers (required by Google) and aggregateRating when available $schema_data = [ "@context" => "https://schema.org", "@type" => "Product", "name" => $survey['title'], "url" => $survey['website_link'], "image" => SITE_URL . '/uploads/' . $survey['image'], "description" => substr(strip_tags($survey['description']), 0, 300), "offers" => [ "@type" => "Offer", "price" => "0", "priceCurrency" => "INR", "description" => "Free to join — no registration fee", "availability" => "https://schema.org/InStock", ], ]; if ($total_reviews > 0) { $schema_data["aggregateRating"] = [ "@type" => "AggregateRating", "ratingValue" => $avg_rating, "reviewCount" => (int)$total_reviews, "bestRating" => 5, "worstRating" => 1, ]; } $extra_schema = ''; include 'includes/header.php'; ?>
🏆 Rank # in India

0): ?>
/5 review1?'s':''; ?>
✓ Verified 🆓 Free to Join 🇮🇳 India-Based 💳 UPI Payment

About

How to Get Started

  1. Click "Visit " above to go to their website
  2. Click "Sign Up" or "Join Free" on their site — it's always free
  3. Fill in your demographic details honestly — this determines which surveys you receive
  4. Verify your email address by clicking the link they send you
  5. Complete all profile/profiler surveys to unlock more survey invitations
  6. Log in daily, complete surveys, and request a withdrawal when you hit the minimum payout

Member Reviews

0): ?> ✍ Write a Review
0): ?>
review1?'s':''; ?>
0 ? round(($cnt / $total_reviews) * 100) : 0; ?>
fetch_assoc()): ?>
' . str_repeat('★', 5-$full) . ''; ?> /5 ✓ Verified Review
📍

📎 Member Proof
Member proof
Click image to view full size
📄 View PDF Proof ↗

No reviews yet

Be the first to share your experience with this platform.

Write the First Review

Have you used ?

Share your honest experience — help other Indians decide. Proof or screenshot required for approval.

✍ Write a Review
Rate it:
Click a star to begin

Write Your Review

All reviews are verified before publishing. You can upload payment proof or a complaint screenshot to strengthen your review.

✓ Thank you for your review! It has been submitted and will appear here once our team approves it — usually within 24 hours.
📩 You've also been added to our newsletter.
= 1; $i--): ?> >
Click a star to rate
Required to verify your review. Never displayed publicly.
Minimum 20 characters. Maximum 2,000 characters.
📎
Drop your proof here or click to browse
Payment screenshot, reward proof, or complaint — JPG, PNG, GIF or PDF · Max 5MB
This helps other members trust your review. Your proof will be shown alongside your review after approval.
📋 Important — Proof Required for Approval: Regardless of whether your experience is positive or negative, only reviews supported by a screenshot or proof will be approved. Please upload a payment proof, survey completion screenshot, or any relevant evidence using the upload field above. Reviews without proof will not be published. By submitting you agree to our Terms.
⚠️ Disclaimer: PaidSurveyHub India is an independent directory. We are not affiliated with this platform and do not conduct surveys. Earnings are not guaranteed. Always research a platform before providing personal information.

Quick Facts

Verified
✓ Yes
Free to Join
✓ Yes
Payment Method
UPI (PhonePe · GPay · Paytm)
Min. Payout
₹250 (500 pts × ₹0.50)
Based In
India (Tamil Nadu)
Members
50,000+
Founded
2021
Our Rank
# in India
0): ?>
Rating
/5 ( reviews)
Support
🚀

Ready to Join?

It's free. No investment required.

Visit

Tips for Success

  • Complete your profile 100% on day 1
  • Log in daily — surveys close when quotas fill
  • Answer honestly — inconsistencies get flagged
  • Check email promptly for invitations
  • Join 3–5 platforms to maximise earnings
Read all earning tips →

Other Sites to Try

query($other_sql); if ($other_result): while ($other = $other_result->fetch_assoc()): ?> <?php echo htmlspecialchars($other['title']); ?> # View all survey sites →
-------------------- END OF FILE -------------------- ### FILE 10: PSH IN/terms-conditions.php - Type: PHP - Size: 7.19 KB - Path: PSH IN - Name: terms-conditions.php ------------------------------------------------------------

Terms and Conditions

Last Updated: April 10, 2026

Welcome to Paid Survey Hub India. By accessing and using this website, you agree to these Terms and Conditions. Please read them carefully.

1. About This Website

Paid Survey Hub India (paidsurveyhub.in) is a free, publicly accessible information directory. We list and describe paid online survey websites that accept Indian members. We are not a survey company, not a paid membership service, and we do not conduct surveys ourselves.

Access to this directory is completely free. No registration, no membership fee, and no personal information is required to browse our content.

2. Acceptance of Terms

By accessing paidsurveyhub.in, you acknowledge that you have read, understood, and agree to be bound by these Terms and Conditions. If you do not agree, please do not use this website.

3. Who May Use This Website

This website may be used by anyone who:

  • Is at least 18 years of age
  • Uses the website for lawful purposes only
  • Does not attempt to misuse, disrupt, or damage the website or its infrastructure

4. Nature of Our Service

Paid Survey Hub India provides:

  • A curated directory of paid survey websites verified for Indian accessibility
  • Descriptions, quick facts, and user reviews for listed platforms
  • General information and guidance for survey takers in India

We do not provide:

  • Survey participation (we are not a survey panel)
  • Guaranteed earnings of any kind
  • Endorsement of any listed platform beyond our verification criteria
  • Support for issues arising from third-party survey sites

5. Accuracy of Information

We make reasonable efforts to ensure information in our directory is accurate and current. However:

  • Survey site payment policies, minimum thresholds, and terms change without notice
  • We cannot guarantee the ongoing legitimacy or payment practices of any listed platform
  • Verification is performed at the time of listing — conditions may have changed since
  • You should always do your own research before registering with any survey site

6. Third-Party Survey Websites

This website contains links to third-party survey platforms. When you click through to any listed survey site:

  • You are leaving paidsurveyhub.in and entering a website we do not control
  • Each platform has its own terms, privacy policy, and earning conditions
  • Any issues with earnings, payments, account suspension, or data use are between you and the survey site
  • We are not responsible for and take no liability for your experiences with third-party platforms

Disclosure: Relevant Reflex (relevantreflex.com), listed as our #1 recommended platform, is owned by the same team as Paid Survey Hub India. This relationship is disclosed clearly on our site. All other listings are independent and we receive no compensation from them for being listed.

7. User Reviews

We may display user-submitted reviews of listed survey sites. By submitting a review:

  • You confirm the review is based on your genuine personal experience
  • You grant us a non-exclusive licence to display your review on this website
  • You must not submit false, defamatory, or misleading reviews
  • We reserve the right to moderate, edit, or remove reviews at our discretion

8. Prohibited Activities

You must not:

  • Attempt to hack, disrupt, or gain unauthorised access to any part of this website
  • Submit spam, abusive content, or deliberately false reviews
  • Use automated tools to scrape or copy our directory content without permission
  • Misrepresent your affiliation with any survey company or our platform

9. Intellectual Property

All original content on this website — including text, design, and layout — is the property of Paid Survey Hub India. Survey site names, logos, and descriptions belong to their respective owners and are used for informational and editorial purposes only.

You may not reproduce, distribute, or create derivative works from our directory content without written permission.

10. Limitation of Liability

To the maximum extent permitted by Indian law, Paid Survey Hub India shall not be liable for:

  • Any earnings loss, payment disputes, or account issues with third-party survey sites
  • Inaccuracies in survey site information that arise after the time of verification
  • Any indirect, incidental, or consequential damages arising from use of this website
  • Decisions made based on information contained in this directory

11. Changes to These Terms

We reserve the right to update these Terms and Conditions at any time. The "Last Updated" date reflects the most recent revision. Continued use of the website after changes constitutes acceptance.

12. Governing Law

These Terms are governed by the laws of India. Any disputes arising from use of this website shall be subject to the jurisdiction of courts in Tamil Nadu, India.

13. Contact Us

If you have any questions about these Terms, please contact us:

-------------------- END OF FILE -------------------- ### FILE 11: PSH IN/assets/style.css - Type: CSS - Size: 32.97 KB - Path: PSH IN/assets - Name: style.css ------------------------------------------------------------ /* ================================================================ PaidSurveyHub India — Premium Stylesheet v2 Design: Sharp Editorial — Emerald & Slate Fonts: Plus Jakarta Sans (headings) + Nunito (body) ================================================================ */ @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Nunito:wght@400;500;600;700&display=swap'); /* ── Variables ─────────────────────────────────────────────── */ :root { /* Brand */ --emerald: #059669; --emerald-dark: #047857; --emerald-xd: #064e3b; --emerald-light: #d1fae5; --emerald-pale: #f0fdf4; --emerald-mid: #6ee7b7; /* UI Colours */ --slate-900: #0f172a; --slate-800: #1e293b; --slate-700: #334155; --slate-600: #475569; --slate-500: #64748b; --slate-400: #94a3b8; --slate-300: #cbd5e1; --slate-200: #e2e8f0; --slate-100: #f1f5f9; --slate-50: #f8fafc; --white: #ffffff; /* Accent */ --amber: #d97706; --amber-bg: #fef3c7; --blue: #2563eb; --blue-bg: #dbeafe; --red: #dc2626; /* Shadows */ --shadow-xs: 0 1px 2px rgba(0,0,0,.06); --shadow-sm: 0 2px 6px rgba(0,0,0,.07), 0 1px 3px rgba(0,0,0,.05); --shadow-md: 0 6px 18px rgba(0,0,0,.09), 0 2px 6px rgba(0,0,0,.05); --shadow-lg: 0 12px 32px rgba(0,0,0,.1), 0 4px 10px rgba(0,0,0,.06); --shadow-green: 0 8px 24px rgba(5,150,105,.18); /* Radii */ --r-xs: 4px; --r-sm: 8px; --r-md: 12px; --r-lg: 18px; --r-xl: 24px; --r-full: 9999px; /* Typography */ --font-head: 'Plus Jakarta Sans', sans-serif; --font-body: 'Nunito', sans-serif; /* Layout */ --max-w: 1160px; --nav-h: 62px; } /* ── Reset ─────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; scroll-behavior: smooth; -webkit-text-size-adjust: 100%; } body { font-family: var(--font-body); color: var(--slate-800); background: var(--slate-50); line-height: 1.65; min-height: 100vh; display: flex; flex-direction: column; -webkit-font-smoothing: antialiased; } img { max-width: 100%; display: block; } a { color: var(--emerald); text-decoration: none; transition: color .15s; } a:hover { color: var(--emerald-dark); } ul { list-style: none; } button { font-family: var(--font-body); } /* ── Container ─────────────────────────────────────────────── */ .container { width: 100%; max-width: var(--max-w); margin: 0 auto; padding: 0 1.25rem; } /* ── Typography ────────────────────────────────────────────── */ h1,h2,h3,h4,h5 { font-family: var(--font-head); color: var(--slate-900); line-height: 1.22; letter-spacing: -.01em; } h1 { font-size: clamp(1.7rem, 4vw, 2.6rem); font-weight: 800; } h2 { font-size: clamp(1.3rem, 3vw, 1.85rem); font-weight: 700; } h3 { font-size: 1.1rem; font-weight: 700; } h4 { font-size: .97rem; font-weight: 700; } p { color: var(--slate-600); line-height: 1.8; } /* ── Buttons ───────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: .4rem; font-family: var(--font-head); font-weight: 700; font-size: .87rem; padding: .6rem 1.4rem; border-radius: var(--r-sm); border: 2px solid transparent; cursor: pointer; transition: all .18s cubic-bezier(.4,0,.2,1); white-space: nowrap; text-decoration: none; letter-spacing: .01em; } .btn-primary { background: var(--emerald); color: #fff; border-color: var(--emerald); box-shadow: var(--shadow-green); } .btn-primary:hover { background: var(--emerald-dark); border-color: var(--emerald-dark); color: #fff; transform: translateY(-1px); box-shadow: 0 12px 28px rgba(5,150,105,.25); } .btn-outline { background: transparent; color: var(--emerald); border-color: var(--emerald); } .btn-outline:hover { background: var(--emerald); color: #fff; } .btn-ghost { background: var(--slate-100); color: var(--slate-700); border-color: var(--slate-200); } .btn-ghost:hover { background: var(--slate-200); color: var(--slate-900); } .btn-white { background: #fff; color: var(--emerald-dark); border-color: #fff; font-weight: 700; } .btn-white:hover { background: var(--emerald-light); color: var(--emerald-xd); } .btn-sm { padding: .38rem .85rem; font-size: .8rem; } .btn-lg { padding: .75rem 1.85rem; font-size: .95rem; } .btn-xl { padding: .9rem 2.25rem; font-size: 1rem; } .btn-block { display: flex; width: 100%; } /* ── Badges ────────────────────────────────────────────────── */ .badge { display: inline-flex; align-items: center; gap: .2rem; font-family: var(--font-head); font-size: .68rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; padding: .2rem .65rem; border-radius: var(--r-full); } .badge-emerald { background: var(--emerald-light); color: var(--emerald-xd); } .badge-amber { background: var(--amber-bg); color: #78350f; } .badge-blue { background: var(--blue-bg); color: #1e40af; } .badge-slate { background: var(--slate-100); color: var(--slate-600); } .badge-india { background: #fff7ed; color: #9a3412; } /* ── Notice Bar ────────────────────────────────────────────── */ .notice-bar { background: var(--emerald-xd); padding: .48rem 0; text-align: center; } .notice-bar p { font-size: .78rem; color: var(--emerald-light); font-family: var(--font-head); font-weight: 500; } .notice-bar a { color: var(--emerald-mid); font-weight: 700; } .notice-bar a:hover { color: #fff; } /* ── Navigation ────────────────────────────────────────────── */ .site-nav { background: var(--white); border-bottom: 1px solid var(--slate-200); position: sticky; top: 0; z-index: 100; box-shadow: 0 1px 12px rgba(15,23,42,.07); } .nav-inner { display: flex; align-items: center; justify-content: space-between; height: var(--nav-h); gap: 1rem; } .nav-logo { font-family: var(--font-head); font-weight: 800; font-size: 1.18rem; color: var(--slate-900); white-space: nowrap; text-decoration: none; display: flex; align-items: center; gap: .3rem; } .nav-logo-icon { width: 32px; height: 32px; background: var(--emerald); border-radius: var(--r-xs); display: flex; align-items: center; justify-content: center; font-size: 1rem; flex-shrink: 0; } .nav-logo span.accent { color: var(--emerald); } .nav-links { display: flex; align-items: center; gap: .25rem; flex: 1; justify-content: center; } .nav-links a { font-family: var(--font-head); font-size: .84rem; font-weight: 600; color: var(--slate-600); padding: .4rem .75rem; border-radius: var(--r-sm); transition: all .15s; text-decoration: none; } .nav-links a:hover, .nav-links a.active { color: var(--emerald); background: var(--emerald-pale); } .nav-actions { display: flex; align-items: center; gap: .5rem; } .nav-hamburger { display: none; background: none; border: 1.5px solid var(--slate-200); border-radius: var(--r-sm); cursor: pointer; padding: .4rem .5rem; color: var(--slate-600); } .nav-hamburger svg { width: 18px; height: 18px; } /* ── Hero ──────────────────────────────────────────────────── */ .hero { background: var(--emerald-xd); padding: 3.75rem 0 3rem; position: relative; overflow: hidden; } .hero::after { content: ''; position: absolute; bottom: -2px; left: 0; right: 0; height: 40px; background: var(--slate-50); clip-path: ellipse(55% 100% at 50% 100%); } .hero-inner { position: relative; text-align: center; max-width: 740px; margin: 0 auto; } .hero h1 { color: #fff; margin-bottom: .6rem; } .hero p { color: rgba(255,255,255,.8); font-size: 1.02rem; margin-bottom: 1.75rem; max-width: 520px; margin-left: auto; margin-right: auto; } .hero-search { max-width: 500px; margin: 0 auto 1.5rem; display: flex; background: #fff; border-radius: var(--r-sm); box-shadow: var(--shadow-lg); overflow: hidden; border: 2px solid transparent; transition: border-color .2s; } .hero-search:focus-within { border-color: var(--emerald-mid); } .hero-search input { flex: 1; padding: .75rem 1.1rem; border: none; outline: none; font-family: var(--font-body); font-size: .93rem; color: var(--slate-800); background: transparent; } .hero-search button { background: var(--emerald); color: #fff; border: none; cursor: pointer; padding: 0 1.25rem; font-family: var(--font-head); font-size: .84rem; font-weight: 700; transition: background .15s; white-space: nowrap; } .hero-search button:hover { background: var(--emerald-dark); } .hero-tags { display: flex; justify-content: center; gap: .5rem; flex-wrap: wrap; margin-bottom: 2rem; } .hero-tag { font-size: .78rem; font-weight: 600; color: rgba(255,255,255,.75); background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.15); padding: .22rem .7rem; border-radius: var(--r-full); cursor: pointer; transition: all .15s; text-decoration: none; } .hero-tag:hover { background: rgba(255,255,255,.2); color: #fff; } .hero-stats { display: flex; justify-content: center; gap: 0; margin-top: 2.5rem; padding-top: 2rem; border-top: 1px solid rgba(255,255,255,.12); flex-wrap: wrap; } .hero-stat { text-align: center; padding: 0 2rem; } .hero-stat + .hero-stat { border-left: 1px solid rgba(255,255,255,.12); } .hero-stat strong { display: block; font-family: var(--font-head); font-size: 1.7rem; font-weight: 800; color: #fff; line-height: 1; margin-bottom: .2rem; } .hero-stat span { font-size: .73rem; color: rgba(255,255,255,.6); text-transform: uppercase; letter-spacing: .06em; } /* ── Filter Bar ────────────────────────────────────────────── */ .filter-bar { background: var(--white); border-bottom: 1px solid var(--slate-200); padding: .7rem 0; position: sticky; top: var(--nav-h); z-index: 90; } .filter-inner { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; } .filter-label { font-family: var(--font-head); font-size: .72rem; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; color: var(--slate-400); white-space: nowrap; } .filter-btns { display: flex; gap: .35rem; flex-wrap: wrap; } .filter-btn { font-family: var(--font-head); font-size: .78rem; font-weight: 700; padding: .32rem .9rem; border-radius: var(--r-full); border: 1.5px solid var(--slate-200); background: var(--white); color: var(--slate-600); cursor: pointer; transition: all .15s; white-space: nowrap; text-decoration: none; } .filter-btn:hover { border-color: var(--emerald); color: var(--emerald); } .filter-btn.active { background: var(--emerald); border-color: var(--emerald); color: #fff; } .filter-count { margin-left: auto; font-size: .78rem; color: var(--slate-400); white-space: nowrap; } /* ── Main Content ──────────────────────────────────────────── */ main { flex: 1; padding: 1.75rem 0 3.5rem; } .section-divider { display: flex; align-items: center; gap: .75rem; font-family: var(--font-head); font-size: .72rem; font-weight: 800; text-transform: uppercase; letter-spacing: .08em; color: var(--slate-500); margin: 1.75rem 0 1.1rem; } .section-divider::before, .section-divider::after { content: ''; flex: 1; height: 1px; background: var(--slate-200); } .section-divider::before { flex: 0 0 0; } /* ── Featured Card ─────────────────────────────────────────── */ .featured-wrap { background: linear-gradient(135deg, var(--emerald-xd) 0%, #065f46 100%); border-radius: var(--r-lg); padding: 2.5rem; display: grid; grid-template-columns: auto 1fr; gap: 2.25rem; align-items: center; position: relative; overflow: hidden; box-shadow: var(--shadow-green); margin-bottom: 2rem; } .featured-wrap::before { content: ''; position: absolute; top: -40px; right: -40px; width: 220px; height: 220px; background: radial-gradient(circle, rgba(110,231,183,.15) 0%, transparent 70%); pointer-events: none; } .featured-ribbon { position: absolute; top: 18px; right: -26px; background: var(--amber); color: #fff; font-family: var(--font-head); font-size: .62rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; padding: .22rem 2.5rem; transform: rotate(45deg); } .featured-logo { width: 88px; height: 88px; border-radius: var(--r-md); object-fit: contain; background: rgba(255,255,255,.95); padding: .6rem; border: 2px solid rgba(255,255,255,.2); flex-shrink: 0; } .featured-body { display: flex; flex-direction: column; gap: .75rem; } .featured-body h2 { color: #fff; font-size: 1.45rem; margin: 0; } .featured-body > p { color: rgba(255,255,255,.78); font-size: .88rem; margin: 0; line-height: 1.7; } .featured-pills { display: flex; flex-wrap: wrap; gap: .4rem; margin: 0; } .featured-pill { font-family: var(--font-head); font-size: .72rem; font-weight: 700; padding: .22rem .65rem; border-radius: var(--r-full); background: rgba(255,255,255,.12); color: rgba(255,255,255,.9); border: 1px solid rgba(255,255,255,.18); } .featured-pill.upi { background: rgba(110,231,183,.2); color: var(--emerald-mid); border-color: rgba(110,231,183,.25); } .featured-actions { display: flex; gap: .65rem; flex-wrap: wrap; } .featured-rating { margin-top: .85rem; font-size: .8rem; color: rgba(255,255,255,.6); } .featured-rating strong { color: var(--emerald-mid); } /* ── Survey Grid ───────────────────────────────────────────── */ .survey-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 1.1rem; } .survey-grid-2 { grid-template-columns: repeat(2,1fr); } /* ── Survey Card ───────────────────────────────────────────── */ .survey-card { background: var(--white); border: 1.5px solid var(--slate-200); border-radius: var(--r-md); padding: 1.25rem; display: flex; flex-direction: column; transition: box-shadow .22s cubic-bezier(.4,0,.2,1), transform .22s, border-color .2s; cursor: pointer; } .survey-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-4px); border-color: var(--emerald); } .card-head { display: flex; align-items: flex-start; gap: .85rem; margin-bottom: .85rem; } .card-logo { width: 50px; height: 50px; flex-shrink: 0; border: 1.5px solid var(--slate-200); border-radius: var(--r-sm); object-fit: contain; padding: .3rem; background: var(--white); transition: border-color .2s; } .survey-card:hover .card-logo { border-color: var(--emerald); } .card-title-area { flex: 1; min-width: 0; } .card-title-area h4 { margin-bottom: .15rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .card-rank { font-family: var(--font-head); font-size: .65rem; font-weight: 800; text-transform: uppercase; letter-spacing: .06em; color: var(--emerald); } .card-desc { font-size: .82rem; color: var(--slate-500); line-height: 1.65; flex: 1; margin-bottom: .85rem; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } .card-foot { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: .4rem; margin-top: auto; padding-top: .75rem; border-top: 1px solid var(--slate-100); } .card-stars { color: var(--amber); font-size: .82rem; letter-spacing: -.03em; } .card-rev { font-size: .73rem; color: var(--slate-400); } .card-link { font-family: var(--font-head); font-size: .78rem; font-weight: 700; color: var(--emerald); display: flex; align-items: center; gap: .2rem; transition: gap .15s; } .card-link:hover { gap: .45rem; } .card-link svg { width: 13px; height: 13px; } /* ── Ranked 2-col cards ────────────────────────────────────── */ .ranked-card { border: 2px solid var(--emerald-light); background: var(--emerald-pale); } .ranked-card:hover { border-color: var(--emerald); } /* ── Info Strip ────────────────────────────────────────────── */ .info-strip { display: grid; grid-template-columns: repeat(3,1fr); gap: 1rem; margin: 2.5rem 0 1.5rem; } .info-item { background: var(--white); border: 1.5px solid var(--slate-200); border-radius: var(--r-md); padding: 1.5rem; text-align: center; transition: box-shadow .2s; } .info-item:hover { box-shadow: var(--shadow-sm); } .info-emoji { font-size: 2rem; margin-bottom: .65rem; display: block; } .info-item h3 { font-size: .97rem; margin-bottom: .35rem; } .info-item p { font-size: .83rem; } /* ── CTA Section ───────────────────────────────────────────── */ .cta-section { background: linear-gradient(135deg, var(--emerald-xd), var(--emerald-dark)); border-radius: var(--r-lg); padding: 3rem 2.5rem; text-align: center; margin: 2rem 0; position: relative; overflow: hidden; } .cta-section::before { content: ''; position: absolute; inset: 0; background: url("data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ffffff' fill-opacity='0.03'%3E%3Ccircle cx='20' cy='20' r='3'/%3E%3C/g%3E%3C/svg%3E"); } .cta-section h2 { color: #fff; position: relative; } .cta-section p { color: rgba(255,255,255,.8); position: relative; margin-bottom: 1.5rem; } /* ── Page Card ─────────────────────────────────────────────── */ .page-wrap { padding: 1.5rem 0 3rem; } .page-card { background: var(--white); border: 1.5px solid var(--slate-200); border-radius: var(--r-lg); padding: 2.75rem 3rem; margin-bottom: 1.5rem; } .page-card h1 { margin-bottom: 1.5rem; } .page-card h2 { font-size: 1.15rem; margin: 2rem 0 .65rem; color: var(--emerald-dark); } .page-card h3 { font-size: 1rem; margin: 1.5rem 0 .5rem; } .page-card p { font-size: .9rem; margin-bottom: .9rem; } .page-card ul { margin: .65rem 0 1rem 1.4rem; list-style: disc; } .page-card ul li { margin-bottom: .4rem; font-size: .9rem; color: var(--slate-600); } .page-intro { font-size: 1.05rem !important; color: var(--slate-700) !important; font-weight: 500; line-height: 1.75 !important; } .page-lead { background: var(--emerald-pale); border-left: 3px solid var(--emerald); border-radius: 0 var(--r-sm) var(--r-sm) 0; padding: 1rem 1.25rem; margin-bottom: 1.75rem; } .page-lead p { color: var(--emerald-xd); font-size: .9rem; margin: 0; font-weight: 500; } /* ── Breadcrumb ────────────────────────────────────────────── */ .breadcrumb { display: flex; align-items: center; gap: .35rem; font-size: .8rem; color: var(--slate-400); padding: .65rem 0; flex-wrap: wrap; } .breadcrumb a { color: var(--emerald); font-weight: 500; } .breadcrumb-sep { color: var(--slate-300); } /* ── Detail Page ───────────────────────────────────────────── */ .detail-hero-card { background: var(--white); border: 1.5px solid var(--slate-200); border-radius: var(--r-lg); padding: 2rem; display: flex; align-items: flex-start; gap: 1.75rem; margin-bottom: 1.5rem; flex-wrap: wrap; } .detail-logo { width: 100px; height: 100px; border: 1.5px solid var(--slate-200); border-radius: var(--r-md); padding: .75rem; object-fit: contain; flex-shrink: 0; } .detail-info { flex: 1; min-width: 240px; } .detail-meta { display: flex; flex-wrap: wrap; gap: .35rem; margin: .6rem 0; } .detail-actions { display: flex; gap: .65rem; flex-wrap: wrap; margin-top: 1rem; } .detail-grid { display: grid; grid-template-columns: 1fr 340px; gap: 1.5rem; align-items: start; } .detail-section { background: var(--white); border: 1.5px solid var(--slate-200); border-radius: var(--r-md); padding: 1.6rem; margin-bottom: 1.25rem; } .detail-section h3 { margin-bottom: .85rem; padding-bottom: .6rem; border-bottom: 1px solid var(--slate-100); } .detail-section p { font-size: .88rem; } .quick-facts { display: grid; grid-template-columns: 1fr 1fr; gap: .5rem .75rem; } .qf-item {} .qf-label { font-family: var(--font-head); font-size: .7rem; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--slate-400); margin-bottom: .1rem; } .qf-val { font-size: .88rem; font-weight: 600; color: var(--slate-800); } /* ── Alerts ────────────────────────────────────────────────── */ .alert { border-radius: var(--r-sm); padding: .85rem 1.1rem; margin-bottom: 1rem; font-size: .87rem; line-height: 1.6; } .alert-success { background: var(--emerald-light); color: var(--emerald-xd); border: 1px solid #6ee7b7; } .alert-error { background: #fee2e2; color: #991b1b; border: 1px solid #fca5a5; } .alert-info { background: var(--blue-bg); color: #1e40af; border: 1px solid #93c5fd; } .alert-warning { background: var(--amber-bg); color: #78350f; border: 1px solid #fcd34d; } /* ── Forms ─────────────────────────────────────────────────── */ .form-group { margin-bottom: 1.1rem; } .form-group label { display: block; font-family: var(--font-head); font-size: .82rem; font-weight: 700; margin-bottom: .4rem; color: var(--slate-700); } .form-control { width: 100%; padding: .68rem 1rem; border: 1.5px solid var(--slate-300); border-radius: var(--r-sm); font-family: var(--font-body); font-size: .9rem; color: var(--slate-800); background: var(--white); transition: border-color .15s, box-shadow .15s; outline: none; } .form-control:focus { border-color: var(--emerald); box-shadow: 0 0 0 3px rgba(5,150,105,.1); } textarea.form-control { resize: vertical; min-height: 110px; } /* ── Footer ────────────────────────────────────────────────── */ .site-footer { background: var(--slate-900); color: rgba(255,255,255,.6); padding: 3rem 0 1.75rem; margin-top: auto; } .footer-grid { display: grid; grid-template-columns: 2.2fr 1fr 1fr 1fr; gap: 2rem; margin-bottom: 2.75rem; } .footer-brand .logo-text { font-family: var(--font-head); font-weight: 800; font-size: 1.1rem; color: #fff; display: flex; align-items: center; gap: .4rem; margin-bottom: .75rem; } .footer-brand .logo-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--emerald); display: inline-block; } .footer-brand p { font-size: .83rem; line-height: 1.75; max-width: 290px; } .footer-brand .footer-email { font-size: .82rem; color: rgba(255,255,255,.5); margin-top: .6rem; } .footer-brand .footer-email a { color: var(--emerald); } .footer-col h4 { font-family: var(--font-head); font-size: .82rem; font-weight: 800; color: #fff; text-transform: uppercase; letter-spacing: .07em; margin-bottom: 1rem; } .footer-col ul li { margin-bottom: .42rem; } .footer-col ul li a { font-size: .83rem; color: rgba(255,255,255,.55); transition: color .15s; } .footer-col ul li a:hover { color: #fff; } .footer-col ul li a.footer-featured { color: var(--emerald-mid); font-weight: 600; } .footer-bottom { border-top: 1px solid rgba(255,255,255,.08); padding-top: 1.5rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: .75rem; } .footer-bottom-links { display: flex; gap: 1.5rem; } .footer-bottom p, .footer-bottom a { font-size: .78rem; color: rgba(255,255,255,.4); } .footer-bottom a:hover { color: rgba(255,255,255,.8); } /* ── About page specifics ──────────────────────────────────── */ .feature-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 1rem; margin: 1.5rem 0; } .feature-item { background: var(--slate-50); border: 1.5px solid var(--slate-200); border-radius: var(--r-md); padding: 1.25rem; } .feature-item .fi-icon { font-size: 1.5rem; margin-bottom: .5rem; } .feature-item h4 { margin-bottom: .3rem; font-size: .95rem; } .feature-item p { font-size: .84rem; } .audience-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: .75rem; margin: 1.25rem 0; } .audience-card { text-align: center; background: var(--emerald-pale); border: 1.5px solid var(--emerald-light); border-radius: var(--r-md); padding: 1.25rem .75rem; } .audience-card .ac-icon { font-size: 1.6rem; margin-bottom: .4rem; } .audience-card h4 { font-size: .9rem; color: var(--emerald-xd); } /* ── FAQ specifics ─────────────────────────────────────────── */ .faq-item { border: 1.5px solid var(--slate-200); border-radius: var(--r-md); margin-bottom: .65rem; overflow: hidden; } .faq-q { padding: 1rem 1.25rem; cursor: pointer; font-family: var(--font-head); font-size: .92rem; font-weight: 700; color: var(--slate-800); display: flex; justify-content: space-between; align-items: center; transition: background .15s; user-select: none; } .faq-q:hover { background: var(--slate-50); } .faq-q.open { color: var(--emerald); background: var(--emerald-pale); border-bottom: 1px solid var(--emerald-light); } .faq-q .faq-icon { font-size: .9rem; transition: transform .25s; flex-shrink: 0; margin-left: 1rem; } .faq-q.open .faq-icon { transform: rotate(180deg); } .faq-a { padding: 0 1.25rem; max-height: 0; overflow: hidden; transition: max-height .35s ease, padding .3s; } .faq-a.open { padding: 1rem 1.25rem; max-height: 500px; } .faq-a p { font-size: .88rem; margin: 0; } /* ── Misc utilities ────────────────────────────────────────── */ .mt-1 { margin-top: .5rem; } .mt-2 { margin-top: 1rem; } .mt-3 { margin-top: 1.75rem; } .mb-1 { margin-bottom: .5rem; } .mb-2 { margin-bottom: 1rem; } .text-center { text-align: center; } .text-emerald { color: var(--emerald); } .text-muted { color: var(--slate-500); } .fw-700 { font-weight: 700; } .font-head { font-family: var(--font-head); } .hidden { display: none; } /* ── Responsive ────────────────────────────────────────────── */ @media (max-width: 1024px) { .survey-grid { grid-template-columns: repeat(2,1fr); } .detail-grid { grid-template-columns: 1fr; } .footer-grid { grid-template-columns: 1fr 1fr; gap: 1.5rem; } .audience-grid { grid-template-columns: repeat(2,1fr); } } @media (max-width: 768px) { .nav-links, .nav-actions .btn:not(.nav-mobile-cta) { display: none; } .nav-links.open { display: flex; flex-direction: column; position: absolute; top: calc(var(--nav-h) + 1px); left: 0; right: 0; background: var(--white); border-bottom: 1.5px solid var(--slate-200); padding: .75rem 1.25rem; gap: .25rem; z-index: 99; box-shadow: var(--shadow-md); } .nav-links.open a { padding: .6rem .85rem; border-radius: var(--r-sm); } .nav-hamburger { display: flex; align-items: center; } .featured-wrap { grid-template-columns: 1fr; } .featured-ribbon { display: none; } /* ── PATCH: Additional fixes ──────────────────────────────── */ /* Card logo — bigger on all screens */ .card-logo { width: 64px !important; height: 64px !important; padding: .4rem !important; } /* Info strip — fix emoji size and card spacing */ .info-strip { margin: 4rem 0 2.5rem !important; gap: 1.5rem !important; } .info-item { padding: 2.5rem 2rem !important; border-radius: var(--r-lg) !important; } .info-item h3 { font-size: 1.1rem !important; margin-bottom: .5rem !important; } .info-item p { font-size: .9rem !important; line-height: 1.7 !important; } .info-emoji { font-size: 2.75rem !important; margin-bottom: 1rem !important; display: block; line-height: 1; } /* CTA section — fix button and spacing */ .cta-section { margin: 4rem 0 2rem !important; padding: 4rem 3rem !important; } .cta-section h2 { font-size: 2rem !important; } .cta-section h2 { margin-bottom: .6rem !important; } .cta-section p { max-width: 520px; margin: 0 auto 1.75rem !important; } .cta-section .btn-white { display: inline-flex !important; width: auto !important; padding: .85rem 2.25rem !important; font-size: .98rem !important; box-shadow: 0 4px 18px rgba(0,0,0,.15); } /* FAQ page styles */ .faq-page-wrap { max-width: 820px; margin: 0 auto; padding: 2.5rem 1.25rem; } .faq-page-title { margin-bottom: .5rem; } .faq-page-subtitle { font-size: 1.05rem; color: var(--slate-500); margin-bottom: 2.5rem; } .faq-group { margin-bottom: 2.5rem; } .faq-group-title { font-family: var(--font-head); font-size: .72rem; font-weight: 800; text-transform: uppercase; letter-spacing: .1em; color: var(--slate-400); margin-bottom: 1rem; padding-bottom: .5rem; border-bottom: 1px solid var(--slate-200); display: flex; align-items: center; gap: .5rem; } .faq-item { border: 1.5px solid var(--slate-200); border-radius: var(--r-md); margin-bottom: .55rem; overflow: hidden; background: var(--white); } .faq-q { padding: 1.1rem 1.35rem; cursor: pointer; font-family: var(--font-head); font-size: .93rem; font-weight: 700; color: var(--slate-800); display: flex; justify-content: space-between; align-items: center; transition: background .15s; user-select: none; gap: 1rem; } .faq-q .faq-icon-q { color: var(--emerald); font-size: .85rem; flex-shrink: 0; } .faq-q:hover { background: var(--slate-50); } .faq-q.open { background: var(--emerald-pale); color: var(--emerald-xd); border-bottom: 1px solid var(--emerald-light); } .faq-q .faq-chevron { font-size: .8rem; transition: transform .25s; flex-shrink: 0; } .faq-q.open .faq-chevron { transform: rotate(180deg); } .faq-a { max-height: 0; overflow: hidden; transition: max-height .35s ease, padding .3s; padding: 0 1.35rem; } .faq-a.open { max-height: 600px; padding: .9rem 1.35rem 1.1rem; } .faq-a p { font-size: .88rem; color: var(--slate-600); margin: 0; line-height: 1.8; } /* Contact page */ .contact-wrap { max-width: 620px; margin: 0 auto; padding: 2.5rem 1.25rem; } .contact-card { background: var(--white); border: 1.5px solid var(--slate-200); border-radius: var(--r-lg); padding: 2.5rem; } .contact-info-strip { display: grid; grid-template-columns: 1fr 1fr; gap: .75rem; margin: 1.75rem 0; } .contact-info-item { background: var(--slate-50); border: 1.5px solid var(--slate-200); border-radius: var(--r-sm); padding: 1rem; } .contact-info-item .ci-label { font-size: .7rem; font-weight: 800; text-transform: uppercase; letter-spacing: .06em; color: var(--slate-400); margin-bottom: .3rem; } .contact-info-item .ci-val { font-size: .87rem; font-weight: 600; color: var(--slate-800); } .contact-info-item a { color: var(--emerald); } .contact-divider { display: flex; align-items: center; gap: .75rem; margin: 1.75rem 0; } .contact-divider::before, .contact-divider::after { content:''; flex:1; height:1px; background:var(--slate-200); } .contact-divider span { font-size: .75rem; font-weight: 700; color: var(--slate-400); text-transform: uppercase; letter-spacing: .06em; } @media (max-width: 640px) { .contact-info-strip { grid-template-columns: 1fr; } .contact-card { padding: 1.5rem; } .card-logo { width: 52px !important; height: 52px !important; } } /* ── COLOUR SCHEME PATCH ───────────────────────────────────── */ /* Ranked cards #2-5: Rich blue tint — clearly different from green */ .ranked-card { background: #eff6ff !important; border: 2px solid #93c5fd !important; } .ranked-card:hover { border-color: #3b82f6 !important; box-shadow: 0 12px 32px rgba(59,130,246,.15) !important; } .ranked-card .card-rank { color: #2563eb !important; } .ranked-card .card-link { color: #2563eb !important; } /* Unranked cards: Warm white with clear visible border */ .plain-card { background: #fffdf7 !important; border: 1.5px solid #e5e0d5 !important; } .plain-card:hover { border-color: var(--emerald) !important; background: var(--white) !important; } /* Featured actions handled in main section */ /* Nav actions — no join free button now, just hamburger */ .nav-actions { display: flex; align-items: center; gap: .5rem; } -------------------- END OF FILE -------------------- ### FILE 12: PSH IN/config/config.php - Type: PHP - Size: 2.62 KB - Path: PSH IN/config - Name: config.php ------------------------------------------------------------ connect_error) { die("Connection failed: " . $conn->connect_error); } $conn->set_charset("utf8mb4"); } catch (Exception $e) { die("Database connection error: " . $e->getMessage()); } // Start session if not already started if (session_status() === PHP_SESSION_NONE) { session_start(); } // Helper function to check if user is logged in (member) function is_member_logged_in() { return isset($_SESSION['member_id']); } // Helper function to check if admin is logged in function is_admin_logged_in() { return isset($_SESSION['admin_id']); } // Helper function to redirect function redirect($url) { header("Location: " . $url); exit(); } // Helper function to sanitize input function clean_input($data) { global $conn; $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $conn->real_escape_string($data); } // Helper function to send email function send_email($to, $subject, $message) { $headers = "From: " . SMTP_FROM_NAME . " <" . SMTP_FROM . ">\r\n"; $headers .= "Reply-To: " . SMTP_FROM . "\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; return mail($to, $subject, $message, $headers); } // Get setting value function get_setting($key) { global $conn; $key = clean_input($key); $sql = "SELECT setting_value FROM settings WHERE setting_key = '$key'"; $result = $conn->query($sql); if ($result && $result->num_rows > 0) { $row = $result->fetch_assoc(); return $row['setting_value']; } return ''; } // Update setting value function update_setting($key, $value) { global $conn; $key = clean_input($key); $value = clean_input($value); $sql = "UPDATE settings SET setting_value = '$value' WHERE setting_key = '$key'"; return $conn->query($sql); } ?> -------------------- END OF FILE -------------------- ### FILE 13: PSH IN/includes/footer.php - Type: PHP - Size: 2.98 KB - Path: PSH IN/includes - Name: footer.php ------------------------------------------------------------ -------------------- END OF FILE -------------------- ### FILE 14: PSH IN/includes/header.php - Type: PHP - Size: 5.74 KB - Path: PSH IN/includes - Name: header.php ------------------------------------------------------------ <?php echo isset($page_title) ? htmlspecialchars($page_title) : 'Best Paid Survey Sites India 2026 | PaidSurveyHub'; ?> -------------------- END OF FILE -------------------- ### FILE 15: PSH IN/management/add-survey.php - Type: PHP - Size: 6.29 KB - Path: PSH IN/management - Name: add-survey.php ------------------------------------------------------------ query($check_rank); if ($rank_result->num_rows > 0) { $error = "Rank #$rank is already assigned to another survey"; } } if (empty($error)) { // Handle image upload $allowed_types = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif']; $file_type = $_FILES['image']['type']; if (!in_array($file_type, $allowed_types)) { $error = "Only JPG, PNG, and GIF images are allowed"; } else { $file_extension = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION); $new_filename = uniqid() . '.' . $file_extension; $upload_path = '../uploads/' . $new_filename; if (move_uploaded_file($_FILES['image']['tmp_name'], $upload_path)) { $rank_value = $rank !== NULL ? $rank : 'NULL'; // Insert survey site $sql = "INSERT INTO survey_sites (rank, title, website_link, description, support_contact, image) VALUES ($rank_value, '$title', '$website_link', '$description', '$support_contact', '$new_filename')"; if ($conn->query($sql)) { $success = "Survey site added successfully!"; } else { $error = "Failed to add survey site: " . $conn->error; unlink($upload_path); // Delete uploaded file } } else { $error = "Failed to upload image"; } } } } } $page_title = 'Add Survey Site'; include 'includes/header.php'; ?>
← Back to Dashboard

Add New Survey Site

Rank #1 displays full-width. Ranks #2+ display 2 per row. Unranked sites display 3 per row (randomized).
-------------------- END OF FILE -------------------- ### FILE 16: PSH IN/management/change-password.php - Type: PHP - Size: 4.45 KB - Path: PSH IN/management - Name: change-password.php ------------------------------------------------------------ query($sql); if ($result->num_rows > 0) { $admin = $result->fetch_assoc(); // Verify current password if (password_verify($current_password, $admin['password'])) { // Hash new password $hashed_password = password_hash($new_password, PASSWORD_DEFAULT); // Update password $update_sql = "UPDATE admins SET password = '$hashed_password' WHERE id = $admin_id"; if ($conn->query($update_sql)) { $success = "Password changed successfully!"; // Clear form fields $_POST = array(); } else { $error = "Failed to update password. Please try again."; } } else { $error = "Current password is incorrect"; } } else { $error = "Admin not found"; } } } $page_title = 'Change Password'; include 'includes/header.php'; ?>
← Back to Dashboard

Change Admin Password

Minimum 6 characters

🔒 Password Security Tips

  • Use at least 8 characters (minimum 6 required)
  • Mix uppercase and lowercase letters
  • Include numbers and special characters
  • Don't use common words or personal information
  • Change your password regularly
-------------------- END OF FILE -------------------- ### FILE 17: PSH IN/management/dashboard.php - Type: PHP - Size: 8.75 KB - Path: PSH IN/management - Name: dashboard.php ------------------------------------------------------------ query("SELECT COUNT(*) as c FROM survey_sites")->fetch_assoc()['c']; $ranked_surveys = $conn->query("SELECT COUNT(*) as c FROM survey_sites WHERE rank IS NOT NULL")->fetch_assoc()['c']; $pending_reviews = $conn->query("SELECT COUNT(*) as c FROM survey_reviews WHERE is_approved = 0")->fetch_assoc()['c']; $total_reviews = $conn->query("SELECT COUNT(*) as c FROM survey_reviews WHERE is_approved = 1")->fetch_assoc()['c']; $new_tickets = $conn->query("SELECT COUNT(*) as c FROM contact_messages WHERE ticket_status = 'new'")->fetch_assoc()['c']; $open_tickets = $conn->query("SELECT COUNT(*) as c FROM contact_messages WHERE ticket_status IN ('new','in_progress')")->fetch_assoc()['c']; // Newsletter subscribers table may not exist yet — handle gracefully $active_subs = 0; $today_subs = 0; $subs_check = $conn->query("SHOW TABLES LIKE 'newsletter_subscribers'"); if ($subs_check && $subs_check->num_rows > 0) { $active_subs = $conn->query("SELECT COUNT(*) as c FROM newsletter_subscribers WHERE is_active = 1")->fetch_assoc()['c']; $today_subs = $conn->query("SELECT COUNT(*) as c FROM newsletter_subscribers WHERE DATE(created_at) = CURDATE()")->fetch_assoc()['c']; } // Recent activity $recent_reviews = $conn->query("SELECT r.reviewer_name, r.rating, r.created_at, s.title FROM survey_reviews r JOIN survey_sites s ON r.survey_id = s.id WHERE r.is_approved = 0 ORDER BY r.created_at DESC LIMIT 5"); $recent_tickets = $conn->query("SELECT id, name, email, ticket_status, created_at FROM contact_messages ORDER BY created_at DESC LIMIT 5"); $page_title = 'Admin Dashboard — PaidSurveyHub'; include 'includes/header.php'; ?> -------------------- END OF FILE -------------------- ### FILE 18: PSH IN/management/delete-survey.php - Type: PHP - Size: 858 B - Path: PSH IN/management - Name: delete-survey.php ------------------------------------------------------------ query($sql); if ($result->num_rows > 0) { $survey = $result->fetch_assoc(); // Delete survey from database $delete_sql = "DELETE FROM survey_sites WHERE id = $survey_id"; if ($conn->query($delete_sql)) { // Delete image file $image_path = '../uploads/' . $survey['image']; if (file_exists($image_path)) { unlink($image_path); } } } redirect(SITE_URL . ADMIN_PATH . '/manage-surveys.php'); ?> -------------------- END OF FILE -------------------- ### FILE 19: PSH IN/management/edit-survey.php - Type: PHP - Size: 7.16 KB - Path: PSH IN/management - Name: edit-survey.php ------------------------------------------------------------ query($sql); if ($result->num_rows == 0) { redirect(SITE_URL . ADMIN_PATH . '/manage-surveys.php'); } $survey = $result->fetch_assoc(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $title = clean_input($_POST['title']); $rank = $_POST['rank'] !== '' ? (int)$_POST['rank'] : NULL; $website_link = clean_input($_POST['website_link']); $description = clean_input($_POST['description']); $support_contact = clean_input($_POST['support_contact']); // Validation if (empty($title) || empty($website_link) || empty($description) || empty($support_contact)) { $error = "All fields except rank are required"; } else { // Check if rank already exists for another survey if ($rank !== NULL) { $check_rank = "SELECT id FROM survey_sites WHERE rank = $rank AND id != $survey_id"; $rank_result = $conn->query($check_rank); if ($rank_result->num_rows > 0) { $error = "Rank #$rank is already assigned to another survey"; } } if (empty($error)) { $new_filename = $survey['image']; // Check if new image is uploaded if (isset($_FILES['image']) && $_FILES['image']['error'] == 0) { $allowed_types = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif']; $file_type = $_FILES['image']['type']; if (!in_array($file_type, $allowed_types)) { $error = "Only JPG, PNG, and GIF images are allowed"; } else { $file_extension = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION); $new_filename = uniqid() . '.' . $file_extension; $upload_path = '../uploads/' . $new_filename; if (move_uploaded_file($_FILES['image']['tmp_name'], $upload_path)) { // Delete old image if (file_exists('../uploads/' . $survey['image'])) { unlink('../uploads/' . $survey['image']); } } else { $error = "Failed to upload new image"; } } } if (empty($error)) { $rank_sql = $rank !== NULL ? "rank = $rank," : "rank = NULL,"; // Update survey site $sql = "UPDATE survey_sites SET $rank_sql title = '$title', website_link = '$website_link', description = '$description', support_contact = '$support_contact', image = '$new_filename' WHERE id = $survey_id"; if ($conn->query($sql)) { $success = "Survey site updated successfully!"; // Refresh survey data $result = $conn->query("SELECT * FROM survey_sites WHERE id = $survey_id"); $survey = $result->fetch_assoc(); } else { $error = "Failed to update survey site: " . $conn->error; } } } } } $page_title = 'Edit Survey Site'; include 'includes/header.php'; ?>
← Back to Survey Sites

Edit Survey Site

Rank #1 displays full-width. Ranks #2+ display 2 per row. Unranked sites display 3 per row (randomized).
Current Image
Leave empty to keep current image
-------------------- END OF FILE -------------------- ### FILE 20: PSH IN/management/index.php - Type: PHP - Size: 2.19 KB - Path: PSH IN/management - Name: index.php ------------------------------------------------------------ query($sql); if ($result->num_rows > 0) { $admin = $result->fetch_assoc(); if (password_verify($password, $admin['password'])) { // Set session $_SESSION['admin_id'] = $admin['id']; $_SESSION['admin_username'] = $admin['username']; redirect(SITE_URL . ADMIN_PATH . '/dashboard.php'); } else { $error = "Invalid username or password"; } } else { $error = "Invalid username or password"; } } } $page_title = 'Admin Login'; include 'includes/header.php'; ?>

Admin Login

-------------------- END OF FILE -------------------- ### FILE 21: PSH IN/management/logout.php - Type: PHP - Size: 266 B - Path: PSH IN/management - Name: logout.php ------------------------------------------------------------ query("UPDATE survey_reviews SET is_approved = 1, approved_at = NOW(), approved_by = {$_SESSION['admin_id']} WHERE id = $rid"); $success = 'Review approved and now visible to the public.'; } // Reject / delete if (isset($_GET['reject'])) { $rid = (int)$_GET['reject']; $conn->query("DELETE FROM survey_reviews WHERE id = $rid"); $success = 'Review rejected and deleted.'; } // Bulk actions if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['bulk_ids'])) { $ids = array_map('intval', (array)$_POST['bulk_ids']); $id_str = implode(',', $ids); if ($_POST['bulk_action'] === 'approve') { $conn->query("UPDATE survey_reviews SET is_approved = 1, approved_at = NOW(), approved_by = {$_SESSION['admin_id']} WHERE id IN ($id_str)"); $success = count($ids) . ' review(s) approved.'; } elseif ($_POST['bulk_action'] === 'reject') { $conn->query("DELETE FROM survey_reviews WHERE id IN ($id_str)"); $success = count($ids) . ' review(s) deleted.'; } } // ── FILTERS ────────────────────────────────────────────────── $status_filter = $_GET['status'] ?? 'pending'; $survey_filter = isset($_GET['survey']) ? (int)$_GET['survey'] : 0; $rating_filter = isset($_GET['rating']) ? (int)$_GET['rating'] : 0; $where = ['1=1']; if ($status_filter === 'pending') $where[] = 'r.is_approved = 0'; if ($status_filter === 'approved') $where[] = 'r.is_approved = 1'; if ($survey_filter > 0) $where[] = "r.survey_id = $survey_filter"; if ($rating_filter > 0) $where[] = "r.rating = $rating_filter"; $where_sql = implode(' AND ', $where); $reviews_sql = "SELECT r.*, s.title as survey_title FROM survey_reviews r JOIN survey_sites s ON r.survey_id = s.id WHERE $where_sql ORDER BY r.created_at DESC"; $reviews = $conn->query($reviews_sql); // Stats $pending_count = $conn->query("SELECT COUNT(*) as c FROM survey_reviews WHERE is_approved = 0")->fetch_assoc()['c']; $approved_count = $conn->query("SELECT COUNT(*) as c FROM survey_reviews WHERE is_approved = 1")->fetch_assoc()['c']; $total_count = $pending_count + $approved_count; // All survey sites for filter dropdown $sites_result = $conn->query("SELECT id, title FROM survey_sites ORDER BY title ASC"); $page_title = 'Manage Reviews'; include 'includes/header.php'; ?>

Manage Reviews

Approve, reject, and manage member reviews for all survey sites.

← Dashboard
Pending
Approved
Total
⏳ Pending () ✓ Approved () All
num_rows > 0): ?>
| num_rows; ?> review(s) shown
fetch_assoc()): ?>
Survey Site Reviewer Rating Review Date Status Actions
📍
IP:
/5

chars

✓ Approved ⏳ Pending ✓ Approve ✗ Delete ↗ View
📭

No reviews found

No reviews match your filters.

-------------------- END OF FILE -------------------- ### FILE 23: PSH IN/management/manage-surveys.php - Type: PHP - Size: 10.96 KB - Path: PSH IN/management - Name: manage-surveys.php ------------------------------------------------------------ query($check_rank); if ($rank_result->num_rows > 0) { $error = "Rank #$new_rank is already assigned to another survey"; } } if (empty($error)) { $rank_value = $new_rank !== NULL ? $new_rank : 'NULL'; $update_sql = "UPDATE survey_sites SET rank = $rank_value WHERE id = $survey_id"; if ($conn->query($update_sql)) { $success = "Rank updated successfully!"; } else { $error = "Failed to update rank: " . $conn->error; } } } // Get all survey sites with review stats $sql = "SELECT s.*, COALESCE(AVG(r.rating), 0) as avg_rating, COUNT(r.id) as review_count FROM survey_sites s LEFT JOIN survey_reviews r ON s.id = r.survey_id AND r.is_approved = 1 GROUP BY s.id ORDER BY CASE WHEN s.rank IS NULL THEN 1 ELSE 0 END, s.rank ASC, s.created_at DESC"; $result = $conn->query($sql); $page_title = 'Manage Survey Sites'; include 'includes/header.php'; ?>
← Back to Dashboard

Manage Survey Sites

+ Add New

🏆 Ranking System:
Rank #1: Displays full-width with premium styling
Ranks #2+: Display 2 per row with rank badges
No Rank: Display 3 per row, randomized order
Click the rank field below to edit directly. Leave empty to remove ranking.

num_rows > 0): ?>
fetch_assoc()): ?>
Rank Image Title Reviews Website Link Created Actions

#
<?php echo htmlspecialchars($survey['title']); ?> 0): ?>
() No reviews yet
Visit Site → Edit Delete

Total: num_rows; ?> survey site(s)

No survey sites found. Add your first survey site
-------------------- END OF FILE -------------------- ### FILE 24: PSH IN/management/manage-tickets.php - Type: PHP - Size: 12.78 KB - Path: PSH IN/management - Name: manage-tickets.php ------------------------------------------------------------ query($sql); // Get statistics $stats = [ 'new' => $conn->query("SELECT COUNT(*) as count FROM contact_messages WHERE ticket_status = 'new'")->fetch_assoc()['count'], 'in_progress' => $conn->query("SELECT COUNT(*) as count FROM contact_messages WHERE ticket_status = 'in_progress'")->fetch_assoc()['count'], 'resolved' => $conn->query("SELECT COUNT(*) as count FROM contact_messages WHERE ticket_status = 'resolved'")->fetch_assoc()['count'], 'closed' => $conn->query("SELECT COUNT(*) as count FROM contact_messages WHERE ticket_status = 'closed'")->fetch_assoc()['count'], ]; $page_title = 'Manage Tickets'; include 'includes/header.php'; ?>
← Back to Dashboard

Ticket Management

New
In Progress
Resolved
Closed
Reset
num_rows > 0): ?>
fetch_assoc()): ?>
ID Type Name Email Message Status Date Actions
# Member Visitor
()
100 ? substr($msg, 0, 100) . '...' : $msg; ?> 'background: #ffc107; color: #000;', 'in_progress' => 'background: #17a2b8; color: #fff;', 'resolved' => 'background: #28a745; color: #fff;', 'closed' => 'background: #6c757d; color: #fff;' ]; $status_text = ucfirst(str_replace('_', ' ', $ticket['ticket_status'])); ?> View/Reply

Total: num_rows; ?> ticket(s)

No tickets found matching your criteria.
-------------------- END OF FILE -------------------- ### FILE 25: PSH IN/management/newsletter-subscribers.php - Type: PHP - Size: 16.68 KB - Path: PSH IN/management - Name: newsletter-subscribers.php ------------------------------------------------------------ query("UPDATE newsletter_subscribers SET is_active = 0, unsubscribed_at = NOW() WHERE id = $sid"); $success = 'Subscriber marked as unsubscribed.'; } // Re-subscribe if (isset($_GET['resubscribe'])) { $sid = (int)$_GET['resubscribe']; $conn->query("UPDATE newsletter_subscribers SET is_active = 1, unsubscribed_at = NULL WHERE id = $sid"); $success = 'Subscriber reactivated.'; } // Delete single if (isset($_GET['delete'])) { $sid = (int)$_GET['delete']; $conn->query("DELETE FROM newsletter_subscribers WHERE id = $sid"); $success = 'Subscriber deleted permanently.'; } // Bulk actions if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['bulk_ids'])) { $ids = array_map('intval', (array)$_POST['bulk_ids']); $id_str = implode(',', $ids); if ($_POST['bulk_action'] === 'unsubscribe') { $conn->query("UPDATE newsletter_subscribers SET is_active = 0, unsubscribed_at = NOW() WHERE id IN ($id_str)"); $success = count($ids) . ' subscriber(s) unsubscribed.'; } elseif ($_POST['bulk_action'] === 'delete') { $conn->query("DELETE FROM newsletter_subscribers WHERE id IN ($id_str)"); $success = count($ids) . ' subscriber(s) deleted.'; } } // CSV Export if (isset($_GET['export'])) { $status_exp = $_GET['export'] === 'active' ? 'WHERE is_active = 1' : ''; $exp_result = $conn->query("SELECT email, name, source_survey_name, created_at FROM newsletter_subscribers $status_exp ORDER BY created_at DESC"); header('Content-Type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment; filename="psh_subscribers_' . date('Y-m-d') . '.csv"'); $out = fopen('php://output', 'w'); fputcsv($out, ['Email', 'Name', 'Source Survey', 'Subscribed Date']); while ($row = $exp_result->fetch_assoc()) { fputcsv($out, [$row['email'], $row['name'], $row['source_survey_name'], $row['created_at']]); } fclose($out); exit; } // ── FILTERS ────────────────────────────────────────────────── $status_filter = $_GET['status'] ?? 'active'; $search = isset($_GET['search']) ? $conn->real_escape_string(trim($_GET['search'])) : ''; $where = ['1=1']; if ($status_filter === 'active') $where[] = 'is_active = 1'; if ($status_filter === 'unsubscribed') $where[] = 'is_active = 0'; if (!empty($search)) $where[] = "(email LIKE '%$search%' OR name LIKE '%$search%')"; $where_sql = implode(' AND ', $where); // Pagination $per_page = 30; $page_num = max(1, (int)($_GET['page'] ?? 1)); $offset = ($page_num - 1) * $per_page; $total_rows = $conn->query("SELECT COUNT(*) as c FROM newsletter_subscribers WHERE $where_sql")->fetch_assoc()['c']; $total_pages = ceil($total_rows / $per_page); $subs = $conn->query("SELECT * FROM newsletter_subscribers WHERE $where_sql ORDER BY created_at DESC LIMIT $per_page OFFSET $offset"); // Stats $active_count = $conn->query("SELECT COUNT(*) as c FROM newsletter_subscribers WHERE is_active = 1")->fetch_assoc()['c']; $unsub_count = $conn->query("SELECT COUNT(*) as c FROM newsletter_subscribers WHERE is_active = 0")->fetch_assoc()['c']; $today_count = $conn->query("SELECT COUNT(*) as c FROM newsletter_subscribers WHERE DATE(created_at) = CURDATE()")->fetch_assoc()['c']; $total_all = $active_count + $unsub_count; // Top source surveys $top_sources = $conn->query("SELECT source_survey_name, COUNT(*) as cnt FROM newsletter_subscribers WHERE is_active = 1 AND source_survey_name IS NOT NULL GROUP BY source_survey_name ORDER BY cnt DESC LIMIT 5"); $page_title = 'Newsletter Subscribers'; include 'includes/header.php'; ?>

Newsletter Subscribers

Members who opted in for survey updates via the review form.

📥 Export Active CSV 📥 Export All CSV ← Dashboard
Active
Today
Unsubscribed
Total Ever
num_rows > 0): ?>
Top Survey Pages
fetch_assoc()) $top_rows[] = $tr; $max_cnt = $top_rows[0]['cnt'] ?? 1; foreach ($top_rows as $tr): ?>
| subscriber(s)
num_rows > 0): ?>
fetch_assoc()): ?>
Email Name Source Survey Status Subscribed Actions
✅ Active 🚫 Unsubscribed
🚫 Unsub ✅ Resub 🗑
1): ?>
📭

No subscribers found

Subscribers will appear here as people review survey sites and opt in.

📋 Compliance Note: All subscribers have explicitly opted in via the review form. Always include an unsubscribe link in every marketing email you send. Sending to unsubscribed addresses is a violation of India's IT Act and international email laws (GDPR, CAN-SPAM). Export only active subscribers for campaigns.
-------------------- END OF FILE -------------------- ### FILE 26: PSH IN/management/reply-ticket.php - Type: PHP - Size: 9.29 KB - Path: PSH IN/management - Name: reply-ticket.php ------------------------------------------------------------ query($sql); if ($result->num_rows == 0) { $error = "Invalid or expired ticket link. Please contact support if you need assistance."; } else { $ticket = $result->fetch_assoc(); // Handle form submission if ($_SERVER['REQUEST_METHOD'] === 'POST') { $user_reply = clean_input($_POST['user_reply']); if (empty($user_reply)) { $error = "Please enter your response"; } else { // Append user reply to the message $updated_message = $ticket['message'] . "\n\n--- User Response ---\n" . $user_reply; $updated_message = clean_input($updated_message); // Update ticket with user's response $update_sql = "UPDATE contact_messages SET message = '$updated_message', ticket_status = 'new' WHERE id = $ticket_id"; if ($conn->query($update_sql)) { $success = "Your response has been submitted successfully! Our support team will review and respond to your follow-up question."; // Refresh ticket data $result = $conn->query($sql); $ticket = $result->fetch_assoc(); } else { $error = "Failed to submit response. Please try again."; } } } } } $page_title = 'Respond to Ticket'; ?> <?php echo $page_title; ?> - Paid Survey Hub India
Paid Survey Hub India
⚠️

Access Error

Response Submitted!

📧 What happens next:

  • Our support team will review your follow-up question
  • We will respond to your email within 24 hours
  • You can respond again using the link in our next email

Respond to Support Ticket

Ticket ID: #

Submitted:

'background: #ffc107; color: #000;', 'in_progress' => 'background: #17a2b8; color: #fff;', 'resolved' => 'background: #28a745; color: #fff;', 'closed' => 'background: #6c757d; color: #fff;' ]; $status_text = ucfirst(str_replace('_', ' ', $ticket['ticket_status'])); ?>

Support Team Response:

Replied on:

Your Original Message:

💬 Have a follow-up question?

Type your follow-up message below and our support team will respond to your email.

We will send our response to:
📌 Note: After submitting your follow-up, our support team will review and respond to your email within 24 hours. You will receive another email with our response and a link to continue the conversation if needed.

© Paid Survey Hub India. All rights reserved.

-------------------- END OF FILE -------------------- ### FILE 27: PSH IN/management/view-ticket.php - Type: PHP - Size: 17.27 KB - Path: PSH IN/management - Name: view-ticket.php ------------------------------------------------------------ query($sql); if ($result->num_rows == 0) { redirect(SITE_URL . ADMIN_PATH . '/manage-tickets.php'); } $ticket = $result->fetch_assoc(); // Handle form submission if ($_SERVER['REQUEST_METHOD'] === 'POST') { $admin_reply = clean_input($_POST['admin_reply']); $new_status = clean_input($_POST['ticket_status']); $admin_id = $_SESSION['admin_id']; if (empty($admin_reply)) { $error = "Reply message is required"; } else { // Update ticket $update_sql = "UPDATE contact_messages SET admin_reply = '$admin_reply', ticket_status = '$new_status', replied_at = NOW(), replied_by = $admin_id WHERE id = $ticket_id"; if ($conn->query($update_sql)) { $success = "Reply sent successfully!"; // Check if this is member or visitor $is_member = !empty($ticket['member_id']); // Send email notification to user $email_subject = "Response to Your Query - Ticket #$ticket_id"; if ($is_member) { // Member email (existing format) $email_message = "

Paid Survey Hub - Support Response

Dear " . htmlspecialchars($ticket['name']) . ",

Thank you for contacting us. We have reviewed your query and here is our response:

Your Message:

" . nl2br(htmlspecialchars($ticket['message'])) . "

Our Response:

" . nl2br($admin_reply) . "

Ticket #$ticket_id - Status: " . ucfirst(str_replace('_', ' ', $new_status)) . "

You can view your tickets anytime by logging in to your account and visiting the 'My Tickets' section.

View My Tickets

If you have any further questions, please don't hesitate to contact us again.

Best regards,
Paid Survey Hub Support Team

"; } else { // Visitor email with respond button $response_link = SITE_URL . "/reply-ticket.php?token=" . $ticket['response_token'] . "&id=" . $ticket_id; $email_message = "

Paid Survey Hub - Support Response

Dear " . htmlspecialchars($ticket['name']) . ",

Thank you for contacting us. We have reviewed your query and here is our response:

Your Message:

" . nl2br(htmlspecialchars($ticket['message'])) . "

Our Response:

" . nl2br($admin_reply) . "

Ticket #$ticket_id - Status: " . ucfirst(str_replace('_', ' ', $new_status)) . "

Have a follow-up question?

Click the button below to respond to this ticket and continue the conversation with our support team.

💬 Respond to Ticket

We hope this resolves your query. If you need further assistance, just click the respond button above.

Best regards,
Paid Survey Hub Support Team

Ticket #$ticket_id

"; } send_email($ticket['email'], $email_subject, $email_message); // Refresh ticket data $result = $conn->query($sql); $ticket = $result->fetch_assoc(); } else { $error = "Failed to send reply. Please try again."; } } } $page_title = 'View Ticket'; include 'includes/header.php'; ?>
← Back to Tickets

Ticket #

'background: #ffc107; color: #000;', 'in_progress' => 'background: #17a2b8; color: #fff;', 'resolved' => 'background: #28a745; color: #fff;', 'closed' => 'background: #6c757d; color: #fff;' ]; $status_text = ucfirst(str_replace('_', ' ', $ticket['ticket_status'])); ?>

Ticket Information

Type:

Member Query Visitor Query

Submitted:

Last Reply:

Contact Details

Name

Email

Member Name

Phone

User Message

Your Previous Reply

This reply will be emailed to
Note: Visitor will receive a "Respond" button in the email to continue the conversation.
Cancel
-------------------- END OF FILE -------------------- ### FILE 28: PSH IN/management/includes/footer.php - Type: PHP - Size: 220 B - Path: PSH IN/management/includes - Name: footer.php ------------------------------------------------------------ -------------------- END OF FILE -------------------- ### FILE 29: PSH IN/management/includes/header.php - Type: PHP - Size: 14.09 KB - Path: PSH IN/management/includes - Name: header.php ------------------------------------------------------------ <?php echo isset($page_title) ? htmlspecialchars($page_title) : 'Admin — PaidSurveyHub'; ?> -------------------- END OF FILE -------------------- ================================================================================ ## SUMMARY ================================================================================ Repository contains 29 files total. All file contents have been extracted and are shown above. This repository snapshot was generated on: 2026-04-18 05:40:02 ================================================================================ ## END OF REPOSITORY ================================================================================