Building an AI SaaS Landing Page: My 7-Day Journey with the Saino Theme
My buddy David has been working on a Micro-SaaS project for the last six months. It is a neat little AI-powered tool that helps small local shops write their marketing emails. He had his backend software running smoothly, but his front-end marketing site was a total mess. He was using a basic HTML template he cobbled together, and it had zero SEO structure, no blog, and looked like something from 2012.
David came to me last week with a tight budget and a big ask. "I need a site that looks like a high-end AI startup, loads in under a second, has a blog for my SEO strategy, and is easy enough for me to update without writing code. Can we do this in a week?"
As a developer who has spent more than ten years inside the WordPress core and building custom HTML5 applications, I knew we could do this. But we couldn't just throw together a basic template. We needed something modern, responsive, and built specifically for software businesses.
After looking at a few options, we settled on the Saino – AI Software & Micro-SaaS Startup WordPress Theme. It has that clean, sleek, tech-focused design with dark backgrounds and neon accents that people expect from an AI company.
But installing a theme is only 10% of the job. To make it perform well in the eyes of Google’s search bots and real human visitors, we had to optimize the code, fix layout shifts, clean up database junk, and write custom code where the default setup fell short.
Here is my daily developer log showing exactly how we rebuilt David's SaaS site from the ground up using the Saino theme.
Day 1: Code Audits, Sandbox Setup, and Local Deployments
Before you ever install a theme on a live production server, you need to set up a safe local development playground. I use LocalWP on my machine because it lets me spin up a clean Nginx and PHP environment in about thirty seconds.
For this project, I configured the local container with: Web Server: Nginx PHP Version: 8.2 (never use outdated PHP versions, they slow down your site and have security holes) Database: MySQL 8.0.x
Once the blank WordPress site was live, I downloaded the Saino zip package. Before uploading it, I unzipped it on my local machine to inspect the file structure. I wanted to see how the developers structured the code.
My Code Inspection Notes: Template Structure: The theme uses clean PHP file structuring. Key layout blocks are broken down into standard template parts (headers, footers, post types), which makes child-theming highly straightforward. Page Builder: It relies on Elementor for layout building. While Elementor is great for non-technical users like David, it can add extra code bloat if you are not careful. We will have to optimize how the stylesheets and scripts are loaded. Asset Management: The theme uses standard CSS and JS enqueuing, meaning we can easily dequeue unnecessary files on pages where they aren't needed.
I zipped the theme folder back up, uploaded it to my local site, and hit activate. The theme prompted me to install its required plugins. I installed only the core dependencies needed for the SaaS layout. I skipped all optional plugins because every extra active plugin is just another potential bottleneck.
By the end of Day 1, we had a running local site with the basic theme framework. Next came the heavy lifting of importing and cleaning.
Day 2: Demo Imports and Cleaning Up Database Bloat
On Day 2, I imported the "AI Content Generator" demo layout. It gave us a beautiful framework with pricing grids, feature highlights, and testimonial blocks.
But demo importers are notoriously dirty. They don't just import the layout; they flood your WordPress database with draft pages, dummy menus, duplicate categories, and thousands of lines of temporary configuration data called transients.
If you don't clean this up immediately, your database queries will slow down, and your site's response time (Time to First Byte or TTFB) will suffer.
To fix this, I opened my terminal, navigated to my local WordPress directory, and used WP-CLI (the WordPress Command Line Interface) to clean house.
# First, let's see how many posts and pages we have
wp post list --post_type=page
# Delete all the demo pages we don't plan to use
wp post delete $(wp post list --post_type=page --format=ids --status=draft) --force
# Now, let's clean out the trash
wp post delete $(wp post list --post_type=page --format=ids --status=trash) --force
# Clean up all expired and active transients in the database
wp transient delete --all
# Clean up orphan post meta that might be left over from deleted pages
wp db query "DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL"
Running these commands dropped our wp_posts table size significantly and kept our options table extremely lean.
Before finishing up for the day, I created our official child theme. If you build a site without a child theme, you are setting yourself up for disaster because the next theme update will wipe out any custom work.
I created a folder called saino-child inside wp-content/themes/ and added a style.css and a functions.php file.
/*
Theme Name: Saino Child
Theme URI: https://gplpal.com/product/saino-ai-software-micro-saas-startup-wordpress/
Description: A highly optimized child theme for David's AI SaaS.
Author: Web Architect
Template: saino
Version: 1.0.0
*/
Now we were ready to customize without fear of losing our work during updates.
Day 3: Resolving a Critical Script Loading Performance Bottleneck
On Day 3, we faced our first real technical friction point with the Saino theme.
The client's SaaS homepage has a beautiful, interactive pricing table with a monthly/yearly billing toggle. To make this toggle work, the theme enqueues a specific JavaScript library and a custom theme script called saino-pricing-toggle.js.
During a quick test run, I noticed that this pricing script was being enqueued globally. This meant that even when a user was reading a simple text blog post or visiting the "Contact Us" page, the browser was still downloading, parsing, and executing the pricing toggle script.
While a single small script doesn't seem like a big deal, modern mobile performance is heavily impacted by JavaScript execution time. Every extra script you load on a page where it is not used causes the browser's main thread to pause, delaying page rendering and hurting your mobile speed score.
I looked through the theme settings to see if there was an option to conditionally load this asset. There was not. It was registered globally inside the parent theme's main setup file.
To solve this, I wrote a custom PHP optimization script inside my child theme's functions.php file. This code intercepts the registered scripts and dequeues them on all pages except the homepage and the dedicated plans page.
Here is the exact code I wrote to handle this:
<?php
// Prevent direct access to the file
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Optimize script loading by removing specialized assets from pages where they aren't used.
*/
function my_optimize_saino_assets() {
// Only load the pricing script on the homepage and the pricing page
if ( ! is_front_page() && ! is_page( 'pricing' ) ) {
// Dequeue the style sheet associated with the pricing toggle
wp_dequeue_style( 'saino-pricing-styles' );
wp_deregister_style( 'saino-pricing-styles' );
// Dequeue the script handling the toggle interactivity
wp_dequeue_script( 'saino-pricing-toggle' );
wp_deregister_script( 'saino-pricing-toggle' );
}
// Dequeue heavy block styles if we are using Elementor layouts anyway
if ( ! is_singular( 'post' ) ) {
wp_dequeue_style( 'wp-block-library' );
wp_dequeue_style( 'wp-block-library-theme' );
wp_dequeue_style( 'wc-blocks-style' ); // We don't need WooCommerce blocks here
}
}
// Run our optimization late in the head rendering process (priority 99)
add_action( 'wp_enqueue_scripts', 'my_optimize_saino_assets', 99 );
Why this code works:
By hooking our function late into the wp_enqueue_scripts hook (priority 99), we let the parent theme register all its assets first. Then, we check the current page context. If the visitor is on a blog post or a landing page that doesn't feature the billing toggle, we silently drop those assets from the queue.
When I tested the blog pages after applying this fix, the total Javascript execution time on mobile dropped by nearly 180 milliseconds. This is a massive victory for keeping our blog pages super lightweight for search engines.
Day 4: Spotting and Fixing Layout Shifts (CLS) on SVG Animations
On Day 4, I started running the first visual diagnostics using Google Lighthouse and Chrome DevTools.
The visual design of Saino is incredible. It has floating SVG graphics and glowing blobs in the background that give it a premium AI look. However, the Lighthouse report showed a scary warning under the Core Web Vitals section: Cumulative Layout Shift (CLS): 0.32.
Any CLS score above 0.25 is flagged as poor by Google and will actively hurt your mobile rankings.
Using the "Performance" panel in Chrome DevTools, I ran a profile test to see which elements were moving around during page load. I found two distinct culprits:
- The SVG Feature Icons: The custom SVG graphics used in the "Features Grid" did not have explicit width and height attributes in their HTML markup. When the page loaded, the browser didn't know how much space to reserve for these icons. They would load as 0px tall initially, and then suddenly pop open once the file fully downloaded, pushing all the text below them down by about 40 pixels.
- The Off-Canvas Menu: The mobile menu toggle script was injectively appending styling late in the rendering sequence, causing the main header wrapper to resize slightly after initial paint.
To fix the SVG layout shifts without manually modifying dozens of media files, I wrote a CSS rule that targets the image wrappers within the Elementor feature columns. This forces the browser to reserve the correct container space even before the SVG file finishes downloading.
I added this to the child theme’s style.css file:
/* Force exact dimensional bounding boxes on feature grid images to eliminate CLS */
.saino-feature-box .elementor-image-box-wrapper .elementor-image-box-img img {
width: 64px !important;
height: 64px !important;
aspect-ratio: 1 / 1;
display: inline-block;
}
/* Ensure the header container has a fixed height prior to stylesheet delivery */
header#saino-masthead {
min-height: 80px;
contain-intrinsic-size: auto 80px;
content-visibility: auto;
}
@media (max-width: 991px) {
header#saino-masthead {
min-height: 70px;
contain-intrinsic-size: auto 70px;
}
}
Explaining the Fix:
The addition of aspect-ratio: 1/1 tells the browser's layout engine to immediately reserve a perfect square area for those icons. The min-height property on the header prevents the entire page body from jumping upwards when the header logo and menu scripts finally render.
After saving these styles and clearing the browser cache, I reran the Lighthouse performance audit.
The CLS score instantly dropped from 0.32 to 0.01. The layout was now completely stable during loading, which makes for a much smoother user experience.
Day 5: Speed Tuning with Nginx Cache Optimization
On Day 5, we migrated the local site to our staging VPS. A great theme and optimized code won't help you if your server environment is slow. I don't use cheap shared hosting for SaaS clients; instead, I use a virtual private server running an optimized Nginx stack.
To get maximum speed out of our Saino setup, I bypass WordPress entirely for static assets and set up server-side fastcgi caching. This means that when a search bot or a regular visitor requests a page, Nginx serves an ultra-fast HTML snapshot from memory without executing PHP or querying the database.
I opened our Nginx server block configuration file and implemented these specific rules:
# Define fastcgi cache zone in main nginx config (usually placed in nginx.conf)
# fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=SAINO_CACHE:100m inactive=60m;
server {
listen 443 ssl http2;
server_name www.davids-ai-saas.com;
# Root directory of the site
root /var/www/saino-wp;
index index.php;
# SSL Config block (Let's Encrypt certificates)
ssl_certificate /etc/letsencrypt/live/davids-ai-saas.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/davids-ai-saas.com/privkey.pem;
# Cache execution logic
set $skip_cache 0;
# Skip cache for logged-in WordPress users or active commenters
if ($http_cookie ~* "comment_author|wordpress_[a_f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
# Skip cache for administrative requests or active cart pages
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# Handle static assets with long browser caching headers
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|webp)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
access_log off;
log_not_found off;
}
# Pass PHP scripts to FastCGI server
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Apply our caching engine parameters
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache SAINO_CACHE;
fastcgi_cache_valid 200 301 302 30m;
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
add_header X-FastCGI-Cache $upstream_cache_status;
}
# Security configuration headers
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "strict-origin-when-cross-origin";
}
What this does for the site: X-FastCGI-Cache header: This lets us inspect our headers to see if a page request is a "HIT" (served instantly from server memory) or a "MISS" (processed dynamically by PHP). Static Asset Expiry: We tell the user's browser to store the theme's CSS, JS, and image files locally for up to a year. This makes subsequent page views load almost instantly because the browser doesn't have to download the files again.
Once this configuration was loaded, the Time to First Byte (TTFB) dropped to an incredibly low 48 milliseconds. The site was now officially fast.
Day 6: SEO Schema Optimization without Bulky Plugins
On Day 6, we shifted our focus to white-hat SEO. Because David's site is promoting a software application, we need to make sure Google knows exactly what this product is, how much it costs, and who built it.
Many SEO beginners install heavy, multi-feature plugins just to add basic schema tags. These plugins often inject huge amounts of unnecessary code and run database queries on every page load.
Instead of taking that route, I decided to write a custom JSON-LD schema generator directly in our child theme. This function generates valid SoftwareApplication markup and injects it into the header of the main product landing pages.
I opened our child theme’s functions.php file and added the following code block:
/**
* Inject custom, lightweight SoftwareApplication JSON-LD schema into the header.
*/
function my_custom_saas_schema() {
// Only target our primary SaaS pricing or landing pages
if ( is_front_page() ) {
$schema = array(
"@context" => "https://schema.org",
"@type" => "SoftwareApplication",
"name" => "David's Email AI Writer",
"operatingSystem" => "All",
"applicationCategory" => "BusinessApplication",
"offers" => array(
"@type" => "Offer",
"price" => "19.00",
"priceCurrency" => "USD"
),
"aggregateRating" => array(
"@type" => "AggregateRating",
"ratingValue" => "4.8",
"ratingCount" => "24"
)
);
echo "\n" . '<!-- Custom Lightweight SaaS Schema -->' . "\n";
echo '<script type="application/ld+json">' . json_encode( $schema, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ) . '</script>' . "\n";
}
}
// Inject the schema deep into the header actions
add_action( 'wp_head', 'my_custom_saas_schema', 20 );
Why Google Loves This:
Google’s Quality Rater Guidelines prioritize structured data because it makes indexing and classification straightforward. By generating this custom schema dynamically without an extra plugin, we avoid the overhead of heavy third-party settings menus while passing Google's schema verification tests cleanly.
Day 7: Final Polish, Results, and Launch Day
On Day 7, we did a final round of functional testing. I verified that our contact forms sent emails cleanly, that the custom mobile menu was highly responsive, and that our custom styles looked uniform across multiple devices.
We officially pushed the DNS changes to make the new site live.
I ran our final performance tests on the live production server using PageSpeed Insights.
| Performance Metric | Old Custom HTML / Builder Site | New Saino WordPress Site (Optimized) |
|---|---|---|
| Mobile Performance Score | 41 / 100 | 92 / 100 |
| Desktop Performance Score | 68 / 100 | 98 / 100 |
| First Contentful Paint (FCP) | 3.1 seconds | 0.8 seconds |
| Cumulative Layout Shift (CLS) | 0.35 | 0.01 |
| Total Blocking Time (TBT) | 840ms | 110ms |
David was thrilled. His SaaS MVP now had a marketing hub that loaded in under a second and looked like a million-dollar company.
Honest Pros & Cons of the Saino Theme
Now that I have spent a full week working with this theme down to the raw code level, here is my objective review of the theme.
The Pros:
- Stunning SaaS Aesthetics: The visual styling is exactly what modern software businesses want. The layout transitions, card designs, and dark-mode gradients are beautiful right out of the box.
- Clean File Architecture: The parent theme follows standard WordPress conventions, making child theme overrides and asset dequeuing incredibly clean.
- Flexible Block Sections: The customized widgets designed for software highlights and comparison tables made it incredibly easy to arrange complex tech details visually.
The Cons & Friction Points:
- Global Script Loads: The interactive pricing elements and animations load their JS globally. This will slow down your blog and contact pages unless you write custom dequeuing rules (like our Day 3 script).
- Potential Layout Shifts: If you use the default floating SVG elements, they do not include explicit size wrappers, which will cause your text to jump around on mobile unless you apply strict CSS constraints.
My Final Takeaway
If you are a developer or a SaaS founder looking to launch an AI platform, a mobile application, or a Micro-SaaS startup, the Saino theme is a solid and beautiful framework to build on.
Just remember that you cannot expect a fast, high-ranking site by simply installing a theme and running away. You have to take the time to set up a clean child theme, selectively dequeue assets where they aren't needed, and optimize your hosting environment. If you follow the daily development steps outlined above, you will end up with an incredibly fast, clean, and professional marketing hub that converts visitors into customers.



