{"result":{"depiction_url":null,"edges":{"observes":{"objects":[{"created":"2026-09-09T13:47:44Z","object_id":{"id":1466,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_admin_menu","title":"observe_admin_menu\/3","uri":"https:\/\/zotonic.com\/id\/1466"},"seq":1},{"created":"2026-09-09T13:47:44Z","object_id":{"id":2427,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_content_security_header","title":"observe_content_security_header(Default, Acc, Context)","uri":"https:\/\/zotonic.com\/id\/2427"},"seq":2}],"predicate":{"id":2550,"is_a":["meta","predicate"],"name":"observes","title":{"_type":"trans","tr":{"en":"Observes"}},"uri":"https:\/\/zotonic.com\/id\/observes"}},"subject":{"objects":[{"created":"2026-09-09T13:47:44Z","object_id":{"id":2555,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_reference","title":"Reference","uri":"https:\/\/zotonic.com\/id\/2555"},"seq":1},{"created":"2026-09-09T13:47:44Z","object_id":{"id":2561,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_content_editor","title":"Content editor","uri":"https:\/\/zotonic.com\/id\/2561"},"seq":2},{"created":"2026-09-09T13:47:44Z","object_id":{"id":2569,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_metadata","title":"Metadata","uri":"https:\/\/zotonic.com\/id\/2569"},"seq":3},{"created":"2026-09-09T13:47:44Z","object_id":{"id":2587,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_search_engine_optimization","title":"Search engine optimization","uri":"https:\/\/zotonic.com\/id\/2587"},"seq":4},{"created":"2026-09-09T13:47:44Z","object_id":{"id":2635,"is_a":["categorization","keyword","keyword_architecture"],"name":"zotonic_topic_module","title":"Module","uri":"https:\/\/zotonic.com\/id\/2635"},"seq":5}],"predicate":{"id":308,"is_a":["meta","predicate"],"name":"subject","title":{"_type":"trans","tr":{"en":"Keyword"}},"uri":"http:\/\/purl.org\/dc\/elements\/1.1\/subject"}}},"id":1535,"is_a":["text","documentation","reference","module"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1535"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_module_mod_seo","page_url":{"en":"https:\/\/zotonic.com\/docs\/1535\/mod_seo","x-default":"https:\/\/zotonic.com\/docs\/1535\/mod_seo"},"preview_url":null,"resource":{"version":3985,"pivot_location_lat":null,"title":"mod_seo","is_authoritative":true,"body":"<p>Adds basic search engine optimization to the base templates and provides an admin interface for configuring SEO options\nand Google Universal Analytics.<\/p>\n<h2>SEO data<\/h2>\n<p>mod_seo adds metadata to your pages to improve your website’s display and ranking in search engine (e.g. Google)\nresults. This metadata includes <a href=\"https:\/\/developers.google.com\/search\/docs\/guides\/intro-structured-data\">structured data<\/a>:<\/p>\n<p>Google uses structured data that it finds on the web to understand the content of the page, as well as to gather\ninformation about the web and the world in general.<\/p>\n<p>Following Google’s recommendations, mod_seo adds data in the <a href=\"https:\/\/schema.org\">Schema.org<\/a> vocabulary, using the\nJSON-LD format. This enables <a href=\"https:\/\/developers.google.com\/search\/docs\/guides\/search-features\">search features<\/a> such as\nrich results, carousels and the sitelinks searchbox.<\/p>\n<div class=\"admonition note\"><p class=\"first admonition-title\">Tip<\/p><p class=\"last\">If you wish to alter the structured data, you can do so by overriding the <code>schema_org\/schema.*.tpl<\/code> templates. When you\ndo so, make sure to validate your changes with Google’s <a href=\"https:\/\/search.google.com\/structured-data\/testing-tool\">structured data testing tool<\/a>.<\/p><\/div>\n<h2>Configuration<\/h2>\n<h3>Disable search engine indexing<\/h3>\n<p>To prevent search engines from indexing a page, check the ‘Ask Google not to index this page’ checkbox in the admin.\nProgrammatically, you can set the <code>seo_noindex<\/code> flag on a resource to do the same.<\/p>\n<p>Generated pages can pass the <code>seo_noindex<\/code> template variable. By default this emits <code>noindex,nofollow<\/code>. Pass\n<code>seo_follow<\/code> as well for navigation or search pages whose linked content should remain discoverable:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% extends &quot;base.tpl&quot; seo_noindex seo_follow %}\n<\/code><\/pre>\n<p>The site-wide noindex setting always emits <code>noindex,nofollow<\/code>, regardless of these page-level variables.<\/p>\n<p>To disable indexing for the site as a whole, go to Modules &gt; SEO in the Admin (<code>https:\/\/yoursite\/admin\/seo<\/code>) and tick\nthe ‘Exclude this site from search engines’ checkbox.<\/p>\n<h3>Google Analytics<\/h3>\n<p>To enable <a href=\"https:\/\/support.google.com\/analytics\/answer\/2790010\">Google Universal Analytics<\/a> tracking on your Zotonic\nwebsite, go to <code>https:\/\/yoursite\/admin\/seo<\/code> in your browser and enter your Google Analytics tracking code.<\/p>\n<p>Zotonic does not automatically supports the <a href=\"https:\/\/support.google.com\/analytics\/answer\/3123662\">User ID Analytics\nfeature<\/a>. You have to <a href=\"https:\/\/support.google.com\/analytics\/answer\/3123666\">enable User\nID<\/a> in your Analytics account and override the <code>_ga_params.tpl<\/code>\ntemplate to add the parameter:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{#\n    Override this template to provide extra Google Analytics parameters.\n    See https:\/\/developers.google.com\/analytics\/devguides\/collection\/analyticsjs\/field-reference\n#}\n{\n    {% if m.acl.user %}\n        &quot;userId&quot;: &quot;{{ m.acl.user|escapejs }}&quot;,\n    {% endif %}\n}\n<\/code><\/pre>\n<h3>Extra parameters<\/h3>\n<p>If you wish to add extra <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/analyticsjs\/field-reference\">Google Analytics\nparameters<\/a>, override the\n<code>_ga_params.tpl<\/code> file and add the parameters:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{#\n    Override this template to provide extra Google Analytics parameters.\n    See https:\/\/developers.google.com\/analytics\/devguides\/collection\/analyticsjs\/field-reference\n#}\n{\n    {% if m.acl.user %}\n        &quot;userId&quot;: &quot;{{ m.acl.user|escapejs }}&quot;,\n    {% endif %}\n    &quot;sessionControl&quot;: &quot;start&quot;\n}\n<\/code><\/pre>\n<p>SEO module that adds metadata generation and admin SEO configuration options.<\/p>\n<h2>Accepted Events<\/h2>\n<p>This module handles the following notifier callbacks:<\/p>\n<ul><li><code>observe_admin_menu<\/code>: Contribute module entries to the admin menu tree.<\/li><li><code>observe_content_security_header<\/code>: Ensure that the Google Tag manager works correctly with our CSP using <code>m_config:get_value<\/code>.<\/li><\/ul>","slug":"mod_seo","is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"doc_source_hash":"6207e2b3f62da58396bd04ea012500c2f0454447d3b2a5a5833641125848f97c","is_featured":false,"content_group_id":{"id":2551,"is_a":["meta","content_group"],"name":"content_group_imported_docs","title":"Imported documentation","uri":"https:\/\/zotonic.com\/id\/content_group_imported_docs"},"category_id":{"id":320,"is_a":["meta","category"],"name":"module","title":"Modules","uri":"https:\/\/test.zotonic.com\/id\/320"},"doc_source_path":"apps\/zotonic_mod_seo\/src\/mod_seo.erl","publication_start":"2023-06-24T08:17:45Z","github_url":"https:\/\/github.com\/zotonic\/zotonic\/blob\/master\/apps\/zotonic_mod_seo\/src\/mod_seo.erl","pivot_location_lng":null,"doc_source_kind":"module","name":"doc_module_mod_seo","is_unfindable":false,"is_published":true,"pivot_geocode":null,"created":"2020-05-30T05:47:25Z","uri":null,"doc_status":"current","is_dependent":false,"erlang_app":"zotonic_mod_seo","publication_end":"9999-06-01T00:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_source_commit":"85498256abd162b9bc082d43a90c995844fd4408\n","creator_id":{"id":336,"is_a":["person","robot"],"name":"gitbot","title":"Git","uri":"https:\/\/zotonic.com\/id\/336"},"modified":"2026-09-29T14:40:10Z","title_slug":"mod_seo"},"uri":"https:\/\/zotonic.com\/id\/1535","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1535"}},"status":"ok"}