Varför vi har robotar
Vi har två robotar.
- TodasBot vaktar varje natt de butiker som har kopplat sig till oss. Det gör vi på butiksägarens uppdrag: butiken har själv installerat vår app. TodasBot läser också en butik utifrån när butiken ber oss om en genomlysning, och den läser andra webbplatser och plattformarnas egna dokumentationssidor i arbetet för våra kunder.
- TodasDatastudie hämtar underlag till vår datastudie om hur redo svenska webbutiker är för AI-handel. Den har en egen sida: Om roboten TodasDatastudie.
TodasBot
TodasBot presenterar sig så här:
TodasBot/1.0 (<del>; +https://todas.se/robotar)Delen före semikolonet säger vilken del av tjänsten som hämtar, till exempel:
TodasBot/1.0 (Nattvakt; +https://todas.se/robotar)Delen kan ha ett tillägg, som Nattvakt kassaprov. Ibland behöver vi se en sida som en besökare ser den. Då använder TodasBot en vanlig webbläsares User-Agent, med TodasBot sist:
Mozilla/5.0 (…) Chrome/… Safari/537.36 TodasBot/1.0 (Nattvakt; +https://todas.se/robotar)| Del | Vad den hämtar | Hur ofta | Prövar robots.txt |
|---|---|---|---|
Nattvakt | Butiker som har kopplat sig till oss: våra kunder och butiker som provar tjänsten inför ett avtal. Startsidan, produkt- och kategorisidor, policysidor, robots.txt, webbplatskartan, produkt- och prisflöden, sökförslag samt butikens Storefront API och agentgränssnitt (UCP). Den gör också ett provköp: en vara läggs i varukorgen och kassan öppnas, men inget köps. Hos butiker som provar tjänsten görs inget provköp. | Varje natt, och en natt i veckan med några kontroller till. Provköpet görs också var tredje timme dagtid, fyra gånger om dagen. Hos butiker som provar tjänsten högst 14 nätter. | Nej, ägarens uppdrag |
Synlighet | Kopplade butikers startsida. | En gång i månaden. | Nej, ägarens uppdrag |
AI-synlighet, AI-kallkarta | Kopplade butikers startsida och policysidor för retur och frakt, för att jämföra det butiken säger med det AI-tjänsterna och Google säger om den. | AI-synlighet varje vecka och i nattens kontroller, AI-kallkarta när vi tar fram den. | Nej, ägarens uppdrag |
Genomlysning, Installningskontroll, Halsokoll, Onboarding, GscSynk, Lankkontroll, Sitemap, Page audit | Enstaka sidor i kopplade butiker, till exempel startsidan, robots.txt, webbplatskartan, 404-sidan, några produkt- och kategorisidor och produktlistan. Lankkontroll provar länkarna i texter vi skrivit innan de publiceras. | I samband med arbetet: en genomlysning, en kontroll, en synk eller en publicering. Onboarding varje dag medan butiken är i uppstart. | Nej, ägarens uppdrag |
Flytt | Vid en flytt till Shopify: produkterna i kundens gamla WooCommerce-butik, genom butikens API med nycklar som butiksägaren har gett oss. | Under flytten. | Nej, ägarens uppdrag |
Prospektlasning | Butiker som ber om en genomlysning, lästa utifrån som en besökare ser dem: startsidan, produkt-, kategori- och policysidor och webbplatskartan. | När butiken ber om det. | Ja |
Lasare | Högst 25 av de sidor på en webbplats som rankar i Google, för att se vad de svarar, till exempel inför en flytt. | När vi ber om det. | Ja |
Kallkoll | Källsidor, till exempel tillverkares produktsidor, när vi kontrollerar uppgifter i en produkttext mot källan. | När en text granskas. | Ja |
Offpage | Startsidan på webbplatser som kan länka till våra kunder och varumärkens återförsäljarsidor, ibland laddade i en webbläsare. | Den 3:e varje månad, och när vi tar fram en lista. | Ja |
Plattformsvakt | Nyhetsflöden och dokumentationssidor hos Shopify, Google, Bing, OpenAI, Cloudflare och AI-bolagen, och Googles statussida när ett larm behöver kontrolleras. GitHub läses genom GitHubs API. Det är inga butiker. | Varje dag. | Ja |
Temabutiken | Sidan för butikens tema i Shopifys temabutik (themes.shopify.com), för att se när en ny version kommer. | Varje natt, en gång per tema. | Ja |
Renderare | Sidor som behöver laddas i en riktig webbläsare med JavaScript, åt delarna ovan. En sida i taget. Bilder, typsnitt och media hämtas inte. | När någon av de andra delarna behöver det. | Som delen den hämtar åt |
Så tar TodasBot hänsyn
- I butiker som har kopplat sig till oss arbetar TodasBot på butiksägarens uppdrag. Den läser därför också sidor som robots.txt stänger för sökmotorer, till exempel varukorgen och kassan, eftersom den provar att köpflödet fungerar.
- På alla andra webbplatser läser TodasBot robots.txt först och följer reglerna för TodasBot, eller för alla robotar (
*) när det inte finns några för TodasBot. Stänger robots.txt ute TodasBot hämtar vi inte sidan. Saknas filen (404) är allt tillåtet. Går den inte att läsa (till exempel 401, 403, 429, ett serverfel eller inget svar) vet vi inte vad butiken vill, och då läses sidan. - När TodasBot läser en butik utifrån inför en genomlysning, läser källsidor eller kontrollerar en webbplats sidor gör den högst ett anrop i sekunden.
- Ber butiken oss vänta, med 429 eller 503 och Retry-After, väntar TodasBot och försöker en gång till. Väntan är högst 60 sekunder per gång och högst två minuter per butik och natt. Ber butiken om längre tid lämnar vi sidan oläst.
- Den loggar aldrig in i butiken, fyller aldrig i formulär och slutför aldrig ett köp. Provköpet lägger en vara i varukorgen och öppnar kassan, inget mer.
- Den använder bara sitt eget namn. Vi skickar inga anrop under andra robotars namn. Stänger en webbplats ute TodasBot, med robots.txt eller på annat sätt, läser vi inte sidan.
- För några kontroller skickar vi utvalda meningar ur butikens publika sidor, till exempel policyer och texter om produkter och kategorier, till en AI-modell hos Anthropic. Modellen letar efter motsägelser, till exempel två olika returfrister.
Så känner du igen TodasBot
Alla anrop från TodasBot signeras med Web Bot Auth, som bygger på HTTP Message Signatures (RFC 9421), också sidor vi laddar i en riktig webbläsare. Ett signerat anrop har rubrikerna Signature, Signature-Input och Signature-Agent.
- Signature-Agent:
https://portal.todas.se - Nyckelkatalogen: https://portal.todas.se/.well-known/http-message-signatures-directory
Katalogen innehåller vår publika nyckel. Med den kan du kontrollera att ett anrop kommer från oss. Svaret från katalogen är självt signerat med samma nyckel.
Anropen kommer från våra servrar hos Railway och Vercel. Vi har inga fasta IP-adresser. Signaturen är därför sättet att känna igen oss.
Så avstår en butik
Är butiken inte kopplad till oss, lägg till raderna i robots.txt:
User-agent: TodasBot
Disallow: /Du kan också mejla oss på info@todas.se. TodasDatastudie har egna rader, som står på sidan om roboten.
Är butiken kopplad till oss är nattvakten en del av tjänsten. Vill du inte ha den, hör av dig till oss. Då stänger vi av vakten för din butik.
Todas AB, Varberg. Organisationsnummer 559381-3271.
In English
Todas AB is a Shopify agency in Varberg, Sweden. We build, migrate and develop Shopify stores for businesses and maintain them after launch. In this work our bot TodasBot fetches pages from online stores. This section describes what it fetches, how to identify it and how a store can opt out.
Why we operate bots
We operate two bots.
- TodasBot monitors the stores connected to us every night. We do this on the store owner's behalf: the store has installed our app itself. TodasBot also reads a store from the outside when the store asks us for an audit, and it reads other websites and the platforms' own documentation pages in our work for our clients.
- TodasDatastudie collects data for our study of how ready Swedish online stores are for AI commerce. It has its own page, in Swedish: Om roboten TodasDatastudie.
TodasBot
TodasBot identifies itself like this:
TodasBot/1.0 (<del>; +https://todas.se/robotar)The part before the semicolon tells which part of the service is fetching, for example:
TodasBot/1.0 (Nattvakt; +https://todas.se/robotar)The part may carry an addition, such as Nattvakt kassaprov (checkout test). Sometimes we need to see a page the way a visitor sees it. TodasBot then uses an ordinary browser's User-Agent, with TodasBot at the end:
Mozilla/5.0 (…) Chrome/… Safari/537.36 TodasBot/1.0 (Nattvakt; +https://todas.se/robotar)| Part | What it fetches | How often | Checks robots.txt |
|---|---|---|---|
Nattvakt | Stores connected to us: our clients and stores trying the service before signing. The home page, product and collection pages, policy pages, robots.txt, the sitemap, product and price feeds, search suggestions, and the store's Storefront API and agent interface (UCP). It also runs a test purchase: an item is added to the cart and checkout is opened, but nothing is bought. No test purchase is made in stores trying the service. | Every night, with a few more checks one night a week. The test purchase also runs every three hours during the day, four times a day. In stores trying the service, at most 14 nights. | No, on the owner's behalf |
Synlighet | Connected stores' home page. | Once a month. | No, on the owner's behalf |
AI-synlighet, AI-kallkarta | Connected stores' home page and return and shipping policy pages, to compare what the store says with what AI services and Google say about it. | AI-synlighet every week and in the nightly checks, AI-kallkarta when we produce it. | No, on the owner's behalf |
Genomlysning, Installningskontroll, Halsokoll, Onboarding, GscSynk, Lankkontroll, Sitemap, Page audit | Individual pages in connected stores, such as the home page, robots.txt, the sitemap, the 404 page, a few product and collection pages and the product list. Lankkontroll tests the links in texts we have written before they are published. | As part of the work: an audit, a check, a sync or a publication. Onboarding every day while the store is being set up. | No, on the owner's behalf |
Flytt | During a migration to Shopify: the products in the client's old WooCommerce store, through the store's API with keys the store owner has given us. | During the migration. | No, on the owner's behalf |
Prospektlasning | Stores that ask for an audit, read from the outside as a visitor sees them: the home page, product, collection and policy pages and the sitemap. | When the store asks for it. | Yes |
Lasare | At most 25 of a site's pages that rank in Google, to see how they respond, for example before a migration. | When we ask for it. | Yes |
Kallkoll | Source pages, such as manufacturers' product pages, when we check facts in a product text against the source. | When a text is reviewed. | Yes |
Offpage | The home page of sites that could link to our clients and brands' retailer pages, sometimes loaded in a browser. | On the 3rd of every month, and when we produce a list. | Yes |
Plattformsvakt | News feeds and documentation pages from Shopify, Google, Bing, OpenAI, Cloudflare and the AI companies, and Google's status page when an alert needs checking. GitHub is read through GitHub's API. These are not stores. | Every day. | Yes |
Temabutiken | The page for the store's theme in Shopify's theme store (themes.shopify.com), to see when a new version is released. | Every night, once per theme. | Yes |
Renderare | Pages that need to be loaded in a real browser with JavaScript, for the parts above. One page at a time. Images, fonts and media are not fetched. | When one of the other parts needs it. | As the part it fetches for |
How TodasBot behaves
- In stores connected to us, TodasBot works on the store owner's behalf. It therefore also reads pages that robots.txt closes to search engines, such as the cart and checkout, because it tests that the purchase flow works.
- On every other website TodasBot reads robots.txt first and follows the rules for TodasBot, or for all bots (
*) when there are none for TodasBot. If robots.txt closes the page to TodasBot, we do not fetch it. If the file is missing (404), everything is allowed. If it cannot be read (for example 401, 403, 429, a server error or no response), we do not know what the site wants, and the page is read. - When TodasBot reads a store from the outside for an audit, reads source pages or checks a site's pages, it makes at most one request per second.
- If a store asks us to wait, with 429 or 503 and Retry-After, TodasBot waits and tries once more. The wait is at most 60 seconds each time and at most two minutes per store and night. If the store asks for longer, we leave the page unread.
- It never logs in to the store, never fills in forms and never completes a purchase. The test purchase adds an item to the cart and opens checkout, nothing more.
- It only uses its own name. We never send requests under the name of another bot. If a website blocks TodasBot, through robots.txt or by other means, we do not read the page.
- For some checks we send selected sentences from the store's public pages, such as policies and product and collection texts, to an AI model at Anthropic. The model looks for contradictions, for example two different return periods.
How to identify TodasBot
All requests from TodasBot are signed with Web Bot Auth, which is based on HTTP Message Signatures (RFC 9421), including pages we load in a real browser. A signed request carries the Signature, Signature-Input and Signature-Agent headers.
- Signature-Agent:
https://portal.todas.se - Key directory: https://portal.todas.se/.well-known/http-message-signatures-directory
The directory holds our public key. You can use it to verify that a request comes from us. The response from the directory is itself signed with the same key.
Requests come from our servers at Railway and Vercel. We do not have fixed IP addresses, so the signature is the way to identify us.
Opting out
If your store is not connected to us, add these lines to your robots.txt:
User-agent: TodasBot
Disallow: /You can also email us at info@todas.se. TodasDatastudie has its own lines, listed on the page about that bot.
If your store is connected to us, the nightly monitoring is part of the service. If you do not want it, contact us and we will turn the monitoring off for your store.
Todas AB, Varberg, Sweden. Company registration number 559381-3271.