Skip to content

SEO Checklist

1. Indexable

🔎

Important SEO content must be indexable by search engine

Text can be indexed better than image

GenS Conference Banner

Image is not preferred to represent important SEO content

html
<img src="gens-conference-banner.png" />

TIP

If you decide to still go with img due to time constraint, do remember to at least add an alt tag and a meaningful file name

Text is preferred to represent important SEO content

html
<div>
	<h1>GenerationS</h1>
	<h2>Pastors Conference</h2>
	<h3>23 - 27 July 2026, Singapore</h3>
	<p>Registration to open at a later time</p>
</div>

Visible content can be indexed better than hidden content

Came Up New Lyrics

The lyrics tab in Came Up New Resources page is initially hidden using v-if.

Hidden content is not preferred to represent important SEO content

vue
<div v-if="selectedTab === TAB.LYRICS">
	<h1>Lyrics section</h1>
	...
</div>

Visible content is preferred to represent important SEO content

Instead of using v-if, host the lyrics section in its own page without v-if logic.

e.g. /music/came-up-new/resources/lyrics

vue
<div>
	<h1>Lyrics section</h1>
	...
</div>

2. Presentable

🔎

Important SEO content must be presentable to search engine

Images or files must have presentable metadata

Annual Report

GenS Book img

File names are not presentable

html
<img src="image-7960.jpg" />
<img src="asset-1.png" />
<a href="flyer-version-10.pdf" target="_blank" />

File names are presentable

html
<img src="Heart-of-God-Church-Logo.jpg" />
<img src="Heart-of-God-Church-on-Straits-Times-Interfaith-Blood-Donation-Drive.png" />
<a href="HeartKidz-Flyer-July-2025.pdf" target="_blank" />

Images do not have alt tags

html
<img src="Heart-of-God-Church-Logo.jpg" />

Images have presentable alt tags

html
<img alt="Heart of God Church logo" src="Heart-of-God-Church-Logo.jpg" />

Uppercased text content must be presentable

Uppercased text are hard coded

html
<h1>HELLO I'M AN UPPERCASED HEADER!</h1>

TIP

Depending on the requirements, this might be preferred. So do check with the PM!

Uppercased text are styled

html
<h1 class="uppercase">Hello I'm an uppercased header!</h1>

3. Hierarchical

🔎

Important SEO content must be represented in proper hierarchy

Search engines show preference for keywords appearing in heading tags.

Example of hierarchy:

<h1> > <h2> > <h3> > <p> > <span>

SEO Content have no hierarchy even though there is a difference in importance

html
<div>
  <p>I'm super important!</p>
</div>

<div>
  <p>I'm not as important as the above!</p>
</div>

<div>
  <p>I'm least important!</p>
</div>

<p>I'm just a body text...</p>

SEO Content have proper hierarchy

html
<div>
    <h1>I'm super important!</h1>
</div>

<div>
    <h2>I'm not as important as the above!</h2>
</div>

<div>
    <h3>I'm least important!</h3>
</div>

<p>I'm just a body text...</p>

TIP

Do check with the UI/UX & PM if you're unsure of the order of importance of the SEO content in the page!

4. Meaningful

🔎

Important SEO content must be represented in a meaningful way

Semantic HTML is preferred by search engines

Example of semantic HTML elements:

html
<main></main>
<section></section>
<nav></nav>
<footer></footer>
<form></form>

and many more!

SEO Content are represented in non-semantic HTML

html
<div>
  <p>I'm the header!</p>
</div>

<div>
  <p>I'm the main content!</p>
	<div>I'm a section!</div>
</div>

<div>
  <p>I'm the footer!</p>
</div>

SEO Content are represented in semantic HTML

html
<header>
    <p>I'm the header!</p>
</header>

<main>
    <p>I'm the main content!</p>
    <section>I'm a section!</section>
</main>

<footer>
    <p>I'm the footer!</p>
</footer>

WARNING

While it's good to convert the important div in your page to semantic HTML, you don't have to overdo it for the less significant divs!

5. Performant

Website is performant

How do we measure performance of the website to optimise its SEO?

Use PageSpeed Insights

How to export from Figma the most performant way?

  • What file type should I use?

Vector

.svg - for all vector images

.png - for transparent images

.gif - for animated images

Do we really need GIF?

Do discuss with your PMs & UI/UX if GIF is really the only way. Google prefers videos over GIFs.

.jpg - for anything else

You can use Squoosh, to further optimise the image size

  • How many x should I export in?

Mobile image (< 400px in image width) - x4

Tablet image (< 1400px in image width) - x2

Desktop image (>= 1400px in image width) - x2

Using nuxt-img to auto optimise images

We use Nuxt Images library to auto optimise images with Cloudflare CDN

Sample usage:

vue
<nuxt-img
  preset="default" 
  src="/assets/images/give/life-changing-makeover.png"
  width="744"
  height="570"
  class="w-full"
/>
  • The height and width should be the base resolution of the image.
  • default preset integrates with Cloudflare

Intrinsic size

nuxt-img will then construct a Cloudflare optimised URL and auto-insert it into an img tag:

https://page.heartofgodchurch.org/cdn-cgi/image/fit=scale-down,f=auto,w=744,h=570/assets/images/give/life-changing-makeover.png

WARNING

Before using nuxt-img, do check with the dev lead whether Nuxt Image has been set up on your repo.


That's all! Your website is ready to be launched!

launch!

Want to contribute to this checklist?

Let the dev leads know!