A practical series about Laravel SEO infrastructure based on real ICanUp cases: IndexNow, sitemaps, localized URLs, lastmod, indexing signals, and the less obvious edge cases that appear in a real multilingual project.
I did not want to notify Bing manually every time I published or updated a page on ICanUp. I integrated IndexNow into Laravel with a key endpoint, HTTP client, queued submission job, localized URL generation for posts, pages and categories, deduplication, and tests.
While working on my sitemap, I found a subtle problem: a public page could change through its translation table while the parent model updated_at stayed unchanged. This article shows how I verified the case and chose the correct lastmod for localized pages.
In a multilingual Laravel project, having separate UK and EN URLs is not enough. I explain how I configured canonical and hreflang in ICanUp, connected language versions, added x-default, and verified that search engines receive the correct relationship between localized pages.
In a multilingual Laravel project, x-default can easily look like another language version. In ICanUp, I use it differently: x-default points to the default locale URL. I walk through the real HreflangService, its relationship with canonical URLs, and the edge cases across different content types.
In ICanUp, BlogPosting JSON-LD connects an article not only to its SEO metadata but also to a real author entity. I show how I represent the author as a Person, keep structured data aligned with the canonical URL and localized metadata, and render it directly in the SSR HTML.
In ICanUp, visible breadcrumbs and BreadcrumbList JSON-LD describe the same page hierarchy. I show how I connect navigation with structured data, generate sequential positions, use localized canonical URLs, and avoid creating a separate SEO hierarchy on top of application breadcrumbs.
In ICanUp, Telegram already showed the Post cover, title, and description correctly, while LinkedIn produced an incomplete or incorrect preview. I audited the server-rendered Open Graph tags, the LinkedInBot response, image URL and metadata, duplicate head tags, and platform caching. The case showed why a preview working in one messenger does not prove the social metadata contract is complete.