SEO přivede vhodné zájemce.
Pomůže vyhledávači pochopit, co čistíte a kde působíte. Člověk pak snáze najde konkrétní službu a důvody, proč oslovit právě vás.
Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Copyright 2020 The Space Grotesk Project Authors (https://github.com/floriankarsten/space-grotesk) This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Přejít na obsah průvodce
Plán pro Prémiové čištění: viditelnější web ve vyhledávání, rychlá reakce na příchozí zprávy a společný přehled zákazníků i zakázek. Všechno krok za krokem, bez nutnosti rozumět IT.
Pomůže vyhledávači pochopit, co čistíte a kde působíte. Člověk pak snáze najde konkrétní službu a důvody, proč oslovit právě vás.
Zeptá se na službu, obec, přibližnou plochu a fotografie. Když zákazník něco neví, konverzace může pokračovat a převezme ji člověk.
Na jedné kartě budou údaje, fotografie, nabídka, termín i další úkol. Dosavadní tabulky převedeme kontrolovaným importem.
Současný web je dostupný a má část technického základu. Kontrola ale potvrdila konkrétní nedostatky v popisu stránek, struktuře a práci s obsahem.
Metoda: veřejné HTTP načtení robots.txt, čtyř dílčích sitemap a všech 29 URL, rozbor původního HTML bez přihlášení a bez vykreslovacího testu. Opakovaná kontrola 15. 10. 2026, 23:12 SELČ. Výsledky se vztahují k tomuto okamžiku. Úplný seznam kontrolovaných adres ↓
Jednoduše: hlavní nadpis je jako název kapitoly v knize. Návštěvník i vyhledávač mají rychle poznat, o čem stránka je. H1 na úvodní stránce dnes pojmenovává sekci otázek; nevyjadřuje hlavní službu firmy.
Jednoduše: titulek je název výsledku ve vyhledávání. Popis je krátké vysvětlení pod ním. Dvě stránky se stejným názvem mohou být hůře rozlišitelné. Některé popisy se opakují i u rozdílných služeb; například ochrana fasády používá popis čištění.
Jednoduše: web má dvě „vizitky“ pro velmi podobný nebo stejný obsah. U vysokotlakého čištění a odstranění mechu jsou dostupné krátké i datované adresy. Obě verze odkazují canonicalem samy na sebe. U ochrany fasády jsou také dvě verze stejného tématu; obsah se liší.
Vysokotlaké čištění — krátká URL ↗Vysokotlaké čištění — datovaná URL ↗Vysvětlení canonicalu ↓
Jednoduše: krásné fotografie jsou přesvědčivé, ale bez kontextu se hůře pozná, kde se pracovalo, co bylo za problém a jaké řešení firma zvolila. U galerie fasád má 104 ze 107 obrázků prázdný atribut alt.
Jednoduše: strukturovaná data jsou štítky ve zdrojovém kódu. Pomáhají strojům rozpoznat firmu, její služby a související informace. V kontrolovaném HTML nebyly nalezeny typy LocalBusiness, Organization ani Service.
Zdrojový HTML dokument úvodu má 320 138 bajtů, odkazuje na 25 externích skriptů a 26 stylových souborů. To je důvod prověřit nepotřebné doplňky a načítání. Není to důkaz, že se web konkrétnímu uživateli načítá pomalu. Nejde o objem přenesený sítí ani součet všech obrázků.
Otevřít PageSpeed Insights — vložte adresu webu ↗Co jsou Core Web Vitals ↓
Dřívější kontrola upozornila na dostupný starý ceník na Webnode. Aktuální ověření tohoto bodu je uvedené v poznámce níže. Zároveň je vhodné rozhodnout, zda mají ve vyhledávání samostatnou hodnotu autorské a kategoriální archivy WordPressu.
Znovu ověřeno 15. 10. 2026: starý ceník vrací HTTP 200, obsahuje index/follow a canonical na sebe. To samo nedokazuje aktuální indexaci Googlu. Otevřít původní Webnode ceník — k ověření aktuálnosti ↗
Tabulka zachycuje zdrojový kód z 15. 10. 2026. „Popis ano“ znamená přítomnost meta description, nikoli potvrzení jeho kvality. Shodné titulky jsou označené zvlášť.
Zobrazeno 29 adres.
| Adresa / titulek | HTTP | Počet H1 | Meta popis | Titulek |
|---|---|---|---|---|
| /2025/07/29/vysokotlake-cisteni/ ↗Vysokotlaké čištění - Prémiové čištění | 200 | 2 | Ano | Stejný na 2 URL |
| /2025/07/29/ochrana-fasady/ ↗Ochrana fasády - Prémiové čištění | 200 | 1 | Ano | Stejný na 2 URL |
| /2025/07/29/odstraneni-mechu-z-fasady/ ↗Odstranění mechu z fasády - Prémiové čištění | 200 | 1 | Ano | Stejný na 2 URL |
| / ↗Prémiové čištění - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /cisteni-kobercu/ ↗Čištění koberců - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /cisteni-sedacek/ ↗Čištění sedaček - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /impregnace-na-betonovou-dlazbu/ ↗Impregnace na betonovou dlažbu - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /ochrana-fasady/ ↗Ochrana fasády - Prémiové čištění | 200 | 1 | Ano | Stejný na 2 URL |
| /kontaktni-formular/ ↗Kontaktní formulář - Prémiové čištění | 200 | 0 | Chybí | Jedinečný v souboru |
| /impregnace-na-zamkovou-dlazbu/ ↗Impregnace na zámkovou dlažbu - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /impregnace-strechy/ ↗Impregnace střechy - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /cisteni/ ↗Čištění - Prémiové čištění | 200 | 0 | Chybí | Jedinečný v souboru |
| /cisteni-fasady/ ↗Čištění fasády - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /cisteni-zamkove-dlazby/ ↗Čištění zámkové dlažby - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /cisteni-strech/ ↗Čištění střech - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /odstraneni-mechu-z-fasady/ ↗Odstranění mechu z fasády - Prémiové čištění | 200 | 1 | Ano | Stejný na 2 URL |
| /vysokotlake-cisteni/ ↗Vysokotlaké čištění - Prémiové čištění | 200 | 1 | Ano | Stejný na 2 URL |
| /reference/ ↗Reference - Prémiové čištění | 200 | 0 | Chybí | Jedinečný v souboru |
| /ochrana-osobnich-udaju/ ↗Ochrana osobních údajů - Prémiové čištění | 200 | 1 | Chybí | Jedinečný v souboru |
| /kontakt/ ↗Kontakt - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /casto-kladene-dotazy/ ↗Často kladené dotazy - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /impregnace-fasady/ ↗Impregnace fasády - Prémiové čištění | 200 | 1 | Ano | Jedinečný v souboru |
| /o-nas/ ↗O nás - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /reference-cisteni-zamkove-dlazby/ ↗Reference čištění zámkové dlažby - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /cenik/ ↗Ceník - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /reference-cisteni-fasady/ ↗Reference čištění fasády - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /impregnace/ ↗Impregnace - Prémiové čištění | 200 | 0 | Ano | Jedinečný v souboru |
| /category/nezarazene/ ↗Nezařazené Archivy - Prémiové čištění | 200 | 1 | Chybí | Jedinečný v souboru |
| /author/copywriting4weiron/ ↗Copywriting Weiron, Autor na Prémiové čištění | 200 | 1 | Chybí | Jedinečný v souboru |
Nejde jen doplnit několik polí. Potřebujeme propojit obsah, strukturu, důvěryhodné realizace, techniku a měření toho, co lidé skutečně poptávají.
premiovecisteni.cz › cisteni-fasady
Odstranění řas a nečistot z fasád podle stavu povrchu. Podívejte se na realizace a pošlete fotografie pro individuální posouzení.
| Oblast | Konkrétní práce | Jak poznáme dokončení |
|---|---|---|
| Struktura služeb | Hlavní samostatné stránky pro fasády, střechy, dlažbu a další skutečně poskytované služby. Odlišení čištění a impregnace. | Každá důležitá služba má jasný účel, text, odkaz z navigace a vlastní URL. |
| Realizace a lokality | Výběr zakázek, věcné popisy, fotografie a návaznost na služby. Skutečná oblast dojezdu. | Návštěvník pozná místo, zadání a výsledek; nevznikají prázdné lokální kopie. |
| Google a mapy | Přístup do Search Console, kontrola indexace, ověření firemního profilu, správné kontakty, služby a oblasti působení. | Máme dostupná data a ověřené nastavení, nikoli jen založené účty. |
| Měření poptávek | Odlišení dokončeného formuláře, kliknutí na telefon a skutečně přijaté poptávky. Zachování zdroje v CRM tam, kde je dostupný a oprávněný. | V reportu nejsou návštěvy zaměněné za zákazníky ani kliknutí na telefon za uskutečněné hovory. |
| Průběžné zlepšování | Sledování dotazů a vstupních stránek, doplňování odpovědí a referencí podle skutečného zájmu. | Pravidelný srozumitelný přehled: co se změnilo, jaké máme výsledky a co uděláme dál. |
URL ze sitemap, důležité stránky z Search Console a případné odkazy zvenčí. Ke každé přiřadíme odpovídající novou stránku.
Trvalé přesměrování staré adresy na nejbližší relevantní obsah. Ne hromadně vše na úvod. Opravíme interní odkazy, canonical a sitemap.
Odešleme novou sitemap, ověříme důležité URL, chyby a měření. Sledujeme indexaci i provoz; přechod může způsobit dočasné kolísání.
Jde zatím o prototyp, který ukazuje navržený vizuální styl a hlavní interakce. Podstránky, podrobnosti o službách a další informace doplníme v další fázi přípravy webu.
Hero sekce se při scrollování postupně čistí lokálními tahy. Sekce „Náš přístup“ vypráví tři kroky a střídá odpovídající fotografie.
Adresa prototypu: premiovecisteni.scorpynex.com ↗
Návrh je oddělený od současného veřejného webu. Zatím nemá ostré CRM napojení; poptávkový průvodce otevírá e-mailovou aplikaci. Mobilní hero má zapracované úpravy, ale před ostrým nasazením je potřeba vizuální test na reálném Androidu a iPhonu. Ilustrační fotografie jsou odlišené od skutečných referencí.
Návrh: https://premiovecisteni.scorpynex.com
Chatbot je automatický asistent. Jeho úkolem je získat podklady a předat je týmu. Zákazník zůstává v prostředí Facebooku nebo Instagramu, které už zná.
Modelový příklad: čištění fasády v Havířově. Klikáním uvidíte, které informace se průběžně doplní. Fotografie i zákazník jsou pouze ilustrační; žádný přenos mimo tuto stránku neprobíhá.
| Situace | Jak se má systém zachovat |
|---|---|
| Zákazník dodá další fotku | Doplní stejnou otevřenou poptávku. Nesmí kvůli každé zprávě vzniknout nová zakázka. |
| Stejná událost přijde dvakrát | Rozpozná stejné ID a neprovede stejný zápis podruhé. To je ochrana proti duplicitám. |
| CRM je dočasně nedostupné | Požadavek zůstane ve frontě, přenos se zopakuje a při problému vznikne upozornění. „Uloženo“ se ukáže až po potvrzení CRM. |
| Člověk převezme konverzaci | Automatické odpovědi se pozastaví, aby pracovník a robot neodpovídali proti sobě. |
| Stejné jméno na FB a IG | Účty se nesloučí jen podle jména. Potvrdí se kontakt a případné propojení zkontroluje pracovník. |
| Zákazník opraví odhad | Nový odhad se zapíše s historií. Už schválenou cenu nebo potvrzený rozsah nesmí volná zpráva automaticky přepsat. |
Schválený konverzační scénář sbírá odpovědi. Pomocí externího HTTPS požadavku je předá našemu CRM. Předem se ověří tarif, dostupné přílohy, pole a podpora obou účtů.
Více kontroly nad chováním, ale také více vývoje, schvalování, údržby a monitoringu. Je potřeba odpovídající účet, přístupová oprávnění a podle režimu aplikace schválení Meta.
Pevné otázky vs. AI: základ může mít připravené otázky a tlačítka. Pochopení volného textu, jako „fasáda v Havířově, tak sto metrů“, je samostatná rozšířená schopnost. AI musí vracet strukturovaný návrh, rozlišovat nejistotu a být otestovaná. Do CRM nesmí zapisovat libovolné instrukce z textu zákazníka.
Rozsah tohoto návrhu: příchozí soukromé zprávy. Správa placených reklam, hromadné marketingové rozesílky, veřejné komentáře a kompletní import starých konverzací se řeší zvlášť. Telefon ani e-mail uživatele nejsou automaticky dostupné jen proto, že firmě napsal.
Představte si přehlednou kartotéku, která se dá vyhledávat, doplňovat z mobilu a sdílet v týmu podle oprávnění. Každý vidí, co má udělat dál.
Jméno, společnost, poskytnuté kontakty, případné fakturační údaje a historie zakázek. Jeden zákazník může mít více adres a více samostatných realizací.
Služba, místo realizace, výměra, fotografie, cenové nabídky, termín, odpovědný člověk, stav a další krok. Fotky střechy se nemíchají s dlažbou stejného zákazníka.
Názvy stavů přizpůsobíme firmě. „Práce dokončena“, „předáno zákazníkovi“ a „zaplaceno“ jsou odlišné informace. Odmítnuté a odložené poptávky mají vlastní důvod uzavření.
| Funkce | Příklad v každodenním provozu | Přínos |
|---|---|---|
| Další krok a odpovědnost | „Zítra zavolat a ověřit přístup k vodě.“ Úkol má přiřazeného pracovníka. | Je jasné, kdo případ posune dál. |
| Fotografie u zakázky | Příchozí podklady a oddělené fotky před / po. | Není nutné hledat správné snímky v několika chatech. |
| Verze nabídky | Změna rozsahu vytvoří novou verzi. Zůstane dohledatelné, kterou zákazník přijal. | Přehled o domluvené ceně a práci. |
| Kalendář a posádka | Potvrzený výjezd má adresu, pracovníky a potřebné vybavení. | Snazší příprava a upozornění na kolize. |
| Předání a úhrada | Záznam výsledku, předávací dokument a stav faktury. | Dokončení práce se nezamění za zaplacení. |
| Přehled výsledků | Počet nových poptávek, odeslaných nabídek, přijatých zakázek a zdrojů zájmu. | Rozhodování podle skutečné evidence, ne pocitu. |
Přesné role a rozsah se domluví při návrhu. Každý dostane vlastní přístup, aby bylo dohledatelné, kdo co změnil.
Google Sheets může být dosavadní evidence. Přenosový skript projde vybrané řádky, zkontroluje je a předá je do připraveného vstupu CRM.
Připravíme kopii tabulky, zkušebně přeneseme několik záznamů a po kontrole převedeme dohodnutý rozsah. Pak se hlavní evidence přesune do CRM. Původní tabulka zůstane jako archiv podle dohody.
Doporučený začátekPo dobu přechodu se nové a změněné řádky mohou pravidelně kontrolovat, například přibližně po pěti minutách. Je potřeba určit, kdo kam zapisuje a kdy tento přechodný režim skončí.
Samostatně odsouhlasený režim| Sloupec v Sheets | Jednoduchý příklad | Význam v CRM |
|---|---|---|
| ZdrojoveID | Trvalý identifikátor; skript ho při ostrém přenosu doplní. | Vazba na původní záznam. Nepřepisovat ani kopírovat do nové zakázky. |
| Jmeno | Modelový zákazník | Návrh kontaktu. Samotné jméno nestačí ke sloučení lidí. |
| Telefon / Email | Poskytnutý kontakt; e-mail např. zakaznik@example.com | Možnost navázat komunikaci. Šablona vyžaduje alespoň jeden kontakt. |
| Sluzba / Obec | Čištění fasády / Havířov | Co a kde zákazník potřebuje. Obě hodnoty jsou v této šabloně povinné. |
| PlochaOd / PlochaDo | 80 / 120 | Odhad intervalu v m², ne ověřená výměra. Pokud ji neznáme, obě buňky prázdné. |
| Poznamka | Znečištění na severní straně domu. | Původní doplňující informace zákazníka. |
| OdkazNaFotografie | Soukromý HTTPS odkaz na složku | Odkaz jako podklad. Tento skript soubory nestahuje ani jim nemění přístupová práva. |
| CRM_ID | ID vrácené potvrzeným přenosem | Doklad, ke kterému importnímu záznamu řádek patří. |
| ImportHash | Otisk přenesených údajů | Rozpozná, zda se obsah změnil; stejný obsah se nemusí znovu posílat. |
| ImportStav / ImportCas | Přeneseno do návrhu CRM / čas | Viditelný výsledek a čas potvrzení. Chyba není vydávána za úspěch. |
Číslo řádku nestačí, protože se může změnit řazení. CRM musí mít jedinečnou vazbu na zdroj a opakovaný požadavek přijmout bezpečně jen jednou.
Chybějící obec nebo neplatný e-mail nezastaví každou další poptávku. Řádek dostane srozumitelnou chybu a po opravě se může zpracovat znovu.
Nestačí „skript doběhl“. Sečteme přenesené, přeskočené a chybné záznamy a otevřeme vzorek karet. Ověříme diakritiku, odhady i kontakty.
Před hromadným během se domluví přestávka v úpravách a řazení tabulky. Technický zámek skriptu brání souběhu skriptů, nikoli ručním zásahům lidí. Kopie tabulky má jiné ID zdroje; její import se proto nesmí spouštět bez dohodnutého postupu, jinak by mohla představovat nový zdroj dat.
Google Apps Script je malý program běžící u Google Sheets. Níže je připravená šablona včetně kontroly dat, označování výsledků, opakování přenosu a ochrany před souběhem.
Poptavky. Do prvního řádku vložíme níže uvedené názvy. Jde o šablonu, kterou vývojář upraví podle skutečné tabulky; telefon a ID nastavíme jako text.kontrolaImportu vypíše počty a čísla chybných řádků v protokolu spuštění. Nic neodesílá a nepřepisuje tabulku. Google při prvním oprávněném spuštění vyžádá potřebný přístup.DRY_RUN na false a spustíme importDoCRM. Zkontrolujeme vrácené CRM_ID a karty v cílovém systému.zapnoutPravidelnyImport založí přibližný pětiminutový interval. Běží pod účtem, který spouštěč vytvořil, a podléhá limitům Googlu. vypnoutPravidelnyImport vypne spouštěče této funkce vytvořené daným účtem.Pořadí sloupců může být jiné; důležité jsou přesné a jedinečné názvy. Technické sloupce na konci patří skriptu. První řádek bez diakritiky usnadňuje spolehlivé mapování.
ZdrojoveID Jmeno Telefon Email Sluzba Obec PlochaOd PlochaDo Poznamka OdkazNaFotografie CRM_ID ImportHash ImportStav ImportCas| Vlastnost skriptu | Co do ní patří |
|---|---|
SPREADSHEET_ID | ID skutečné tabulky z adresy mezi /d/ a následujícím lomítkem. |
SHEET_NAME | Poptavky, případně jiný přesný název listu. |
CRM_IMPORT_URL | Skutečná adresa CRM zakončená /api/imports/google-sheets. Připraví vývojář; žádná taková adresa není tímto průvodcem zprovozněna. |
CRM_IMPORT_TOKEN | Omezený serverový klíč jen pro import. Nikoli univerzální administrátorský klíč databáze. Přístup ke skriptu a jeho vlastnostem mají jen oprávnění lidé. |
DRY_RUN | true pro kontrolu. Pouze hodnota false povoluje přenos. Chybějící vlastnost znamená kontrolní režim. |
API je vstupní místo, kterým si programy předávají údaje. Tuto část implementuje Scorpynex na straně CRM. Samotný skript její existenci nenahradí.
POST /api/imports/google-sheets, ověřit omezený token a zkontrolovat velikost i strukturu dat.externalId na kombinaci ID tabulky, ID listu a trvalého ZdrojoveID. V databázi vynutit jedinečnost tohoto zdroje.Idempotency-Key atomicky se zápisem. Po timeoutu a opakování stejného požadavku vrátit stejné potvrzení, nikoli založit další kartu.mode: import_draft uloží návrh / zdrojové podklady. Automaticky nepřepíše ověřené údaje, schválenou cenu, termín ani ruční stav zakázky.{"status":"applied","recordId":"imp_123"}. Pouhé přijetí do fronty není potvrzením dokončení.Význam odpovědí: 400/422 = opravit data; 401/403 = chybné oprávnění, zastavit; 409 = konflikt k vyřešení; 429 = omezení počtu požadavků; 5xx = dočasný problém serveru. Podrobné interní chyby ani tajné klíče se nemají vypisovat do tabulky.
{
"schemaVersion": 1,
"mode": "import_draft",
"source": "google_sheets",
"externalId": "TABULKA:LIST:TRVALE_ID",
"revision": "otisk-prenaseneho-obsahu",
"sourceRow": 2,
"sourceSnapshot": {
"name": "Modelový zákazník",
"phone": "",
"email": "zakaznik@example.com",
"service": "Čištění fasády",
"city": "Havířov",
"areaMinM2": 80,
"areaMaxM2": 120,
"areaStatus": "customer_estimate",
"note": "Plochu zákazník odhaduje.",
"photoReference": ""
}
}Tento kontrakt je autorský návrh pro budoucí CRM, nikoli popis již existujícího endpointu. Skript má význam až společně s jeho implementací a testem na skutečné tabulce.
/**
* SCORPYNEX / Prémiové čištění — integrační vzor, 15. 10. 2026.
* Vyžaduje CRM endpoint podle smlouvy popsané v HTML průvodci.
* Toto není připojení k existujícímu CRM. Výchozí režim nic neodesílá.
* Script Properties: SPREADSHEET_ID, SHEET_NAME, CRM_IMPORT_URL,
* CRM_IMPORT_TOKEN, DRY_RUN (výchozí true; pro ostrý import false).
* Během ostrého přenosu tabulku neupravujte ani neřaďte.
*/
const IMPORT_INPUT = ['ZdrojoveID','Jmeno','Telefon','Email','Sluzba','Obec',
'PlochaOd','PlochaDo','Poznamka','OdkazNaFotografie'];
const IMPORT_OUTPUT = ['CRM_ID','ImportHash','ImportStav','ImportCas'];
function onOpen() {
SpreadsheetApp.getUi().createMenu('Scorpynex → CRM')
.addItem('Zkontrolovat data (bez odeslání)', 'kontrolaImportu')
.addItem('Spustit přenos podle nastavení', 'importDoCRM')
.addToUi();
}
function nastaveniImportu_() {
const props = PropertiesService.getScriptProperties();
const id = props.getProperty('SPREADSHEET_ID');
const name = props.getProperty('SHEET_NAME') || 'Poptavky';
if (!id) throw new Error('Nastavte SPREADSHEET_ID ve vlastnostech skriptu.');
const sheet = SpreadsheetApp.openById(id).getSheetByName(name);
if (!sheet) throw new Error('List ' + name + ' neexistuje.');
const headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getDisplayValues()[0].map(v=>v.trim());
const map = {};
headers.forEach((v,i)=>{
if (!v) return;
if (Object.prototype.hasOwnProperty.call(map,v)) throw new Error('Duplicitní sloupec: '+v);
map[v]=i;
});
IMPORT_INPUT.concat(IMPORT_OUTPUT).forEach(v=>{
if (!(v in map)) throw new Error('Chybí sloupec: '+v);
});
return {props,sheet,map,id,name};
}
function otisk_(value) {
return Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256,value,Utilities.Charset.UTF_8)
.map(b=>('0'+(b&255).toString(16)).slice(-2)).join('');
}
function cisloPlochy_(text) {
const s=String(text||'').trim().replace(/\s/g,'').replace(',','.');
if (!s) return null;
if (!/^\d+(\.\d+)?$/.test(s)) throw new Error('Plocha musí být číslo, nebo prázdná buňka.');
const n=Number(s);
if (!Number.isFinite(n)||n<=0||n>1000000) throw new Error('Zkontrolujte výměru.');
return n;
}
function zaznam_(row,map) {
const val=k=>String(row[map[k]]||'').trim();
if (!val('Sluzba')||!val('Obec')) throw new Error('Doplňte službu a obec.');
if (!val('Telefon')&&!val('Email')) throw new Error('Doplňte telefon nebo e-mail; neúplné kontakty dořešte ručně.');
const email=val('Email').toLowerCase();
if (email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) throw new Error('Zkontrolujte e-mail.');
const phone=val('Telefon').replace(/[\s()\-]/g,'');
if (phone&&!/^\+?\d{9,15}$/.test(phone)) throw new Error('Zkontrolujte telefon včetně předvolby.');
const min=cisloPlochy_(val('PlochaOd')),max=cisloPlochy_(val('PlochaDo'));
if ((min===null)!==(max===null)) throw new Error('Vyplňte obě hranice plochy, nebo obě ponechte prázdné.');
if (min!==null&&max<min) throw new Error('PlochaDo nesmí být menší než PlochaOd.');
const photo=val('OdkazNaFotografie');
if (photo&&!/^https:\/\/[^\s]+$/i.test(photo)) throw new Error('Odkaz na fotografie musí začínat https://.');
const result={name:val('Jmeno'),phone,email,service:val('Sluzba'),city:val('Obec'),
areaMinM2:min,areaMaxM2:max,areaStatus:min===null?'unknown':'customer_estimate',
note:val('Poznamka'),photoReference:photo};
if (JSON.stringify(result).length>20000) throw new Error('Záznam je příliš dlouhý; zkraťte poznámku.');
return result;
}
function radky_(cfg) {
const count=cfg.sheet.getLastRow()-1;
if (count<=0) return [];
if (count>5000) throw new Error('Nad 5000 řádků použijte dávkový import připravený vývojářem.');
const rows=cfg.sheet.getRange(2,1,count,cfg.sheet.getLastColumn()).getDisplayValues();
const seen=new Set();
rows.forEach(row=>{
const id=String(row[cfg.map.ZdrojoveID]||'').trim();
if (!id) return;
if (!/^[a-zA-Z0-9_-]{1,100}$/.test(id)) throw new Error('ZdrojoveID obsahuje nepovolené znaky.');
if (seen.has(id)) throw new Error('Duplicitní ZdrojoveID: přenos zastaven před odesláním.');
seen.add(id);
});
return rows;
}
function prazdny_(row,map) {
return IMPORT_INPUT.filter(k=>k!=='ZdrojoveID').every(k=>!String(row[map[k]]||'').trim());
}
function kontrolaImportu() {
const cfg=nastaveniImportu_(), rows=radky_(cfg);
let valid=0; const errors=[];
rows.forEach((row,i)=>{
if (prazdny_(row,cfg.map)) return;
try { zaznam_(row,cfg.map);valid++; }
catch(e) { errors.push('Řádek '+(i+2)+': '+e.message); }
});
const result={platne:valid,chyby:errors,pocetRadku:rows.length,odeslano:0};
console.log(JSON.stringify(result)); // Jen počty a chyby, nikoli kontakty či token.
return result;
}
function odeslat_(url,token,payload,key) {
for (let attempt=0;attempt<3;attempt++) {
let response;
try {
response=UrlFetchApp.fetch(url,{method:'post',contentType:'application/json',
headers:{Authorization:'Bearer '+token,'Idempotency-Key':key},
payload:JSON.stringify(payload),muteHttpExceptions:true,followRedirects:false});
} catch(e) {
if (attempt===2) throw new Error('Síťová chyba; výsledek ověří další běh se stejným klíčem.');
Utilities.sleep(500*Math.pow(2,attempt));continue;
}
const code=response.getResponseCode();
if (code>=200&&code<300) {
let data;
try {data=JSON.parse(response.getContentText());} catch(e){throw new Error('CRM nevrátilo platné JSON potvrzení.');}
// HTTP 202 / přijetí do fronty se samo o sobě nepovažuje za uložený záznam.
if (data.status!=='applied'||typeof data.recordId!=='string'||
!/^[a-zA-Z0-9_-]{1,100}$/.test(data.recordId)) throw new Error('Chybí potvrzení skutečného uložení do CRM.');
return data;
}
if ((code===429||code>=500)&&attempt<2) {Utilities.sleep(500*Math.pow(2,attempt));continue;}
const error=new Error('CRM HTTP '+code+'; záznam nebyl označen jako přenesený.');
error.stop=code===401||code===403||code===429;
throw error;
}
throw new Error('Přenos se nepodařilo potvrdit.');
}
function importDoCRM() {
const cfg=nastaveniImportu_();
// Bez výslovného false zůstává zapnutá kontrola bez zápisu a bez sítě.
if (cfg.props.getProperty('DRY_RUN')!=='false') return kontrolaImportu();
const url=cfg.props.getProperty('CRM_IMPORT_URL')||'';
const token=cfg.props.getProperty('CRM_IMPORT_TOKEN')||'';
if (!/^https:\/\/[^\s?#@]+\/api\/imports\/google-sheets$/.test(url)||url.includes('.example')||!token)
throw new Error('Vývojář musí nastavit skutečnou HTTPS adresu CRM a omezený importní token.');
const lock=LockService.getScriptLock();
if (!lock.tryLock(1000)) return {preskoceno:'Jiný běh právě importuje.'};
let applied=0,skipped=0,errors=0,stop=false;
const start=Date.now();
try {
const rows=radky_(cfg);if (!rows.length) return {applied,skipped,errors};
const cursorKey='CURSOR_'+cfg.sheet.getSheetId();
let cursor=Number(cfg.props.getProperty(cursorKey)||0);
if (!Number.isInteger(cursor)||cursor<0) cursor=0;
cursor%=rows.length;
let visited=0;
while (visited<rows.length&&applied+errors<25&&Date.now()-start<240000&&!stop) {
const index=(cursor+visited)%rows.length, rowNumber=index+2, row=rows[index];visited++;
if (prazdny_(row,cfg.map)) continue;
const write=(key,value)=>cfg.sheet.getRange(rowNumber,cfg.map[key]+1).setValue(value);
try {
const snapshot=zaznam_(row,cfg.map),hash=otisk_(JSON.stringify(snapshot));
let sourceId=String(row[cfg.map.ZdrojoveID]||'').trim();
if (row[cfg.map.CRM_ID]&&!sourceId) throw new Error('U přeneseného řádku chybí ZdrojoveID. Obnovte původní ID, nevytvářejte nové.');
if (row[cfg.map.ImportHash]===hash&&row[cfg.map.CRM_ID]) {skipped++;continue;}
if (!sourceId) {sourceId=Utilities.getUuid();write('ZdrojoveID',sourceId);SpreadsheetApp.flush();}
const externalId=cfg.id+':'+cfg.sheet.getSheetId()+':'+sourceId;
const payload={schemaVersion:1,mode:'import_draft',source:'google_sheets',externalId,
revision:hash,sourceRow:rowNumber,sourceSnapshot:snapshot};
const result=odeslat_(url,token,payload,otisk_(externalId+':'+hash));
const current=cfg.sheet.getRange(rowNumber,1,1,cfg.sheet.getLastColumn()).getDisplayValues()[0];
if (String(current[cfg.map.ZdrojoveID]).trim()!==sourceId)
throw Object.assign(new Error('Během přenosu se přesunuly řádky. Zastaveno; zkontrolujte evidenci.'),{stop:true,noJournal:true});
// CRM ukládá importní návrh. Upravená tabulka vyvolá další revizi při příštím běhu.
write('CRM_ID',result.recordId);write('ImportHash',hash);
write('ImportStav','Přeneseno do návrhu CRM');write('ImportCas',new Date().toISOString());applied++;
} catch(e) {
errors++;stop=!!e.stop;
if (!e.noJournal) write('ImportStav','Chyba: '+e.message);
}
}
cfg.props.setProperty(cursorKey,String((cursor+visited)%rows.length));
SpreadsheetApp.flush();
} finally {lock.releaseLock();}
console.log(JSON.stringify({applied,skipped,errors}));
if (errors) throw new Error('Import: '+errors+' chyb. Podrobnosti jsou ve sloupci ImportStav.');
return {applied,skipped,errors};
}
function zapnoutPravidelnyImport() {
// Spusťte jen jednou pod určeným firemním účtem, až po úspěšném pilotu.
const cfg=nastaveniImportu_();
if (cfg.props.getProperty('DRY_RUN')!=='false') throw new Error('Nejdřív schvalte pilot a nastavte DRY_RUN=false.');
const exists=ScriptApp.getProjectTriggers().some(t=>t.getHandlerFunction()==='importDoCRM');
if (!exists) ScriptApp.newTrigger('importDoCRM').timeBased().everyMinutes(5).create();
}
function vypnoutPravidelnyImport() {
ScriptApp.getProjectTriggers().filter(t=>t.getHandlerFunction()==='importDoCRM').forEach(t=>ScriptApp.deleteTrigger(t));
}
Tato ukázka neprovádí mazání CRM dat, obousměrnou synchronizaci ani stahování fotografií. Nezačne běžet stažením stránky nebo kódu. Vyžaduje instalaci do Apps Script, oprávnění a konfiguraci. Pro velké evidence nad 5 000 řádků se připraví jiný dávkový postup.
| Co vidíte | Co to znamená | Další krok |
|---|---|---|
| Chybí sloupec | Název hlavičky nesedí se šablonou. | Opravit název, nemazat ostatní data. |
| Chybí kontakt / obec | Řádek nemá potřebné minimum pro tuto šablonu. | Doplnit údaj, nebo případ dořešit ručně. Nevymýšlet kontakt. |
| Duplicitní ZdrojoveID | Dva řádky mají stejné trvalé ID. | Zastavit a určit, zda jde o kopii nebo novou poptávku. Nepřidělovat nové ID již importované zakázce naslepo. |
| HTTP 401 / 403 | CRM nepovolilo přístup. | Vývojář zkontroluje token a oprávnění. Žádné opakování se změněnými zákaznickými daty. |
| Síťová chyba / HTTP 5xx | Přenos selhal nebo není jisté potvrzení. | Po opravě opakovat se stejnou identitou a otiskem. CRM musí zabránit duplikaci. |
| Chybí potvrzení uložení | Server nevrátil požadovaný stav a ID. | Prověřit odpověď CRM; řádek se neoznačí jako úspěšný. |
| Přesun řádků během přenosu | Někdo tabulku seřadil nebo změnil. | Zastavit úpravy, ověřit záznamy podle ZdrojoveID a pokračovat až po kontrole. |
Při chybě ostrého běhu skript zapíše dostupný stav k řádku a skončí chybovým souhrnem. U pravidelného spouštění se sleduje přehled spuštění a upozornění Google; nespoléháme jen na to, že v tabulce nevidíme červenou buňku.
Google: HTTP požadavky ↓Nastavení skriptu ↓Automatické spouštění ↓Provozní limity ↓
Každá etapa má konkrétní výstup. Nejprve potvrdíme, co firma potřebuje, potom propojujeme jednotlivé části a kontrolujeme výsledek.
| Etapa | Co uděláme | Výsledek pro firmu |
|---|---|---|
| 1 / Podklady a pravidla | Projít anonymizované poptávky, tabulku, služby, role, způsob nabídky a plánování. Ověřit účty a přístupy. | Schválený rozsah a názvy stavů. Víme, co se automatizuje a kdo schvaluje výjimky. |
| 2 / Web a SEO | Dokončit strukturu, obsah a důležité SEO stránky, měření, přesměrování a testy. | Web připravený na ostré spuštění s návazností na původní adresy. |
| 3 / Základ CRM | Kontakty, zakázky, úkoly, fotografie, nabídky a oprávnění v dohodnutém rozsahu. | První funkční celek, který tým vyzkouší na modelových případech. |
| 4 / Propojení a import | Chatbot, ověřené předávání údajů, chybové stavy a kontrolovaný import ze Sheets. | Jedna poptávka projde od zprávy do správné karty bez ručního přepisování. |
| 5 / Pilot a předání | Řízené používání, opravy, školení, obnova záloh, provozní dohled a export. | Potvrzený pracovní postup a jasný způsob podpory. |
Předchozí studie počítala orientačně s 8–12 týdny pro propojené CRM a automatizaci včetně pilotu. Jde o plánovací rámec, nikoli potvrzený termín této dodávky. Dostupnost podkladů, schválení Meta a finální rozsah mají na termín vliv. Cena a provozní paušál se stanoví samostatnou nabídkou.
Pracovní seznam pro schůzku. Zaškrtnutí se ukládá pouze v tomto prohlížeči, pokud to dovoluje; neposílá potvrzení dodavateli.
Pojmy, se kterými se při společné práci setkáme. U každého stačí vědět, jak vám pomůže v praxi.
Úpravy webu a jeho obsahu, aby ho vyhledávače lépe chápaly a lidé našli relevantní odpovědi.
Zařazení stránky do evidence vyhledávače. Zařazená stránka ještě nemusí být nahoře ve výsledcích.
Název hlavního tématu stránky. Má popisovat, o čem stránka skutečně je.
Název stránky a stručný popis ve zdrojovém kódu. Google je může použít pro výsledek hledání, nebo je upravit.
Signál vyhledávači, kterou adresu považujeme za hlavní verzi podobného obsahu. Sám návštěvníka nepřesměruje.
Trvalé převedení návštěvníka a vyhledávače ze staré adresy na odpovídající novou.
Mapa adres určená vyhledávačům a pravidla procházení webu. Nejsou zárukou indexace ani způsobem ochrany tajných dat.
Nástroj Google pro kontrolu, jak vyhledávač vidí váš web a přes jaké dotazy na něj lidé přicházejí.
Společná evidence zákazníků, poptávek a zakázek. U každého případu vidíte podklady i další krok.
Dohodnutý vstup pro výměnu informací mezi programy. Skript pošle data a CRM vrátí výsledek.
Automatické oznámení události jinému systému. Například „dorazila nová zpráva“.
Přístupový klíč pro program. Musí mít omezená oprávnění a zůstat mimo veřejnou stránku.
Ochrana, díky které opakování stejného požadavku nevytvoří stejnou zakázku podruhé.
Zkušební kontrola bez skutečného přenosu. Pomůže odhalit chyby před zápisem do CRM.
Krátký technický podpis obsahu. Když se údaje změní, změní se i otisk a skript změnu pozná.
Pravidlo, které spustí program v určeném intervalu nebo po události.
Odkazy označené šipkou ↗ se otevírají v novém panelu. U nástrojů Google je potřeba přístup k vlastnímu účtu a správné službě.
SEO nálezy vycházejí z vlastní veřejné kontroly webu. Níže jsou primární zdroje k doporučeným postupům a rozhraním. Pravidla služeb se mohou měnit; při implementaci se znovu ověří konkrétní oprávnění a dostupné funkce.