Planning Alerts

Introduction

This report is designed for PlanningAlerts.ie, a platform that keeps users informed about Irish planning applications that might impact them. The goal of this analysis is to dive into the website’s usage data, providing valuable insights into user behavior, site performance, and engagement trends. By examining key metrics related to user interactions, this report sheds light on how visitors navigate the site and how factors like device preferences and time intervals shape their online experience.

1. User and Session Analysis

a. Unique Users by Month

  • Monthly Trends: User activity peaks in July, with significant engagement extending into August.

  • Desktop Usage: Desktop access dominates in July and August, indicating a preference for detailed searches and planning applications that benefit from larger screens.

  • Mobile Growth: Mobile browser usage shows steady growth, especially in August, reflecting increased on-the-go engagement.

  • Tablet and App Usage: Tablet and iPhone app usage remain consistently low with minimal month-to-month variation, suggesting limited adoption.

  • Seasonal Insights: Elevated activity during the summer months suggests a heightened interest in planning approvals, property investments, or related activities during this period.

# Load necessary libraries
library(tidyverse)    # Collection of R packages for data science
library(kableExtra)   # For creating complex tables in R Markdown
library(dplyr)        # For data manipulation
library(lubridate)    # For date-time operations
library(ggplot2)      # For data visualization
library(readr)        # For reading CSV files

library(dplyr)
library(stringr)
library(kableExtra)   #For grouping


# Load the data
data <- read_csv("planning_alerts_data.csv", show_col_types = FALSE)

# Data manipulation: Rename and create new columns
data_renamed <- data %>%
  mutate(
    tfc_stamped_dt = ymd_hms(tfc_stamped),  # Convert to datetime format
    hour = hour(tfc_stamped_dt),            # Extract the hour
    day = date(tfc_stamped_dt),             # Extract the day
    week = week(tfc_stamped_dt),            # Extract the week
    month = month(tfc_stamped_dt, label = TRUE)  # Extract the month with labels
  ) %>%
  select(
    tfc_id,
    tfc_stamped_dt,
    tfc_cookie:tfc_referrer,
    hour,
    day,
    week,
    month
  ) %>%
  rename(tfc_stamped = tfc_stamped_dt)  # Rename the column

# Summarize unique users by time and device type
user_counts <- data_renamed %>%
  group_by(hour, day, week, month, tfc_device_type) %>%
  summarise(unique_users = n_distinct(tfc_cookie), .groups = 'drop')  # Count unique users

# Visualization of Unique Users by Month and Device Type
ggplot(user_counts, aes(x = month, y = unique_users, fill = tfc_device_type)) +
  geom_bar(stat = "identity", position = "dodge") +
  ggtitle("Number of Users by Month and Device Type") +
  xlab("Month") +
  ylab("Unique Users") +
  scale_fill_manual(
    values = c(
      "Android App" = "indianred3",
      "Desktop" = "antiquewhite4",
      "iPhone App" = "lightcyan3",
      "Mobile (browser)" = "lightgoldenrod1",
      "Tablet (browser)" = "lavenderblush2"
    )
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
  )

b. Unique Users by Month

  • Monthly Trends: User activity peaks in July, with significant engagement extending into August.

  • Desktop Usage: Desktop access dominates in July and August, indicating a preference for detailed searches and planning applications that benefit from larger screens.

  • Mobile Growth: Mobile browser usage shows steady growth, especially in August, reflecting increased on-the-go engagement.

  • Tablet and App Usage: Tablet and iPhone app usage remain consistently low with minimal month-to-month variation, suggesting limited adoption.

  • Seasonal Insights: Elevated activity during the summer months suggests a heightened interest in planning approvals, property investments, or related activities during this period.

# Summarize total sessions by time and device type
Sessions_count <- data_renamed %>%
  group_by(hour, day, week, month, tfc_device_type) %>%
  summarise(total_session = n_distinct(tfc_session))

###########################################################################################################
# Visualization of Total Sessions by Month and Device Type
###########################################################################################################

ggplot(Sessions_count, aes(x = month, y = total_session, fill = tfc_device_type)) +
  geom_bar(stat = "identity", position = "dodge") +
  ggtitle("Total Sessions by Month and Device Type") +
  xlab("Month") +
  ylab("Unique Users") +
  scale_fill_manual(values = c(
    "Android App" = "indianred3",
    "Desktop" = "antiquewhite4",
    "iPhone App" ="lightcyan3",
    "Mobile (browser)" = "lightgoldenrod1",
    "Tablet (browser)" = "gray50"
  )) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
  )

c. Count of Unique Users Referred to the Website by Google

  • Non-Google Users: The total number of users is higher than the count of unique users, indicating that many visitors return to the site multiple times.

  • Google-Referred Users: Although the total number of users is lower, the proportion of unique users is higher. This suggests that visitors arriving via Google are more likely to be first-time users.

# Add a column to indicate if the referrer is from Google
data <- data %>%
  mutate(google_referrer = case_when(
    str_detect(tfc_referrer, regex('google', ignore_case = TRUE)) ~ "Yes",
    TRUE ~ "No"
  ))

# Summarize the number of users and unique users referred by Google
google_referred_users <- data %>%
  group_by(google_referrer) %>%
  summarise(
    number_users = n(),
    number_unique_users = n_distinct(tfc_cookie)
  ) %>%
  arrange(desc(number_users))

# Create a formatted table
knitr::kable(
  google_referred_users,
  digits = c(0, 0),
  align = "lrr",
  col.names = c("From Google", "Total Users", "Unique Users"),
  caption = "Traffic from Google"
) %>%
  kable_styling(full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "gray2", background = "gainsboro") %>%
  column_spec(1, italic = TRUE, bold = TRUE, color = "gray2", background = "gainsboro") %>%
  column_spec(2, color = "ghostwhite", background = "darksalmon") %>%
  column_spec(3, color = "ghostwhite", background = "darksalmon")
Traffic from Google
From Google Total Users Unique Users
No 327793 154618
Yes 72422 46216

d. Average Session Length

  • Key Insight: The average session length is 2193 seconds (approximately 36.5 minutes). This indicates that users spend a significant amount of time on the site.

  • Possible Interpretations:

    • This could be a positive sign of high engagement, where users are spending time exploring or conducting detailed research.
    • Alternatively, it might highlight issues with complex navigation or lengthy search processes that could benefit from simplification or optimization.
# We will calculate the duration of each session (difference between first and last visit in a session)
session_duration <- data_renamed %>%
  group_by(tfc_session) %>%
  summarise(session_start = min(tfc_stamped),
            session_end = max(tfc_stamped)) %>%
  mutate(session_length = as.numeric(difftime(session_end, session_start, units = "mins"))) %>%
  summarise(avg_session_length = mean(session_length))
arrange(session_duration)
# A tibble: 1 × 1
  avg_session_length
               <dbl>
1              2193.
# Generate a table displaying session duration
knitr::kable(
  session_duration,             # Data to be displayed
  digits = 0,                   # Number of decimal places
  align = "c",                  # Center-align the column
  col.names = "Session Duration" # Column name
) %>%
  kable_styling(full_width = FALSE) %>%
  column_spec(
    1,                          # Target the first column
    bold = TRUE,                # Bold text
    color = "darkblue",      # Text color
    background = "burlywood2"    # Background color
  )
Session Duration
2193

e. Average Session Length by Device Type

  • Key Observations:
    • iPhone users record the longest average session duration, followed by mobile browser users.
    • Desktop sessions rank third in average duration, while tablet users come in fourth.
    • Android app sessions have the shortest duration, indicating potential issues.
  • Insights:
    • Longer iPhone session duration may result from better user experience, faster navigation, or engaging content.
    • Shorter Android app sessions could suggest software limitations or a less engaging user experience.
  • Recommendations:
    • Focus on enhancing the user experience across platforms, particularly for Android apps and tablets.
    • Improvements could include faster load times, simplified navigation, or more engaging content to boost session duration across all devices.
# Analyze session duration by device type
session_by_device <- data_renamed %>%
  group_by(tfc_session, tfc_device_type) %>%
  summarise(
    session_start = min(tfc_stamped),
    session_end = max(tfc_stamped),
    .groups = 'drop'
  ) %>%
  mutate(
    session_length = as.numeric(difftime(session_end, session_start, units = "mins"))
  ) %>%
  group_by(tfc_device_type) %>%
  summarise(
    avg_session_length_device = mean(session_length, na.rm = TRUE),
    .groups = 'drop'
  )

# Visualize Average Session Length by Device Type
ggplot(session_by_device, aes(x = tfc_device_type, y = avg_session_length_device, fill = tfc_device_type)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  scale_fill_manual(values = c(
    "Android App" ="lightpink",
    "Desktop" = "khaki",
    "iPhone App" = "tomato",
    "Mobile (browser)" = "slategray2",
    "Tablet (browser)" = "gray50"
  )) +
  labs(
    title = "Average Session Length by Device Type (Minutes)",
    x = "Device Type",
    y = "Average Session Length (Minutes)"
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
  )

f. Bounce Rate (Sessions with Only One Page View)

  • A high bounce rate on Planning Alerts might indicate challenges such as:
    • Irrelevant content that fails to meet user expectations.
    • Slow page load times that frustrate visitors.
    • Poor user experience, making it difficult for users to interact with the site.
    • Unclear navigation, leading users to exit quickly.
    • Attracting the wrong audience due to mismatched marketing or targeting strategies.
# Group data by each unique session and count distinct pages viewed
session_page_counts <- data_renamed %>%
  group_by(tfc_session) %>%
  summarise(pages_visited = n_distinct(tfc_full_url))

# Calculate the number of bounce sessions and total sessions
bounce_stats <- session_page_counts %>%
  summarise(
    bounce_sessions = sum(pages_visited == 1),
    total_sessions = n(),
    bounce_rate_percentage = (bounce_sessions / total_sessions) * 100
  )

# Display the bounce rate
print(bounce_stats)
# A tibble: 1 × 3
  bounce_sessions total_sessions bounce_rate_percentage
            <int>          <int>                  <dbl>
1          272772         283639                   96.2
# Extract the bounce rate percentage
bounce_rate_percentage <- bounce_stats$bounce_rate_percentage

# Create a data frame with bounce and non-bounce percentages
bounce_percentage_data <- data.frame(
  Category = c("Bounce", "Non-Bounce"),
  Percentage = c(bounce_rate_percentage, 100 - bounce_rate_percentage)
)
# Load ggplot2 library
library(ggplot2)

# Create a pie chart
ggplot(bounce_percentage_data, aes(x = "", y = Percentage, fill = Category)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y") +
  labs(title = "Bounce Rate Percentage") +
  scale_fill_manual(values = c("Bounce" = "slategray4", "Non-Bounce" = "wheat2")) +
  theme_void() +
  theme(plot.title = element_text(size = 14, face = "bold", hjust = 0.5))

2. Visitor Segmentation and Behavior

a. Frequency of User Visits - Once-Off vs Repeat Visitors

  • Observation:
    Many individuals visit Planning Alerts only once for specific needs. This is evident from the data showing a high number of once-off users compared to repeat visitors. It highlights limited continuous engagement and low user retention.

  • Actionable Insight:
    Enhancing user retention strategies, such as offering frequent updates and personalized alerts, could encourage more regular usage and increase the number of repeat visits.

# Group data by user (tfc_cookie) and count distinct sessions per user
User_sessions <- data_renamed %>%
  group_by(tfc_cookie) %>%
  summarise(sessions_per_user = n_distinct(tfc_session)) %>%
  # Classify users as 'once-off' or 'Repeat' based on session count
  mutate(visitors_type = ifelse(sessions_per_user == 1, "Once-Off", "Repeat"))

# Summarize the count and percentage of each visitor type
user_sessions_summary <- User_sessions %>%
  count(visitors_type) %>%
  mutate(percentage = n / sum(n) * 100)

# Create a donut chart to visualize the proportion of visitor types
ggplot(user_sessions_summary, aes(x = 2, y = n, fill = visitors_type)) +
  geom_col(width = 0.5, color = "white") +  # Create the donut segments
  coord_polar(theta = "y") +                # Transform to polar coordinates
  xlim(1, 2.5) +                            # Adjust x-axis limits to create the donut hole
  theme_void() +                            # Remove background and axes
  # Add percentage labels to each segment
  geom_text(aes(label = paste0(round(percentage, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 3,
            color = "white",
            fontface = "bold") +
  # Define custom fill colors for the segments
  scale_fill_manual(values = c("orangered2", "burlywood")) +
  # Add title and legend labels
  labs(title = "Once-Off vs Repeat Visitors", fill = "Visitor Type") +
  # Customize plot title and legend appearance
  theme(plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
        legend.position = "right",
        legend.title = element_text(face = "bold"),
        legend.text = element_text(size = 10))

b. Average Pages Clicked per Session

  • Key Insight: On average, users view 1.41 pages per session. This suggests that users are either finding the information they need quickly or not engaging deeply with the site.

  • Potential Interpretation:

    • Users may be efficiently finding the content they need, which is a positive sign for site navigation and usability.
    • Alternatively, the low engagement might indicate limited exploration or insufficient content visibility.
  • Improvement Opportunity: The low page-per-session metric highlights potential areas for enhancing the user experience and encouraging deeper site exploration.

Average_pages_per_session <- data_renamed %>%
  group_by(tfc_session) %>%
  summarise(pages_per_session = n()) %>%
  summarise(avg_pages = mean(pages_per_session))

arrange(Average_pages_per_session)
# A tibble: 1 × 1
  avg_pages
      <dbl>
1      1.41
knitr::kable(Average_pages_per_session, 
             digits = c(0,0), 
             align = "c", 
             col.names = c("Average pages per session")) %>% 
  kable_styling(full_width = F) %>%
    column_spec(1, underline = FALSE, bold = TRUE, color = "dodgerblue2", background = "navajowhite")
Average pages per session
1

c. Average Number of Pages Clicked per User

  • Current Engagement:
    On average, each user clicks 1.14 pages, suggesting limited interaction with the site. This indicates that most users may be finding the information they need quickly, leading to one-time visits.

  • Opportunities for Improvement:
    To encourage deeper engagement, consider:

    • Enhancing Content: Provide more detailed or diversified content to keep users exploring.
    • Personalized Suggestions: Offer recommendations or related pages based on user behavior to promote further navigation.
# Calculate the number of distinct pages visited by each user
pages_per_user <- data_renamed %>%
  group_by(tfc_cookie) %>%
  summarise(pages_visited = n_distinct(tfc_full_url))

# Calculate the average number of pages visited per user
avg_pages_per_user <- pages_per_user %>%
  summarise(avg_pages_per_user = mean(pages_visited))

# Display the result
print(avg_pages_per_user)
# A tibble: 1 × 1
  avg_pages_per_user
               <dbl>
1               1.14
knitr::kable(Average_pages_per_session, 
             digits = c(0,0), 
             align = "c", 
             col.names = c("Average pages per session")) %>% 
  kable_styling(full_width = F) %>%
    column_spec(1, underline = FALSE, bold = TRUE, color = "dodgerblue2", background = "navajowhite")
Average pages per session
1

3. User Journey

a. Common User Journeys on the Website

  • Web Pages (400,215):
    This is the total number of pages available for users to access or view on the website.

  • Unique Users (189,028):
    During the specified time frame, 189,028 unique users visited the website.

  • Unique Sessions (283,639):
    The website had 283,639 distinct user visits (or sessions), indicating consistent and active engagement.

  • Insight:
    Users are actively browsing the website’s available pages, showing consistent traffic patterns.

  • Opportunities for Improvement:
    To further enhance user journeys, consider:

    • Streamlining Navigation: Simplify access to key areas of the website to improve user flow.

    • Improving Engagement: Introduce interactive elements or content that encourage users to explore more pages.

    • Optimizing User Experience: Analyze common journeys to identify potential bottlenecks and make adjustments for smoother navigation.

Top_level_stats <- data_renamed %>%                                               #Count the number of webpages
  summarise(number_webpages = n(),                                        #n() Count number of rows
            number_unique_users = n_distinct(tfc_cookie),                 #Count the number of unique user
            number_unique_sessions = n_distinct(tfc_session))             #Count the number of unique session

arrange(Top_level_stats)
# A tibble: 1 × 3
  number_webpages number_unique_users number_unique_sessions
            <int>               <int>                  <int>
1          400215              189028                 283639
knitr::kable(
  Top_level_stats, 
  digits = c(0, 0), 
  align = "ccc", 
  col.names = c("No. Web Pages", "Unique Users", "Unique Sessions"), 
  caption = "USER JOURNEYS ON THE WEBSITE"
) %>%
  kable_styling(full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "gray2", background = "gray")
USER JOURNEYS ON THE WEBSITE
No. Web Pages Unique Users Unique Sessions
400215 189028 283639

b. Exit Pages (Where Users End Their Session)

  • Observation:

    • The “About” page has a higher exit rate, suggesting that users might quickly lose interest after reviewing the company’s basic details.
    • Similarly, the blog page has a high exit rate, indicating that readers may not find the content engaging enough to continue exploring or take desired actions.
  • Implications:
    These patterns suggest opportunities for improvement in content relevance and user engagement.

  • Opportunities for Improvement:

    • Enhance Content: Revise the “About” page to make it more engaging, possibly by including interactive elements or calls to action.
    • Boost Blog Appeal: Create more engaging, actionable, and relevant blog content to retain readers and encourage them to explore further.
    • Promote Deeper Interaction: Add links to related content or sections to guide users toward other parts of the website.
# User Journeys: Exit pages indicate where users end their sessions.
exit_pages <- data_renamed %>%
  group_by(tfc_session) %>%                             # Group by session
  summarise(exit_page = last(tfc_full_url)) %>%         # Identify the last page in each session
  group_by(exit_page) %>%                               # Group by exit page
  summarise(exit_count = n())                           # Count exits for each page

# Visualization of Top Exit Pages
ggplot(exit_pages[1:10,], aes(x = reorder(exit_page, -exit_count), y = exit_count)) +
  geom_bar(stat = "identity", fill = "skyblue2") +         # Updated color for the bars
  coord_flip() +
  labs(
    title = "Top 10 Exit Pages",
    x = "Exit Page", 
    y = "Exit Count"
  ) +
  theme_light()

c. Which Types of Pages are Common Entry Points for Unique Users

  • User Preferences:
    • Users are primarily engaging with app-based entry points, indicating that the application is the primary focus for initial interactions.
    • After interacting with the application, users frequently proceed to the mobile app.
  • Key Entry Pages:
    • Map and List Pages: These pages suggest that users are actively searching for specific material or data, often based on location.
    • Signup Page: The high ranking of this page highlights a strong demand for personalized features or experiences, as well as significant interest in user registration.
  • Insights and Recommendations:
    • Optimize the app and mobile app interfaces to make entry points seamless and engaging.
    • Enhance the functionality of the “map” and “list” pages to better serve users’ location-based needs.
    • Simplify and promote the signup process to capitalize on the interest in registration and personalization.
# Summarize landing pages and user counts
landing_pages <- data_renamed %>% 
  group_by(tfc_full_url_screen) %>%
  summarise(user_count = n_distinct(tfc_cookie))

# Load the treemap library
library(treemap)

# Generate the treemap with the Spectral palette
treemap(
  landing_pages,
  index = "tfc_full_url_screen",   # Group by URL screen
  vSize = "user_count",            # Size of rectangles based on user count
  vColor = "user_count",           # Color intensity based on user count
  type = "value",                  # Color represents the value
  palette = "Spectral",            # Use the Spectral color palette
  title = "Landing Pages and Entry Points",  # Descriptive title
  border.col = "white"             # Clean white borders for rectangles
)

4. Cross-Device and Multi-Page Analysis

a. Check How Many Users Use Multiple Devices

  • Observation:
    If the cross-device user count is less than 1% of the total user base, it indicates that relatively few users are switching between devices during their sessions.

  • Implication:
    This suggests that most users are engaging with the platform using a single device. This behavior is likely driven by convenience or personal preference.

  • Actionable Insight:

    • Focus on optimizing the user experience for single-device usage, as it represents the majority of the audience.
    • If cross-device usage grows, consider adding features like session continuation or account syncing to improve multi-device interactions.
cross_device_users <- data_renamed %>%
  group_by(tfc_cookie) %>%
  summarise(device_count = n_distinct(tfc_device_type)) %>%
  filter(device_count > 1)


ggplot(cross_device_users, aes(x = tfc_cookie, y = device_count)) +
  geom_tile(aes(fill = device_count), color = "deepskyblue1") +
  scale_fill_viridis_c() +
  scale_y_continuous(breaks = seq(0, max(cross_device_users$device_count), by = 1)) +  # Display only whole numbers
  labs(title = "Device Count by User", x = "User ID (tfc_cookie)", y = "Device Count") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

5. Page-Specific Engagement

a. Count the Number of Views for Planning Applications by Device Type

  • Observation:
    • Desktop users dominate the platform with the highest number of views. This suggests that people prefer using larger screens for intricate interactions or in-depth research.
    • Mobile browsers also see a significant number of views, highlighting the need for portable access.
    • Android apps are moderately used, indicating that while they are utilized, their reach isn’t widespread.
    • Tablets and iPhone apps have very low views, suggesting minimal engagement on these devices.
  • Implication:
    • This data indicates an opportunity to optimize the platform for underutilized devices (e.g., tablets and iPhones) to boost engagement.
    • Enhancing the Android app and mobile browser experience could further increase usage and satisfaction.
  • Actionable Insight:
    • Consider tailoring features for smaller devices to improve accessibility and usability across all platforms.
# Summarize views for planning applications by device type
App_views <- data_renamed %>%
  filter(!is.na(tfc_application_reference)) %>%  # Filter out rows with missing references
  group_by(tfc_device_type) %>%
  summarise(app_views_count = n())  # Count the number of views per device type

# Create a styled table
install.packages("kableExtra")
library(kableExtra)
knitr::kable(
  App_views, 
  align = "cc",  # Center-align both columns
  col.names = c("Device", "View Count"),  # Column names
  caption = "VIEWS BY DEVICE TYPE"  # Table caption
) %>%
  kable_styling(full_width = FALSE) %>%  # Disable full-width table
  row_spec(0, bold = TRUE, color = "white", background = "darkblue") %>%  # Header styling
  row_spec(1, bold = TRUE, color = "black", background = "lightblue") %>%  # First row
  row_spec(2, bold = TRUE, color = "white", background = "dodgerblue") %>%  # Second row
  row_spec(3, bold = TRUE, color = "black", background = "skyblue") %>%  # Third row
  row_spec(4, bold = TRUE, color = "white", background = "steelblue") %>%  # Fourth row
  row_spec(5, bold = TRUE, color = "black", background = "lightskyblue")  # Fifth row
VIEWS BY DEVICE TYPE
Device View Count
Android App 21162
Desktop 191820
Mobile (browser) 56510
Tablet (browser) 1879
iPhone App 890

CONCLUSION

  • In conclusion, the majority of PlanningAlerts.ie visitors are summertime desktop users, showing a strong preference for larger screens during peak months like July and August.

  • Mobile Usage:

    • Mobile usage is steadily increasing, especially through browsers.
    • Apps, particularly on tablets and iPhones, remain underutilized, presenting an opportunity for platform-specific improvements.
  • User Acquisition:

    • Most new users are acquired through Google referrals, highlighting the effectiveness of SEO strategies in attracting first-time visitors.
  • Engagement Patterns:

    • Users spend an average of 36.5 minutes per session, which indicates either high engagement or potential navigation complexities.
    • Challenges Identified:
      • Low page visits per session.
      • High bounce rates, suggesting that content relevance, site structure, or performance may need improvement.
    • The “About” page and blog posts often act as exit points, signaling a need for more engaging and actionable content.
  • Recommendations for Improvement:

    • Optimizing Mobile Experience:
      • Enhance mobile and tablet interfaces with responsive designs and faster load times to cater to on-the-go users.
    • Content Relevance:
      • Revise and enrich key pages, such as “About” and blog posts, to retain users and encourage deeper exploration.
    • Encouraging Engagement:
      • Introduce personalized features, such as location-based recommendations, interactive maps, or tailored alerts, to foster long-term user retention.
    • Improving Navigation:
      • Simplify the user journey to help visitors find information easily and explore more pages.
  • Overall Insight:
    By addressing these areas, PlanningAlerts.ie can reduce bounce rates, increase page views, and strengthen its appeal across all devices. This approach will drive consistent engagement and satisfaction, encouraging repeat visits and long-term user loyalty.