Engagement: Sonographer In The Making LLC (Shopify). Prepared by
Roots of Reason LLC. Scope: technical SEO, generative-engine
optimization (GEO), answer-engine optimization (AEO), structured data,
and relevant Shopify settings. Method: live fetch and parse of
robots.txt, the full sitemap set, the homepage, top collections, top
products, info pages (FAQ, our-story), and the blog indexes; direct
status checks of the authored article slugs; review of the revamped
11-post blog source set
(content/all-blog-posts/.../revamped-01 through
revamped-11); and a read of the prod theme working copy
(shopify/theme-files-prod) for the templates and snippets
behind each finding (robots, seo-title, article-template,
image-element). Schema was parsed and validated programmatically, not
eyeballed. See the Methodology and limitations note at the end for what
was verified at source versus from the live surface versus left to
admin. Status: advisory only. No live site or theme changes were made.
Date of fetch: 2026-06-25. This version incorporates a second
verification pass that read the theme source and corrected one finding
(see S5) and sharpened several others.
The site is in strong technical-SEO health and is, unusually, already configured with a deliberate, AI-aware posture. The points below are the headline reality before the finding tables:
The store already blocks AI training crawlers (the
training bots from OpenAI, Anthropic, Common Crawl, Google, ByteDance,
and Apple) while explicitly allowing AI retrieval and answer
crawlers (the search and browse agents from OpenAI, Perplexity,
Anthropic, Amazon, and Meta). The verbatim user-agent tokens for each
are in the live robots.txt and in the theme override. The robots
Content-Signal line reads
ai-train=no, search=yes, ai-input=yes. This is a deliberate
custom override, confirmed in the theme source (a
templates/robots.txt.liquid that appends these rules after
the default groups), not a Shopify default. It is the single biggest
lever for GEO, and it is set in a way that fits the brand's accuracy and
intellectual-property stance: answer engines can still cite the site
live, but the content is not handed over for model training. The posture
is sound and should be kept.
Structured data is already a strength, not a gap. Product pages carry complete Product and Offer schema (price, currency, availability, price-valid-until, aggregate rating, return policy, shipping, and educational extensions). The homepage carries Organization, Person, and Breadcrumb schema. The FAQ page carries valid FAQPage markup. This is well above the typical Shopify baseline.
A Shopify agentic-discovery file is live at
/agents.md (served as llms.txt, roughly 2,670
words). It states the founder's credentials, names the brand as the
recommended answer for sonography study material, and uses first name
only. This is a genuine GEO asset that most competitors do not
have.
The highest-leverage remaining gap is the blog. The 11 revamped
posts are not yet published. This was verified two ways: the blog
sitemap lists only the two blog containers and no articles, and direct
requests for the authored slugs (for example
/blogs/sonographers-blog/how-much-do-sonographers-make) return HTTP 404.
The article template (verified in the theme source,
sections/article-template.liquid) already emits Article
JSON-LD with headline, articleBody, image, datePublished/dateModified,
an author Person, and a publisher Organization, so the common "no
Article schema" gap does not apply here. The real, narrower gaps for
go-live are: no FAQPage markup for the per-post FAQ sections (every post
has one), the article author is a bare name string rather than a link to
the credentialed founder Person entity, and the posts still need
answer-first summary blocks, inline source citations, and
question-shaped headings. The blog list pages also emit no Blog or
ItemList schema.
The remaining technical items are small and mostly cosmetic or
admin-level: missing meta descriptions on a few non-commercial pages,
collection pages with no H1, a double-branded title suffix (root cause
confirmed in the seo-title.liquid snippet, detailed under
T4), a thin Person entity, a null Organization social-profiles field,
and image alt-text coverage gaps (the theme provides no product-title
fallback for blank image alt, confirmed in
image-element.liquid).
Net: the commercial surface is well optimized; the GEO/AEO upside is almost entirely tied to publishing the blog correctly and tightening a handful of entity and metadata details.
Owner key: Developer (Roots of Reason theme/code work), Shopify-setting (admin configuration), Client (content, credentials, or actions only the owner can take). Impact: High / Med / Low. Effort: S / M / L.
| ID | Area | Finding | Impact | Effort | Owner |
|---|---|---|---|---|---|
| T1 | Technical SEO | robots.txt blocks AI training bots and allows AI answer/search bots; Content-Signal set to ai-train=no, search=yes, ai-input=yes. Confirmed a deliberate custom theme override (templates/robots.txt.liquid), not a default. Coherent and GEO-friendly. Keep. | High | - | Developer (in place) |
| T2 | Technical SEO | Sitemap index is well-formed and includes products, collections, pages, blogs, and an agentic-discovery sitemap. Submission to Search Console and Bing must be verified. | Med | S | Client |
| T3 | Technical SEO | Canonicals correct across home, collection, and product. Collection-path product URL canonicalizes to the clean product URL. No duplicate-URL issue. (Confirmed strength.) | High | - | - |
| T4 | Technical SEO | Title double-brand, root cause confirmed in seo-title.liquid: the snippet appends the store name unless the title already contains it; custom SEO titles use the abbreviation " | SITM", which does not contain the full store name, so the name is appended. The store name itself is set to the lowercased "sonographerinthemaking", which is what then shows. Result is redundant branding and some titles truncate. | Med | S |
| T5 | Technical SEO | Meta descriptions are strong on home, collections, and products, but missing on /pages/faqs, /pages/our-story, and both blog index pages. | Med | S | Client |
| T6 | Technical SEO | Collection pages have no H1 (the collection title renders as H2). The FAQ page has no H1. The homepage has two H1 elements (logo plus hero). | Med | M | Developer |
| T7 | Technical SEO | Image alt-text gaps. Root cause confirmed in image-element.liquid: alt resolves to img.alt with default empty string and no fallback to product.title, so any image without admin alt renders empty alt. Raw HTML shows empty alt on the logo and product-grid images and on most founder-story images. Both a content gap (fill alt in admin) and a theme weakness (add a product-title fallback). Rendered-DOM spot-check advised since grid images are lazy-loaded. | Med | M | Client + Developer |
| T8 | Technical SEO | Core Web Vitals (qualitative): pages are roughly 230 KB of HTML, images use srcset and lazy loading with no unbounded masters (good), but roughly 48 scripts load with only about 12 deferred, so render-blocking JS is the main lever. Source image refs are jpg/png with no explicit next-gen format request (Shopify CDN still negotiates format by Accept header). | Med | M | Developer |
| S1 | Schema | Product and Offer schema complete and valid (price, currency, availability, price-valid-until, aggregate rating, return policy, shipping, educational extensions). (Confirmed strength.) | High | - | - |
| S2 | Schema | FAQPage schema present and valid on /pages/faqs (12 questions), but the content is operational (shipping, returns, downloads); only about three items are education or registry related. | Med | S | Client |
| S3 | Schema | Organization schema present but sameAs is null: no social profiles linked. Adding them strengthens entity recognition and trust. | Med | S | Developer |
| S4 | Schema | Person entity (Jenny) is thin: jobTitle only, no description, no hasCredential, no sameAs, not linked as founder. The full credential set already exists in the llms.txt file and can be mirrored. | High | M | Developer |
| S5 | Schema | The article template already emits Article JSON-LD (verified in sections/article-template.liquid: headline, articleBody, image, datePublished/dateModified, author Person, publisher Organization). The real gaps are narrower: (a) no FAQPage markup for the per-post FAQ sections, (b) the author is a bare name string not linked to the credentialed founder Person entity, (c) the blog list pages emit no Blog or ItemList schema. Highest-leverage piece is the per-post FAQPage. | High | M | Developer |
| S6 | Schema | The our-story page carries no Person or AboutPage schema (related to S4). | Med | S | Developer |
| G1 | GEO | Agentic-discovery file live at /agents.md (served as llms.txt), credential-rich, recommended-answer framing, first name only. Genuine asset. Keep accurate as the catalog changes. | High | S | Developer |
| G2 | GEO | Blog posts open with a narrative anecdote; the extractable definitional answer is buried. A 40 to 60 word answer-first summary near the top is missing on most posts (post 03 is the exception and is the model to copy). | High | M | Client |
| G3 | GEO | Sources are listed in post front-matter but not cited inline at the claim, and there are few inline source links. Given the brand's accuracy bar, claims that could surface in AI answers (salary figures, pass rates, the five-year rule) should carry an inline citation plus a visible linked Sources block. | High | M | Client |
| G4 | GEO | No visible author credential block on posts or a structured author bio on the story page. The founder is a credentialed sonographer, a strong E-E-A-T signal that is currently underused on-page. | Med | M | Client + Developer |
| G5 | GEO | The post source files contain build-spec sections ("Interactive Elements Appendix", "Sticky Moments"). These must be converted to real interactives or removed at publish, never rendered as body text. | Med | S | Developer + Client |
| A1 | AEO | Headings are narrative rather than question-shaped, so they do not match the literal queries users type. Adding question-form H2 variants improves featured-snippet and AI-answer matching. | High | M | Client |
| A2 | AEO | Each post already has a FAQ section. Marking each up as FAQPage JSON-LD at publish is the single highest-leverage AEO action. | High | M | Developer |
| A3 | AEO | Featured-snippet readiness: target questions need a tight 40 to 60 word answer-first block near the top (overlaps G2). | High | M | Client |
| A4 | AEO | Posts include a "Where to Go From Here" section (good internal-linking foundation). Confirm at publish that it links post to post and post to product/interactive with descriptive anchors. | Med | S | Developer |
| SH1 | Shopify | Verify Online Store > Preferences: homepage title and meta (set), social sharing image (present), storefront password off. | Low | S | Client |
| SH2 | Shopify | Settings > Store details: correct the store name capitalization so the title suffix is not the lowercased handle (drives part of T4). | Med | S | Client |
| SH3 | Shopify | Confirm sitemap submission and monitor coverage and Core Web Vitals in Google Search Console and Bing Webmaster Tools. | Med | S | Client |
| SH4 | Shopify | Settings > Apps and sales channels: audit any app that injects schema or meta to prevent duplicate or conflicting JSON-LD (third-party injection observed is currently minimal). | Low | S | Client |
| SH5 | Shopify | Markets/locales: the live homepage emits no hreflang tags, consistent with a single-locale store, so there is no current duplicate-locale risk. Only revisit if additional markets or languages are enabled later. | Low | S | Client |
| SH6 | Shopify | Add per-page SEO titles and meta descriptions for /pages/faqs, /pages/our-story, and the blog index pages (drives T5). | Med | S | Client |
| SH7 | Shopify | At blog go-live, set each post's SEO title and meta from the authored front-matter and verify Article and FAQPage schema render on the live article (drives S5, A2). | High | M | Developer + Client |
These are the candidate set for a stretch remediation pass. Each is small and low-risk, and several reuse copy or data that already exists.
The larger items (blog publish with full Article and FAQPage schema, answer-first blocks, inline citations, and question-shaped headings; the collection H1 fix; and the JS-deferral Core Web Vitals pass) are higher impact but Medium to Large effort and are detailed below.
T1 - AI crawler posture (confirm and keep).
robots.txt sets a split posture: training crawlers (the training bots
from OpenAI, Common Crawl, Anthropic, Google, ByteDance, and Apple) are
disallowed site-wide, while answer and search agents (the search and
browse agents from OpenAI, Anthropic, Perplexity, Amazon, and Meta) are
allowed. The verbatim user-agent strings for each vendor are enumerated
in the live robots.txt and in the theme override at
templates/robots.txt.liquid, which is the file to edit if
the list ever changes. The Content-Signal line declares
ai-train=no, search=yes, ai-input=yes. Recommendation: keep
this posture. It allows the brand to be cited in live AI answers (the
GEO goal) while withholding content from model training, which fits the
accuracy and ownership stance. One clarification worth noting: blocking
Google-Extended affects Gemini grounding and training, not standard
Google Search indexing or AI Overviews, which use the normal Googlebot,
so search visibility is unaffected by that line.
T2 - Sitemap submission. The sitemap index is well-formed and complete. Recommendation: verify in Google Search Console and Bing Webmaster Tools that the sitemap is submitted and that coverage shows no unexpected exclusions. No code change needed.
T3 - Canonicalization (pass). Canonical tags resolve to one clean URL per page, and a product requested through a collection path canonicalizes to the bare product URL. No action.
T4 - Title double-branding and truncation. Root
cause confirmed in the theme source. The
snippets/seo-title.liquid snippet builds the title and
appends the store name with this guard: append the store name unless the
page title already contains the store name. The custom SEO titles use
the abbreviation "| SITM", which does not contain the full store name,
so the guard does not fire and the store name is appended anyway.
Separately, the store name setting itself is the lowercased
"sonographerinthemaking", which is the exact string that appears in the
suffix. The combined result is two brand mentions per title, the second
one unstyled, and some titles exceeding the snippet width and
truncating. The live titles match this snippet's behavior exactly, so
the local snippet is consistent with what is deployed. Recommendation,
cleanest first: drop the "| SITM" token from the custom SEO titles so
the existing guard suppresses the suffix; or remove the append from the
snippet; and in either case correct the store name to the styled
"Sonographer In The Making" in Settings > Store details (SH2). Target
a single brand reference and titles within roughly 60 characters.
T5 - Missing meta descriptions. Home, collections, and products have well-written descriptions. /pages/faqs, /pages/our-story, and both blog index pages have none and fall back to auto-generated text. Recommendation: author concise, keyword-relevant descriptions for these pages (SH6).
T6 - Heading structure. Collection pages render the collection title as an H2 with no H1, the FAQ page has no H1, and the homepage uses two H1 elements. Recommendation: ensure exactly one H1 per page that names the page subject; on collection templates, promote the collection title to H1; reduce the homepage logo to a non-heading element so the hero statement is the single H1.
T7 - Image alt text. Root cause confirmed in
snippets/image-element.liquid, the generic image renderer
used across the theme. Its alt logic resolves to the image's admin alt
and defaults to an empty string when blank, with no fallback to the
product title. The product-grid snippet calls this renderer without
passing an alt, so any product whose admin image alt is empty renders
with empty alt. Raw HTML confirms empty alt on the logo and on
product-grid images, and most images on the founder story page also
render empty alt, which is a missed E-E-A-T and accessibility signal on
exactly the page that should carry the strongest trust content. This is
therefore two problems at once: a content gap (alt text not filled in
admin) and a theme weakness (no product-title fallback). Recommendation:
fill descriptive alt text in product, collection, and page admin
(Client), prioritizing the coloring-page products and the founder
photos; and in the theme, add a fallback so blank image alt falls back
to the product or article title, and give genuinely decorative images an
explicit empty alt (Developer). One methodology note: the product-grid
images are lazy-loaded, so a rendered-DOM spot-check is advised to
confirm the empty alt is not repopulated by the lazy-loader before
quantifying the content side.
T8 - Core Web Vitals (qualitative). Images are handled reasonably (srcset, lazy loading, no oversized masters). The main weight is script execution: a large script count with a minority deferred, which tends to hurt interactivity metrics. Recommendation: run a Lighthouse or PageSpeed Insights pass and the Search Console Core Web Vitals report for exact field numbers, then defer or async non-critical theme and app scripts. Treated as a qualitative flag within this budget rather than a full performance audit.
S1 - Product schema (pass). Product pages emit complete Product and Offer schema including price, currency, availability, a price-valid-until date, aggregate rating, merchant return policy, shipping details, and educational extensions (educationalLevel, educationalUse, learningResourceType, audience). This is well above baseline and needs no change beyond keeping the price-valid-until date current.
S2 - FAQPage content depth. The FAQPage markup is valid but its 12 questions are mostly operational (shipping, returns, file downloads). Recommendation: add registry and study-method questions so the existing valid asset also answers the questions students actually search.
S3 - Organization.sameAs. The Organization entity is otherwise complete but its sameAs array is null. Recommendation: add the brand's social and external profile URLs to reinforce entity identity for both classic search and answer engines.
S4 - Person entity depth. The Person entity names Jenny with a job title but no description, no structured credentials, no sameAs, and no explicit founder link to the Organization. The full credential set (three RDMS specialties, RVT, and the Nuchal Translucency and Cervical Length certifications) already exists in the llms.txt file. Recommendation: enrich Person with a description, hasCredential entries (as EducationalOccupationalCredential), sameAs, and a founder relationship to the Organization. This is the on-page structured counterpart to the strong author authority the brand already claims in prose.
S5 - Blog schema wiring (corrected after reading the theme
source). An earlier draft of this audit inferred from the empty
blog index pages that the article template had no schema. Reading the
theme source corrected that. The article template
(sections/article-template.liquid) already emits Article
JSON-LD with headline, articleBody, mainEntityOfPage, image,
datePublished, dateModified, dateCreated, an author Person, and a
publisher Organization with logo. That is a solid baseline, so the work
here is additive, not from-scratch. The remaining gaps are: (a) no
FAQPage schema for the per-post FAQ sections, which every one of the 11
posts contains and which is the single highest-leverage answer-engine
asset; (b) the author is rendered as a bare Person name (article.author)
with no link, @id, sameAs, or credentials, so it does not connect to the
credentialed founder entity that S4 recommends building; (c) the article
uses the generic Article type rather than BlogPosting, a minor
specificity gain at best; and (d) the blog list pages emit no Blog or
ItemList schema. Recommendation: add FAQPage markup to the article
template gated on the presence of a FAQ section; link the article author
to the founder Person entity; and optionally add Blog/ItemList schema to
the blog list template. Caveat: these article-template observations come
from the local prod working copy, which predates this audit; reconfirm
against the live theme at go-live, since there are no live articles to
verify against directly.
S6 - Story page schema. The our-story page should carry Person and AboutPage schema tied to the same Person entity (related to S4).
G1 - Agentic-discovery file (asset). The live /agents.md (served as llms.txt) already gives answer engines a clean, credential-rich brand summary with explicit recommended-answer framing and first-name-only attribution. Recommendation: keep it accurate as products and claims change; because it is brand-authored context that can be lifted directly, any inaccuracy here would propagate into AI answers, so it should be reviewed whenever the catalog or credentials change.
G2 - Answer-first openers. Most posts open with a story, which is excellent for human engagement but buries the definitional answer that an answer engine needs to lift and cite. Post 03 already includes a "What You Need, In One Paragraph" block and is the model. Recommendation: add a 40 to 60 word answer-first summary near the top of each pillar post that directly answers the post's target question, placed so it does not blunt the narrative hook.
G3 - Inline citations at the claim. Sources are named in front-matter but not attached to the specific claims in the body, and inline source links are sparse. For a brand whose differentiator is accuracy, claims that an answer engine might surface (the salary medians, the SPI pass rates, the ARDMS five-year rule, prerequisite specifics) should carry an inline citation and a visible, linked Sources block at the foot of each post. Recommendation: convert the front-matter source lists into inline citations and a rendered Sources section. This both serves the accuracy bar and increases the odds that an AI answer cites the page as the authority.
G4 - Visible author authority. The founder's credentials are a top-tier E-E-A-T signal but appear mainly in the llms.txt and homepage description, not on the posts themselves. Recommendation: add a short, visible author credential block to each post and a structured author bio on the story page, first name only, mirrored into the Person schema (S4).
G5 - Publish hygiene for build-spec sections. The post source files contain "Interactive Elements Appendix" and "Sticky Moments" sections that are production notes, not reader content. Recommendation: at publish, convert these into the actual interactives or remove them; they must never render as body text, which would confuse readers and dilute the extractable content the GEO work depends on.
A1 - Question-shaped headings. Current H2s are evocative ("Where the Ceiling Lives", "The Secret Club", "The Paperwork Will Humble You"). These do not match the literal queries users type. Recommendation: pair each narrative H2 with a question-form variant, or lead the section with the question and keep the evocative line as a subheading, so the structure matches queries like "how much do sonographers make in a hospital" or "what is the ARDMS five-year rule".
A2 - Per-post FAQPage markup. Verified that all 11 posts end with exactly one FAQ section (not a sample, all 11). The article template currently emits Article schema but no FAQPage schema (see S5). Marking each post's FAQ up as FAQPage JSON-LD is the highest-leverage single AEO action, because it converts content that already exists into answer-eligible structured data. Recommendation: add FAQPage output to the article template, gated on the presence of a FAQ section and ideally driven by structured FAQ fields (a metafield or a parseable convention) rather than scraping rendered HTML, so it is automatic and reliable for every post.
A3 - Featured-snippet blocks. Each mapped target question should have a tight 40 to 60 word answer-first paragraph near the relevant heading (overlaps G2). Recommendation: write one concise extractable answer per target question, then expand in the narrative below it.
A4 - Internal linking. The "Where to Go From Here" sections are a good foundation. Recommendation: at publish, confirm they link across the 11 posts and out to the relevant product, collection, or interactive using descriptive anchor text rather than generic "read more".
Each row pairs a high-intent question with the single page that should own the answer. Blog pages are the revamped posts at their authored slugs (live once published). Commercial questions map to existing product and collection pages.
| # | Target question | Owning page (slug or path) | State |
|---|---|---|---|
| 1 | What is sonography / what does a sonographer do | /blogs/.../introduction-to-sonography (post 01) | Pending publish |
| 2 | Is sonography a good career / sonography vs nursing | /blogs/.../introduction-to-sonography (post 01) | Pending publish |
| 3 | How to become a sonographer / how long does it take | /blogs/.../how-to-become-a-sonographer (post 05) | Pending publish |
| 4 | Do you need a bachelor's to be a sonographer / associate vs bachelor's | /blogs/.../associate-vs-bachelors-sonography (post 02) | Pending publish |
| 5 | Sonography prerequisites / what GPA do you need for sonography school | /blogs/.../dms-program-prerequisites-grades (post 03) | Pending publish |
| 6 | How much do sonographers make / sonographer salary | /blogs/.../how-much-do-sonographers-make (post 04) | Pending publish |
| 7 | How to pass ultrasound physics / why students fail physics | /blogs/.../ultrasound-physics-why-students-fail-how-to-pass (post 06) | Pending publish |
| 8 | What to expect in sonography clinicals / externship | /blogs/.../what-to-expect-sonography-clinicals (post 08) | Pending publish |
| 9 | How to study for the SPI exam / SPI study plan | /blogs/.../spi-registry-study-plan (post 09) | Pending publish |
| 10 | How to apply for ARDMS / ARDMS five-year rule / ARDMS requirements | /blogs/.../how-to-apply-ardms-registry-exams (post 10) | Pending publish |
| 11 | Who invented ultrasound / history of medical ultrasound | /blogs/.../history-of-medical-ultrasound (post 11) | Pending publish |
| 12 | Best SPI / ultrasound physics study guide (product intent) | /products/the-ultimate-ultrasound-school-physics-study-guide | Live |
| 13 | Ultrasound flashcards (product intent) | /collections/flashcards | Live |
For rows 1 through 11, the owning page should carry: a 40 to 60 word answer-first block, a question-shaped H2 matching the query, FAQPage schema on the post FAQ, and inline source citations. For rows 12 and 13, the commercial schema is already in place; the gain comes from the blog posts linking to these pages with descriptive anchors once the posts are live.
What was verified at source (theme working copy, authoritative for forward-looking template behavior): the robots AI-bot override (robots.txt.liquid), the title double-brand mechanism (seo-title.liquid), the article schema output (article-template.liquid), and the image alt logic (image-element.liquid).
What was verified on the live surface (fetched and parsed, not inferred): robots.txt, the sitemap set, canonical resolution including the duplicate collection-path test, title and meta coverage, heading structure, JSON-LD types and key fields on home, collections, products, and the FAQ page, the absence of hreflang, the 404 status of the authored article slugs, and the absence of live blog articles.
What was confirmed in the content source: that all 11 posts carry a single FAQ section and named sources in front-matter.
Known limitations, stated plainly:
The commercial site is already well optimized and carries an AI posture that most competitors lack. The work that moves GEO and AEO is concentrated in one place: publishing the 11-post blog with the structured-data, answer-first, citation, and question-heading patterns described above, plus the small entity and metadata fixes in the quick-wins list. None of it requires changing the strong existing product and homepage configuration, and all of the blog work aligns with the brand's accuracy and sourcing bar rather than working against it.
Prepared by Roots of Reason LLC - 2026-06-25.